2012-03-31 102 views
1

我必須通過UP和方向矢量(它們都相互垂直)找到相機的旋轉軸和角度。我有旋轉相機的UP和方向矢量的初始位置和最終位置。我想找到相機的旋轉軸和角度。我正在爲我的項目使用C#。我是這個3D旋轉的新手。所以如果你發現他們很愚蠢,請原諒我的問題。從初始和最終旋轉四元數獲得旋轉軸

回答

0

從方向(向前)載體˚F和向上矢量ü可以通過(F X US =)執行vector cross product得到側向量小號。所有三個向量現在都是正交的。你也應該通過對它們中的每一個進行歸一化來使它們正交。總之,這些矢量形成了一個標準正交基。

您現在有兩個這樣的基礎:從最初的相機方向和最終的相機方向開始。這兩個基礎都可以表示爲旋轉矩陣。旋轉矩陣是一個簡單的3×3矩陣,其中的3行分別爲:

  1. 正向矢量
  2. 向上矢量
  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度),並且不計算向量是這樣的。

+0

非常感謝您的回覆。這真的幫了我很多。算法將矩陣轉換爲四元數有一個小問題。我的軟件相機產生了一些向上的和方向的向量,這給出了一個不到一個矩陣的軌跡。當旋轉矩陣的軌跡小於1時,旋轉軸和角度計算會給出奇怪的值。你知道如何解決這個問題嗎? – user1304687 2012-04-06 07:43:57

+0

請參閱第238行的函數:http://java.net/projects/vecmath/sources/svn/content/trunk/src/javax/vecmath/AxisAngle4f.java?rev = 144 如果解決了您的問題,請檢查此答案是否合適。 – gsimard 2012-04-10 14:47:11