我必須通過UP和方向矢量(它們都相互垂直)找到相機的旋轉軸和角度。我有旋轉相機的UP和方向矢量的初始位置和最終位置。我想找到相機的旋轉軸和角度。我正在爲我的項目使用C#。我是這個3D旋轉的新手。所以如果你發現他們很愚蠢,請原諒我的問題。從初始和最終旋轉四元數獲得旋轉軸
1
A
回答
0
從方向(向前)載體˚F和向上矢量ü可以通過(F X US =)執行vector cross product得到側向量小號。所有三個向量現在都是正交的。你也應該通過對它們中的每一個進行歸一化來使它們正交。總之,這些矢量形成了一個標準正交基。
您現在有兩個這樣的基礎:從最初的相機方向和最終的相機方向開始。這兩個基礎都可以表示爲旋轉矩陣。旋轉矩陣是一個簡單的3×3矩陣,其中的3行分別爲:
- 正向矢量
- 向上矢量
- 側向量
例如,基質:
[[1 0 0]
[0 1 0]
[0 0 1]]
可能是您的初始相機方向在啓動時與其正向矢量,向上矢量和側向矢量點g分別朝向正x軸,y軸和z軸。
現在,您可以使用此algorithm將這兩個基準(M1和M2)轉換爲兩個單位四元數(Q1和Q2),其中注意潛在的問題,如零除。
此時,您有兩個單位四元數表示您的初始和最終攝像機方向。現在,您必須找到轉換Q1到Q2的四元數qT的,那就是:
q2 = qT * q1
q2 * q1^-1 = qT * (q1 * q1^-1) = qT
=> qT = q2 * q1^-1
知道,一個單位四元數的倒數等於其conjugate:
q1^-1 = q1* iif ||q1|| = 1
qT = q2 * q1^-1 = q2 * q1*
有單步左:extracting the axis and angle from quaternion qT:
angle = 2 * acos(qw)
x = qx/sqrt(1-qw*qw)
y = qy/sqrt(1-qw*qw)
z = qz/sqrt(1-qw*qw)
該角度當然以弧度給出。計算x,y和z時要注意除以零。這種情況在沒有旋轉或非常小的情況下會發生,因此您應該測試角度> epsilon,在這種情況下,您會選擇epsilon的角度非常小(例如1/10度),並且不計算向量是這樣的。
相關問題
- 1. 四元數三軸旋轉
- 2. Unity旋轉和四元數
- 3. 四元數旋轉x軸45度
- 4. 沿着軸旋轉四元數
- 5. 拆分四元數到軸旋轉
- 6. 四元數旋轉誤差
- 7. 四元數旋轉opengl
- 8. 四元數 - 旋轉到
- 9. 四元數對象旋轉
- 10. 四元數的旋轉?
- 11. 如何從Android中的旋轉矩陣中獲得四元數?
- 12. 從四元數到OpenGL旋轉
- 13. 使用旋轉四元數將3d矢量值旋轉到單個軸
- 14. 基於四元數的旋轉和樞軸位置
- 15. 旋轉圖像,並獲得旋轉
- 16. 從旋轉矩陣獲取有關y軸的旋轉
- 17. 初始加載時旋轉
- 18. WhirlyGlobe初始旋轉偏移
- 19. UIImage旋轉軸
- 20. 矩陣旋轉到四元數
- 21. java四元數三維旋轉實現
- 22. 旋轉矢量與四元數
- 23. 相機與四元數的旋轉
- 24. 關於glm四元數旋轉
- 25. 用四元數旋轉對象
- 26. 使用四元數去旋轉矢量
- 27. 用四元數旋轉模型
- 28. 如何縮放四元數的旋轉
- 29. 用四元數來防止繞某個軸旋轉
- 30. 在一個軸上旋轉一個四元數?
非常感謝您的回覆。這真的幫了我很多。算法將矩陣轉換爲四元數有一個小問題。我的軟件相機產生了一些向上的和方向的向量,這給出了一個不到一個矩陣的軌跡。當旋轉矩陣的軌跡小於1時,旋轉軸和角度計算會給出奇怪的值。你知道如何解決這個問題嗎? – user1304687 2012-04-06 07:43:57
請參閱第238行的函數:http://java.net/projects/vecmath/sources/svn/content/trunk/src/javax/vecmath/AxisAngle4f.java?rev = 144 如果解決了您的問題,請檢查此答案是否合適。 – gsimard 2012-04-10 14:47:11