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

时间:2011-06-08 14:40:13

标签: java rotation quaternions

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

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

2 个答案:

答案 0 :(得分:17)

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

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

为了提供更多细节,让我们参考Wikipedia article

  

单位四元数提供了方便   用于表示的数学符号   物体的方向和旋转   在三个方面。与欧拉相比   角度他们更容易撰写和   避免万向节锁的问题。   与旋转矩阵相比,它们是   在数值上更稳定,可能是   效率更高

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

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

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

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

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

    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};
    

    注意这两个除法:它们确保轮换中没有混淆。使用正常旋转矩阵,向右旋转90度与向左旋转270度相同。相当于这两个旋转的四元数是不同的:您不能将一个与另一个混淆。

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

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

    1. 选择屏幕中心作为原点(我们将围绕它旋转)。
    2. X轴指向右侧
    3. Y轴指向上方(屏幕顶部)
    4. Z轴指向您脸部的屏幕(形成一个漂亮的右手坐标系)。
    5. 所以,如果我们有一个示例对象(比如一个箭头),它通过指向右边(正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};
      

答案 1 :(得分:0)

你需要一些基本的数学来做你需要的。基本上,您通过使用旋转矩阵对表示该点的矩阵进行多重打印来围绕轴旋转点。结果是该点的旋转矩阵重新定位。

该行

angleX = angleDegreesX * DEGTORAD;

只需通过简单的公式将度数表示转换为弧度表示(参见this Wikipedia entry on Radians

您可以在此处找到更多有关轮换矩阵的信息和示例:Rotation around arbitrary axes

您的编程框架中可能有工具来执行旋转工作并检索矩阵。不幸的是,我无法帮助你完成四元数,但你的问题似乎有点基础。