我使用鼠標在我的程序中控制相機旋轉(使用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相機旋轉的錯誤控制?
回答
這是一個常見問題。你應用了許多輪換,隨着時間的推移,舍入誤差總結。一段時間後,三個矢量vUp
,vLook
和vRight
不再標準化和正交。 我會使用以下兩種方法之一:
1. 不要存儲vLook
和vRight
;相反,只需存儲2個角度。假設x是正確的,y是頂部,z是回來的,存儲a)視軸和xz平面之間的角度,以及b)xz平面上視軸投影和z軸平面之間的角度或x軸。根據鼠標移動更新這些角度,並從中計算出vLook
和vRight
。
2. 設置vRight
的y分量爲0,因爲vRight
應該位於xz平面中。然後對矢量進行重新正交化處理(你知道矢量應該彼此垂直並且長度爲1)。因此,計算新vLook
和vRight
後,應用這些修正:
vRight.y = 0
vRight = Normalize(vRight)
vUp = Normalize(Cross(vLook, vRight))
vLook = Normalize(Cross(vRight, vUp))
謝謝你的建議。我發現我犯的錯誤是「圍繞向上或向右旋轉的旋轉不應該導致圍繞外觀向量旋轉」。實際上,在角度α旋轉vUp後,角度β圍繞vRight旋轉後,我們只能通過圍繞角度-β旋轉vRight然後圍繞角度α旋轉vUp來回到原點狀態,但不能旋轉圍繞vUp角度-alpha,然後圍繞vRight旋轉角度-beta。所以當我繞着鼠標回到起點時,相機無法回到原始狀態。 – user1411817
是的,尼科已經給出了正確的答案。我錯過了這一點。然而,矢量的非規範化也可能是一個真正的問題。 – cdoubleplusgood
- 1. Three.js相機旋轉錯誤
- 2. Three.js - 錯誤的軸或相機旋轉
- 3. 如何旋轉相機 - 相機旋轉
- 4. 預製內相機旋轉
- 5. 相機旋轉
- 6. Android相機意圖 - 內存不足錯誤和旋轉錯誤
- 7. 你如何反制旋轉的相機?
- 8. three.js:限制相機的旋轉
- 9. 相機控制器視圖的覆蓋層中的UIView旋轉
- 10. Unity相機旋轉
- 11. ZBarReaderViewController相機旋轉
- 12. Android相機旋轉
- 13. 相機旋轉pointerlockcontrols
- 14. Rajawali相機旋轉
- 15. Unity - 玩家的相機小孩無法控制地旋轉
- 16. A幀中的光滑相機旋轉(外觀控制)
- 17. 控制旋轉
- 18. 設備旋轉時旋轉相機
- 19. 如何修改相機旋轉帶軌跡球控制
- 20. 三個js球形設備控件限制相機旋轉
- 21. 通過鍵盤控制Babylon.js相機旋轉
- 22. 使用相機移動控制Webgl網格旋轉。 [three.js]
- 23. 從相機收到的位圖有錯誤的方向/旋轉
- 24. 錯誤的相機覆蓋尺寸的設備旋轉
- 25. iPad相機popover預覽錯誤的旋轉和縮放
- 26. 在相機中心旋轉相機
- 27. Android旋轉控制
- 28. OpenGL相機的相對旋轉
- 29. 重置手機上的相機旋轉
- 30. 相機像素旋轉
你可能想嘗試圍繞'(0,1,0)'在第一種方法。 –
@NicoSchertler:事實上,我確實想旋轉一下vUp,但不是(0,1,0)。我在回覆cdoubleplusgood時解釋了我的錯誤。謝謝你的幫助 – user1411817