0

我有一个(世界)矩阵,它将平移、旋转和缩放应用于 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°)

4

1 回答 1

1

你有两个选择。

您仍然可以使用 XMQuaternionToAxisAngle() 函数,它会使用除基轴以外的轴。任何旋转都可以表示为围绕给定轴旋转的单个角度。

另一方面,如果你真的需要得到它作为欧拉角,没有很好的功能可以为你做到这一点。不过,这些公式很容易获得。来自维基百科:

四元数到欧拉公式

根据维基百科的定义,phi 是围绕全局 Z 轴的角度,theta 是围绕“法线轴”N(穿过局部原点并与全局 Z 轴和最终局部 Z 平面正交的轴)的角度轴——是的,这有点奇怪),psi 是围绕局部(即旋转)Z 轴的角度。

如果我是一个更好的数学家,我可以帮助您将其转换为全局空间 X、Y、Z 旋转,但不幸的是,这超出了我的能力范围。

只知道四元数和欧拉角之间没有严格的 1-1 相关性;例如,万向节锁定意味着某些角度共享相同的欧拉角。真正考虑您是否真的需要欧拉角——大多数情况下,轴角旋转将以相同的方式工作,而不会出现欧拉角的重大问题。

于 2015-05-30T00:43:54.913 回答