这个四元数旋转代码如何工作?

Ric*_*hez 8 java rotation quaternions

我试图理解四元数旋转是如何工作的,我找到了这个迷你教程http://www.julapy.com/blog/2008/12/22/quaternion-rotation/但他做了一些假设,我无法锻炼,就像我怎样才能" 围绕每个轴计算旋转矢量,只需绕轴旋转矢量. "他如何计算angleDegreesX,angleDegreesY和angleDegreesZ?

有人可以提供一个工作实例或解释吗?

Bob*_*oss 17

最简单的总结是四元数只是旋转矩阵的简写.4x4矩阵需要16个单独的值,而四元数可以表示4中完全相同的旋转.

对于数学上的倾向,我完全清楚上面的内容过于简单了.

为了提供更多细节,让我们参考维基百科的文章:

单位四元数提供了方便的数学符号,用于表示三维物体的方向和旋转.与欧拉角相比,它们更容易构成并避免万向节锁定的问题.与旋转矩阵相比,它们在数值上更稳定并且可能更有效

从开头的段落中不清楚的是,四元数不仅方便,而且是独一无二的.如果您具有对象的特定方向,在任意数量的轴上扭曲,则存在表示该方向的单个唯一四元数.

同样,对于数学倾向,我上面的唯一性评论假设右手旋转.有一个等效的左手四元数,它围绕相反的轴在相反的方向上旋转.

出于简单解释的目的,这是一种没有区别的区别.

如果你想制作一个代表轴旋转的简单四元数,这里有一系列简短的步骤可以帮助你:

  1. 选择你的旋转轴v = {x, y, z}.只是为了礼貌,请选择一个单位向量:如果它不是长度为1,则将所有分量除以v的长度.
  2. 选择您想要围绕此轴转动的旋转角度并调用它theta.
  3. 可以使用以下示例代码计算等效单位四元数:

四元数结构:

q = { cos(theta/2.0),     // This is the angle component 
      sin(theta/2.0) * x, // Remember, angle is in radians, not degrees!
      sin(theta/2.0) * y, // These capture the axis of rotation
      sin(theta/2.0) * z};
Run Code Online (Sandbox Code Playgroud)

请注意这些划分为两个:这些划分确保旋转中没有混淆.使用正常旋转矩阵,向右旋转90度与向左旋转270度相同.相当于这两个旋转的四元数是不同的:您不能将一个与另一个混淆.

编辑:回复评论中的问题:

让我们通过设置以下参考框架来简化问题:

  1. 选择屏幕中心作为原点(我们将围绕它旋转).
  2. X轴指向右侧
  3. Y轴指向上方(屏幕顶部)
  4. Z轴指向屏幕外面(形成一个漂亮的右手坐标系).

所以,如果我们有一个示例对象(比如一个箭头),它通过指向右边(正x轴)开始.如果我们从x轴向上移动鼠标,鼠标将为我们提供正x和正y.因此,通过一系列步骤:

double theta = Math.atan2(y, x);
// Remember, Z axis = {0, 0, 1};
// pseudo code for the quaternion:
q = { cos(theta/2.0),     // This is the angle component 
      sin(theta/2.0) * 0, // As you can see, the zero components are ignored
      sin(theta/2.0) * 0, // Left them in for clarity.
      sin(theta/2.0) * 1.0};
Run Code Online (Sandbox Code Playgroud)