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.






