2011-03-27 147 views
6

我正试图写一个小的'透视'javascript应用程序,它允许我通过一组居住在3d空间中的x,y,z点飞行。3d三角函数方程

我有一个相机的概念,改变它的旋转和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); 

很明显我的方程式并不完全正确。谁能告诉我我要去哪里?非常感谢和感谢。

+0

你可以添加你的算法吗? – 2011-03-27 10:39:34

+2

计算三维坐标的标准方法是使用矢量/矩阵数学。有几个这样的JavaScript库。请参阅:http://blog.tojicode.com/2010/06/stupidly-fast-webgl-matricies.html – 2011-03-27 10:43:45

回答

6

您在方程中有一些错误。 (他们是在2D情况下有效,但不是在3D)

当你计算

sx = Math.sin(cameraView.rotX); 

这有一定道理的2D因为:

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

其中(x,y)是相机的位置。 但在3D它更复杂: enter image description here

在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矩阵进行旋转。

+0

所以,很抱歉,要模糊,但我如何将上面的公式转换为实际的js?另外,第二个三维方程似乎与第一个完全相同?非常感谢 – Journeyman 2011-03-27 11:27:51

+0

您只能使用最后三个方程。 r参数是SQRT(cameraView.z * cameraView.z + cameraView.y * cameraView.y + cameraView.x * cameraView.x) – 2011-03-27 11:30:46

+1

一个小问题 - 为什么要定义theta两次? – pimvdb 2011-03-29 19:22:19