我有一个代表立方体旋转的四元数。这个立方体可以依次向左,向上,向右和向下旋转,每次只旋转90度,这样一个人总是可以直接看到其中一个面。使用OpenGL的右手坐标系,这是面向+ z的表面,看着屏幕。
我想检索多维数据集的'roll'。也就是说,当前面向世界+ z的面部围绕该绝对z轴旋转了多少。
有人可以解释一下最好的方法吗?转换为欧拉角(这似乎不是正确的选择)?做一些奇特的四元数学?我已经尝试了各种代码片段,但这是我的最后一根稻草。
答案 0 :(得分:1)
每个面都有一个法线(相对于立方体局部空间的矢量,它直接指向面部)。这在数学上是明确的。听起来,就像你也希望每张脸都有一个“直立”的方向 - 好像这个立方体是一个骰子,而且每张脸都有一个特定的这种方式 - 这本身并不是一个属性一张脸,但你可以继续定义一个。将特定面的“直立”矢量视为矢量,该矢量在立方体的局部空间中指向模具数字的底部到顶部。
所以现在你有六个面法线和它们相应的六个直立矢量。你还有观察者的世界空间“向后矢量”和“直立矢量”,它们分别是+ Z和(可能)+ Y.从这里开始很简单:
atan2(dot(+Z, cross(+Y, faceUprightWS)), dot(+Y, faceUprightWS))
在+ Y和面部世界空间直立矢量之间找到关于+ Z轴的有符号角度。