3d三角学方程

Jou*_*man 6 javascript math 3d geometry trigonometry

我正在尝试编写一个小的"透视"javascript应用程序,它允许我通过一组居住在3d空间中的x,y,z点.

我有一个相机的概念,它改变了它的旋转和xyz位置,而每个点保持一个恒定的xyz点.

然后,我有一组方程式,计算出如何调整相机的x,y,z坐标以便直接向前飞行.x,y,z调节显然取决于相机的旋转.

它几乎可以工作,但在某些"态度"下,摄像机位置调整出错并且飞行路径不会直线前进,而是以某个角度熄灭,甚至是反转.计算投影的公式如下:

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);
Run Code Online (Sandbox Code Playgroud)

显然我的方程式并不完全正确.谁能告诉我哪里出错了?非常感谢和感谢.

Gha*_*uni 6

你的方程式中有一些错误.(它们在2d情况下有效,但在3d中无效)

当你计算

sx = Math.sin(cameraView.rotX);
Run Code Online (Sandbox Code Playgroud)

它在2d确实有意义:

sx = Math.sin(cameraView.rotX) = x/SQRT(y*y + x*x) 
Run Code Online (Sandbox Code Playgroud)

其中(x,y)是摄像机的位置.但在3d中它更复杂: 在此输入图像描述

在3d中:

在此输入图像描述

在此输入图像描述

在此输入图像描述

从而获得笛卡尔坐标:

在此输入图像描述

在此输入图像描述

在此输入图像描述

您也可以使用3d矩阵执行旋转.