2015-06-14 563 views
1

我一直在試圖弄清楚它們之間的區別,以及爲什麼ToEulerXYZ沒有得到正確的旋轉。四元數到EulerXYZ,如何區分負四元數和正四元數

使用MathGeoLib:

axisX:

x 0.80878228 float 
y -0.58810818 float 
z 0.00000000 float 

axisY:

x 0.58811820 float 
y 0.80877501 float 
z 0.00000000 float 

axisZ:

x 0.00000000 float 
y 0.00000000 float 
z 1.0000000 float 

代碼:

Quat aQ = Quat::RotateAxisAngle(axisX, DegToRad(30)) * Quat::RotateAxisAngle(axisY, DegToRad(60)) * Quat::RotateAxisAngle(axisZ, DegToRad(40)); 
float3 eulerAnglesA = aQ.ToEulerXYZ(); 

Quat bQ = Quat::RotateAxisAngle(axisX, DegToRad(-150)) * Quat::RotateAxisAngle(axisY, DegToRad(120)) * Quat::RotateAxisAngle(axisZ, DegToRad(-140)); 
float3 eulerAnglesB = bQ.ToEulerXYZ(); 

ToEulerXYZ都獲得{x = 58.675510 y = 33.600880 z = 38.327244 ...}(當轉換爲度數時)。

我可以看到的唯一區別是四元數是相同的,但一個是負數。所述ToEulerXYZ是錯的,因爲一個應該是負的({X = -58.675510 Y = -33.600880 Z = -38.327244 ...})(BQ)

AQ是:

x 0.52576530 float 
y 0.084034257 float 
z 0.40772036 float 
w 0.74180400 float 

雖然BQ是:

x -0.52576530 float 
y -0.084034257 float 
z -0.40772036 float 
w -0.74180400 float 

這只是MathGeoLib一個錯誤,或者一些奇怪的細微差別,或者也許有人能向我解釋什麼是邏輯上怎麼回事。

還有其他場景甚至不是消極

axisX:

-0.71492511 y=-0.69920099 z=0.00000000 

axisY:

0.69920099 y=-0.71492511 z=0.00000000 

axisZ:

x=0.00000000 y=0.00000000 z=1.0000000 

代碼:

Quat aQ = Quat::RotateAxisAngle(axisX, DegToRad(0)) * Quat::RotateAxisAngle(axisY, DegToRad(0)) * Quat::RotateAxisAngle(axisZ, DegToRad(-90)); 
float3 eulerAnglesA = aQ.ToEulerXYZ(); 

Quat bQ = Quat::RotateAxisAngle(axisX, DegToRad(-180)) * Quat::RotateAxisAngle(axisY, DegToRad(180)) * Quat::RotateAxisAngle(axisZ, DegToRad(90)); 
float3 eulerAnglesB = bQ.ToEulerXYZ(); 

這些都產生相同的四元數!

x 0.00000000 float 
y 0.00000000 float 
z -0.70710677 float 
w 0.70710677 float 

回答

2

四元數-q和q是不同的;然而,由兩個四元數表示的旋轉是相同的。這種現象通常被稱爲四元數提供旋轉組SO(3)的double cover。看到這個代數很簡單:給定一個由四元數p表示的向量,以及由四元數q表示的旋轉,旋轉爲qpq^{-1}。另一方面,-qp(-q)^{-1} = -1qp(q)^{-1}(-1) = q(-1)p(-1)q^{-1} = qp(-1)^2q^{-1} = qpq^{-1},同樣的旋轉。四元數通常不會通勤,所以對於一般的四元數,pq != qp,但像-1這樣的標量可以通過四元數。

我認爲ToEulerXYZ在兩種情況下都應該是相同的,看起來是這樣。

0

從我記得的四元數可以被認爲是圍繞任意軸的旋轉。

這可以幫助直觀地理解爲什麼總是會有兩個四元數來表示給定的旋轉。

圍繞0,0,1旋轉90°將與圍繞0,0,-1旋轉270°相同。

I.e.在0,0,1周圍逆時針四分之一圈與在0,0,-1周圍順時針圈四分之一圈相同。

您可以使用拇指作爲旋轉軸來檢查此情況,並在手指捲曲的方向上進行90°旋轉。

+0

在「絕對輪換你最終結束」中看起來確實如此,但是當去歐拉時有一個區別。也就是說,當你動畫時,單向旋轉手臂,另一個向後旋轉。這些數據是否完全因四元數而丟失? –

+0

我不知道,但「四元數插值」可能是搜索的術語。 –