我一直在试图找出它们之间的区别,为什么ToEulerXYZ没有得到正确的旋转。
使用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