3D三角函数方程

6
我正在尝试编写一个小的“透视”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);

显然我的方程式还不够正确。有人能告诉我哪里错了吗?非常感谢和谢谢。

2
计算三维坐标的标准方法是使用向量/矩阵数学。JavaScript 有几个这样的库。请参见:http://blog.tojicode.com/2010/06/stupidly-fast-webgl-matricies.html - user180326
1个回答

6

您的方程式存在一些错误。(在2D情况下它们有效,但在3D情况下不行)

当您计算时:

sx = Math.sin(cameraView.rotX);

在二维环境中确实有意义,因为:
sx = Math.sin(cameraView.rotX) = x/SQRT(y*y + x*x) 

其中 (x, y) 是相机的位置。

但在 3D 中更加复杂:

enter image description here

enter image description here

enter image description here

因此,要获得笛卡尔坐标:

enter image description here

enter image description here

enter image description here

您也可以使用 3D 矩阵进行旋转。


非常抱歉,我可能有点迟钝,请问如何将您上面的方程式翻译成实际的js代码呢?另外,第二个3D方程似乎与第一个完全相同?非常感谢。 - Journeyman
你只需要使用最后三个方程式。其中,r参数为SQRT(cameraView.zcameraView.z + cameraView.ycameraView.y+cameraView.x*cameraView.x)。 - Ghassen Hamrouni
1
一个小问题 - 为什么你要定义两次theta? - pimvdb
在你的照片中,我不明白,在你的第二张图片(r = ...)中,x、y和z,它们是点的坐标还是什么?在你的最后一张图片中,x、y和z,它们是谁的?我真的需要帮助。 - Theodor Bischler
@TheodorBischler 是的,(x, y, z) 是该点的坐标。r 是该点与原点之间的距离。 - Ghassen Hamrouni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接