0

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

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

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

4

1 回答 1

1

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

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

  1. 通过模具的方向变换六个面法线,并查看哪一个产生 +Z。
  2. 通过模具的方向变换该面的垂直向量。
  3. 使用 找到 +Y 和面的世界空间垂直向量之间关于 +Z 轴的有符号角度atan2(dot(+Z, cross(+Y, faceUprightWS)), dot(+Y, faceUprightWS))
于 2013-07-16T11:04:30.217 回答