我一直在試圖弄清楚它們之間的區別,以及爲什麼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
在「絕對輪換你最終結束」中看起來確實如此,但是當去歐拉時有一個區別。也就是說,當你動畫時,單向旋轉手臂,另一個向後旋轉。這些數據是否完全因四元數而丟失? –
我不知道,但「四元數插值」可能是搜索的術語。 –