2011-03-27 171 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