我有一个(世界)矩阵,它将平移、旋转和缩放应用于 3D 对象。它是使用函数XMMatrixTransformation
(DirectXMath) 创建的,参数RotationQuaternion
是通过调用XMQuaternionRotationRollPitchYaw
. 然后它与其他数据一起存储在一个文件中。
然后我需要恢复这些值,所以我可以使用此函数将其分解为每个组件:
XMMatrixDecompose(&Scale, &RotationQ, &Translation, Matrix);
缩放和平移是向量,旋转是四元数。如果矩阵在单个轴上旋转对象,我可以使用它来将四元数转换回角度:
XMQuaternionToAxisAngle(&Axis, &Angle, RotationQ);
它工作正常。但是当它在两个或更多轴上旋转时,我该怎么做呢?有没有办法做到这一点?
PS:我不在乎输出角度是否与输入不同。他们只需要等价。
PS2:好的,所以我关注了 Gene 的链接(我已经看过那里,但当时没有找到我需要的东西)。我根据在维基百科中找到的这个等式制作了这段代码:
float Roll = atan2(2.0*(F.x*F.y + F.z*F.w), 1 - 2 * (F.y*F.y + F.z*F.z));
float Pitch = asin(2.0*(F.x*F.z - F.w*F.y));
float Yaw = atan2(2.0*(F.x*F.w + F.y*F.z), 1 - 2 * (F.y*F.y + F.z*F.z));
在输出中我有不同的角度。输出似乎等效于(90°, 0°, 90°)
,但不等效于(45°, 45°, 45°)
。