2014-02-24 100 views
0

我使用鼠標在我的程序中控制相機旋轉(使用Directx 9.0c)。鼠標X控制攝像頭圍繞向上矢量旋轉,鼠標Y控制圍繞右向量的旋轉。旋轉計算如下: void Camera::RotateCameraUp(float angle) { D3DXMATRIX RoMatrix; D3DXMatrixRotationAxis(&RoMatrix, &vUp, angle); D3DXVec3TransformCoord(&vLook, &vLook, &RoMatrix); D3DXVec3TransformCoord(&vRight, &vRight, &RoMatrix); } void Camera::RotateCameraRight(float angle) { D3DXMATRIX RoMatrix; D3DXMatrixRotationAxis(&RoMatrix, &vRight, angle); D3DXVec3TransformCoord(&vLook, &vLook, &RoMatrix); D3DXVec3TransformCoord(&vUp, &vUp, &RoMatrix); } 假設圍繞向上或向右向量的旋轉不應導致圍繞「LookAt」向量的旋轉,但如果我將鼠標繞過一段時間並停止在起點處,則圍繞「 LookAt「矢量發生了。我認爲這是因爲計算時出現錯誤,但我不知道如何消除或控制它。任何想法?directx相機旋轉的錯誤控制?

+0

你可能想嘗試圍繞'(0,1,0)'在第一種方法。 –

+0

@NicoSchertler:事實上,我確實想旋轉一下vUp,但不是(0,1,0)。我在回覆cdoubleplusgood時解釋了我的錯誤。謝謝你的幫助 – user1411817

回答

0

這是一個常見問題。你應用了許多輪換,隨着時間的推移,舍入誤差總結。一段時間後,三個矢量vUp,vLookvRight不再標準化和正交。 我會使用以下兩種方法之一:

1. 不要存儲vLookvRight;相反,只需存儲2個角度。假設x是正確的,y是頂部,z是回來的,存儲a)視軸和xz平面之間的角度,以及b)xz平面上視軸投影和z軸平面之間的角度或x軸。根據鼠標移動更新這些角度,並從中計算出vLookvRight

2. 設置vRight的y分量爲0,因爲vRight應該位於xz平面中。然後對矢量進行重新正交化處理(你知道矢量應該彼此垂直並且長度爲1)。因此,計算新vLookvRight後,應用這些修正:

vRight.y = 0 
vRight = Normalize(vRight) 
vUp = Normalize(Cross(vLook, vRight)) 
vLook = Normalize(Cross(vRight, vUp)) 
+0

謝謝你的建議。我發現我犯的錯誤是「圍繞向上或向右旋轉的旋轉不應該導致圍繞外觀向量旋轉」。實際上,在角度α旋轉vUp後,角度β圍繞vRight旋轉後,我們只能通過圍繞角度-β旋轉vRight然後圍繞角度α旋轉vUp來回到原點狀態,但不能旋轉圍繞vUp角度-alpha,然後圍繞vRight旋轉角度-beta。所以當我繞着鼠標回到起點時,相機無法回到原始狀態。 – user1411817

+0

是的,尼科已經給出了正確的答案。我錯過了這一點。然而,矢量的非規範化也可能是一個真正的問題。 – cdoubleplusgood