围绕绝对世界轴检索四元数角度

Posted

技术标签:

【中文标题】围绕绝对世界轴检索四元数角度【英文标题】:Retrieve quaternion angle around absolute world axis 【发布时间】:2013-07-16 10:37:32 【问题描述】:

我有一个代表立方体旋转的四元数。这个立方体可以按顺序向左、上、右和下旋转,一次只能旋转 90 度,因此人们总是直视其中一张脸。使用 OpenGL 的右手坐标系,这是面向 +z 的表面,看着屏幕。

我想检索立方体的“滚动”。即当前面向世界 +z 的面围绕这个绝对 z 轴旋转了多少。

有人能解释一下解决这个问题的最佳方法是什么吗?转换为欧拉角(这似乎不是正确的选择)?做一些花哨的四元数数学?我已经尝试了各种代码 sn-ps,但在这里是我的最后一根稻草。

【问题讨论】:

【参考方案1】:

每个面都有一个法线(向量,相对于立方体的局部空间,从面直接指向外面)。这在数学上是明确的。不过,听起来,就像您还希望每个面都具有“直立”方向 - 就好像立方体是一个骰子,每个面都有一个具有特定这种方式的数字 - 这本质上不是一个属性一张脸,但你可以继续定义一张脸。将特定面的“直立”向量视为在立方体的局部空间中从骰子数字的底部指向顶部的向量。

所以现在你有六个面法线,以及它们对应的六个垂直向量。您还拥有查看器的世界空间“向后矢量”和“垂直矢量”,分别是 +Z 和(可能)+Y。从这里开始很容易:

    通过模具的方向变换六个面法线,看看哪一个产生 +Z。 通过模具的方向变换该面的垂直矢量。 使用atan2(dot(+Z, cross(+Y, faceUprightWS)), dot(+Y, faceUprightWS)),在+Y 和人脸的世界空间垂直向量之间找到关于+Z 轴的有符号角度。

【讨论】:

角度是顺时针的,而在右手系统中它们通常是逆时针的,所以我不得不翻转它们。它们也有半个 pi 的偏移量,但除此之外:完美!非常感谢,本,我已经被这个问题困住了。 哈,对不起。 atan2 的参数应该交换(就像我刚才的编辑一样);这将负责CCW-ness和偏移量。但很高兴它有帮助!

以上是关于围绕绝对世界轴检索四元数角度的主要内容,如果未能解决你的问题,请参考以下文章

四元数绕轴旋转的分量

从四元数中提取偏航

C++ 四元数旋转未按预期工作

如何在不使用 transform.Rotate 的情况下在其本地或世界轴上旋转带有第二个四元数的四元数?

当提供轴和四元数时,我如何获得 GLM 的角度?

四元数旋转opengl