2015-08-15 50 views
1

我在OpenGL 2.0(固定管道)中構建了一個lookAt相機。 我的相機跟蹤它的位置,看點和向上矢量。 直到現在我用下面的代碼通過一定量的偏航相機:以角度旋轉lookAt相機

void Camera::yaw(float amount) 
{ 
    Vector3 rightVec = getRight(); 
    lookAt.z += rightVec.z * amount; 
    lookAt.x += rightVec.x * amount; 
} 

這種方法似乎很好地工作時,我不在乎我到底有多少想偏航我的相機,但現在我想要將相機綁定到機器人的頭部,以便當機器人旋轉頭部時,相機會相應地偏斜。 我改變機器人的頭部角度的方法是保持其旋轉角度爲度,然後添加到該數字並使用glRotatef更改其旋轉角度。 所以現在爲了對齊我的相機和機器人,我需要我的相機yaw()函數來接受我想要添加的度數,並從中計算出新的lookAt值。 我試圖找出我自己的數學,但我找不到一個正確的解決方案。 我該如何改變我目前的偏航功能,以使用度數增量而不是隨機數量。

回答

0

你在這裏面臨的是以一個特定角度圍繞另一個點(位置)旋轉一個點(lookAt)的一般問題。這可以通過第一平移問題原點,圍繞原點旋轉,然後回翻譯來完成:

lookAt = translate(center) * rotate_y(angle) * translate(-center) * lookAt 

(假設轉換和rotate_y給予相應的平移/旋轉矩陣)。

當乘以寄託都在一起,一會得到這樣的:

  center.x + (lookAt.x - center.x) * cos(angle) + (lookAt.z - center.z) * sin(angle) 
lookAt = [ lookAt.y                   ] 
      center.z + (lookAt.z - center.z) * cos(angle) + (center.x - lookAt.x) * sin(angle) 

注意,所有的計算假設(如您的previouse也一樣),即向上向量= [0,1,0]。

+0

請你詳細說明如何在沒有平移和旋轉矩陣的情況下使用矢量數學做到這一點?位置和lookat由它們的三維座標給出。 –

+0

更新了答案,但如果您使用的是3D圖形,則應該真正學習如何使用矩陣。 – BDL

+0

我知道如何使用矩陣,它只是爲了圖形課程的最終項目,我不能包含任何數學庫,所以我自己實現了Vector類,而且我也不想實現矩陣。因爲它使用固定管道,所以我不需要所有渲染操作的矩陣類。 –