javascript - 3d-trigonometriekvation


Jag försöker skriva en liten 'perspektiv'-javascript-app som tillåter mig att flyga genom en uppsättning x,y,z-punkter som befinner sig i ett 3D-utrymme.

Jag har konceptet av en kamera som förändrar sin rotation och xyz-position, medan varje punkt behåller en konstant xyz-punkt.

Jag har då ett uppsättning ekvationer som beräknar hur kamerans x-, y- och z-koordinater ska justeras för att flyga rakt fram. Justeringarna av x, y och z beror uppenbarligen på kamerans rotation.

Det fungerar nästan, men vid vissa 'attityder' blir justeringen av kamerans position fel och flygbanan går inte rakt fram utan avviker i en vinkel, eller till och med går bakåt. Ekvationerna för att räkna ut projektionen är följande:

var directionFactor = 1;
if (direction == 'backward') directionFactor = -1;

    sx = Math.sin(cameraView.rotX);
    cx = Math.cos(cameraView.rotX);
    sy = Math.sin(cameraView.rotY);
    cy = Math.cos(cameraView.rotY);
    sz = Math.sin(cameraView.rotZ);
    cz = Math.cos(cameraView.rotZ);


    // Z-Axis
    ztrig = Math.sqrt((cx * cx) + (cy * cy)) * (cx * cy);
    cameraView.z = cameraView.z + directionFactor * 
                                           (Math.abs(airspeed / 15) * ztrig);

    // Y-Axis
    ytrig = Math.sqrt((sx * sx) + (cz * cz)) * (sx * cz);
    cameraView.y = cameraView.y + directionFactor *
                                            (Math.abs(airspeed / 15) *ytrig);

    // X-Axis
    xtrig = Math.sqrt((cz * cz) + (sy * sy)) * (cz * sy);
    cameraView.x = cameraView.x - directionFactor * 
                                             (Math.abs(airspeed / 15) * xtrig);

Uppenbarligen är mina ekvationer inte helt rätt. Kan någon tala om för mig var jag har fel? Mycket uppskattat och tack.

Svar #1

Du har några fel i dina ekvationer. (De är giltiga i 2D-fallet men inte i 3D)

när du räknar

sx = Math.sin(cameraView.rotX);

Det är meningsfullt i 2D eftersom:

sx = Math.sin(cameraView.rotX) = x/SQRT(y*y + x*x) 

där (x, y) är positionen för kameran. Men i 3d är det mer komplicerat :

Om 3d :

Så för att erhålla den kartesiska koordinaten :

Du kan också använda en 3D-matris för att utföra rotation.