【问题标题】:Is there a way to convert a quaternion to angles?有没有办法将四元数转换为角度?
【发布时间】:2015-05-30 00:07:27
【问题描述】:

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

【问题讨论】:

标签: c++ matrix directx quaternions directxmath


【解决方案1】:

你有两个选择。

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

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

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

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

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

【讨论】:

  • 感谢您的回答。对于选项一:如果我不明白这一点,我将使用轴和角度。谢谢。对于选项二:否,XMQuaternionRotationRollPitchYawFromVector“基于包含欧拉角(俯仰、偏航和滚动)的向量计算旋转四元数。”根据MSDN.
  • 你是对的,那是我的错误。不幸的是,似乎没有将四元数转换为欧拉角的函数,也没有将矩阵转换为欧拉角的函数。您可以使用来自the Wikipedia article 的示例来构建自己的函数。特别是upload.wikimedia.org/math/a/2/9/…(其中 phi 围绕 Z 轴,theta 围绕 X,而 psi 围绕 Y。)我仍然鼓励您真正考虑您是否真的想要欧拉角。
  • 哦,谢谢。看看我在答案中添加了什么。我假设 φ (phi) 是 X,θ (theta) 是 Y 而 ψ (psi) 是 Z。现在要再试一次. PS:我傻了。我没有看到“X轴指向前方,Y轴向右,Z轴向下”的地方
  • 没关系。你知道吗?我将修改很多代码,以确保保存角度而不是矩阵。感谢您帮助我,但我认为,在这一点上,这将比弄清楚这一点容易得多。
  • 不客气,我想。我做了我能做的。如果您认为我的答案(我将对其进行编辑以将 XMQuaternionRotationRollPitchYawVector 替换为公式)就足够了,请将其标记为正确。否则,请写下您自己的答案,详细说明您的解决方案并将其标记为正确。
猜你喜欢
  • 2011-04-19
  • 2020-02-26
  • 1970-01-01
  • 2021-01-02
  • 2017-02-14
  • 1970-01-01
  • 2013-06-07
  • 2021-10-14
相关资源
最近更新 更多