GLM 四元数-欧拉转换与 Wikipedia/EuclideanSpace 网站中显示的转换之间的明显差异
Apparent Difference between GLM Quaternion-Euler conversion and the one shown in Wikipedia/EuclideanSpace websites
所以将四元数转换为欧拉 "Pitch" 角的 GLM 定义是:
atan(T(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z)
使用 T 类型名称。将此与 wikipedia page 中显示的内容进行对比:
asin((-2) * (q.x * q.z - q.w * q.y))
这恰好是 GLM 所说的 "Yaw"。这本身就够令人困惑的了,但我可以接受不同的命名约定。但是当我们查看 GLM 对音高的定义时,它与维基百科(或 euclideanspace 网站)上给出的任何四元数-> 欧拉转换都不匹配。这背后的原因是什么?是因为 GLM 试图以某种方式弥补他们不(无论出于何种原因)使用 atan2 的事实吗?另外,如果这更适合数学堆栈交换,请发表评论。
我刚刚意识到,当您考虑单位四元数时,定义确实匹配:
q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w = 1
它可以解决所有问题。我仍然不知道为什么 GLM 会避免使用“1 - 2(...)”等式。
所以将四元数转换为欧拉 "Pitch" 角的 GLM 定义是:
atan(T(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z)
使用 T 类型名称。将此与 wikipedia page 中显示的内容进行对比:
asin((-2) * (q.x * q.z - q.w * q.y))
这恰好是 GLM 所说的 "Yaw"。这本身就够令人困惑的了,但我可以接受不同的命名约定。但是当我们查看 GLM 对音高的定义时,它与维基百科(或 euclideanspace 网站)上给出的任何四元数-> 欧拉转换都不匹配。这背后的原因是什么?是因为 GLM 试图以某种方式弥补他们不(无论出于何种原因)使用 atan2 的事实吗?另外,如果这更适合数学堆栈交换,请发表评论。
我刚刚意识到,当您考虑单位四元数时,定义确实匹配:
q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w = 1
它可以解决所有问题。我仍然不知道为什么 GLM 会避免使用“1 - 2(...)”等式。