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

Java 这个四元数旋转代码是如何工作的?,java,rotation,quaternions,Java,Rotation,Quaternions,我试图理解四元数旋转是如何工作的,我找到了这个迷你教程,但他做了一些我无法训练的假设,比如我如何“计算出绕每个轴的旋转向量,只需绕一个轴旋转向量。”他如何计算angleDegreesX、angleDegreesY和angleDegreesZ 有人能提供一个有效的例子或解释吗?最简短的总结是,四元数只是旋转矩阵的简写。4x4矩阵需要16个单独的值,而四元数可以表示4中完全相同的旋转 对于有数学倾向的人,我完全知道上面的内容过于简化了 要提供更详细的信息,请参阅: 单位四元数提供了一个方便的 数学表

我试图理解四元数旋转是如何工作的,我找到了这个迷你教程,但他做了一些我无法训练的假设,比如我如何“计算出绕每个轴的旋转向量,只需绕一个轴旋转向量。”他如何计算angleDegreesX、angleDegreesY和angleDegreesZ


有人能提供一个有效的例子或解释吗?

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

对于有数学倾向的人,我完全知道上面的内容过于简化了

要提供更详细的信息,请参阅:

单位四元数提供了一个方便的 数学表示法 物体的方向和旋转 在三维空间中。与欧拉相比 角度:它们的组成和使用更简单 避免万向节锁的问题。 与旋转矩阵相比,它们是 在数值上更稳定,并且可能 更有效率

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

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

为了简单的解释,这是一个没有区别的区别

如果您想制作一个表示绕轴旋转的简单四元数,以下是一系列简短的步骤:

  • 选择旋转轴
    v={x,y,z}
    。出于礼貌,请选择一个单位向量:如果它还没有长度为1,则将所有分量除以v的长度
  • 选择一个你想围绕这个轴旋转的角度,并称之为θ
  • 可使用以下示例代码计算等效单位四元数:
  • 四元数构造:

    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};
    
    注意那些由2划分的部分:那些确保在旋转中没有混乱。对于法线旋转矩阵,向右旋转90度与向左旋转270度相同。相当于这两个旋转的四元数是不同的:您不能将一个与另一个混淆

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

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

  • 选择屏幕的中心作为原点(我们将围绕它旋转)
  • X轴指向右侧
  • Y轴指向上(屏幕顶部)
  • 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};
    

    你需要一些基本的数学来做你需要的。基本上,通过将表示该点的矩阵与旋转矩阵多重叠加,可以绕轴旋转一个点。结果是该点的旋转矩阵表示

    线路

    angleX = angleDegreesX * DEGTORAD;
    
    只需通过简单公式将度表示转换为弧度表示(请参阅)

    您可以在此处找到旋转矩阵的更多信息和示例:


    在您的编程框架中,可能有一些工具可以完成旋转工作并检索矩阵。不幸的是,我无法帮助您使用四元数,但您的问题似乎有点更基本。

    好的,我理解角度的事情,我必须提供每个角度的旋转量,以便代码正常工作,现在我需要学习如何使用箭头键来实现这一点,假设我在屏幕中央有一个对象,我想旋转这个对象,使其始终面向目标,目标是一个向量xyz->target(mouseX width/2,mouseY height/2,sin(elapsedMillis)),如何计算旋转轴和角度?@Ricardo-等等,关于你关于四元数“唯一性”的观点:单位四元数描述0-720度范围内的旋转,因此有两个四元数描述任何一个真实世界的旋转。这不会使您的其余解释无效,这并不取决于是否存在从3d世界到单位四元数空间的1:1映射。@EdF,当您包括在相反方向(左手与右手)绕先前考虑的旋转轴的相反方向旋转时,有两个四元数。虽然这在数学上是正确的,但对于一般对这个概念感到困惑的人来说,这似乎不是一个有用的观点。不过,我要补充一点,惯用手的原理与单位四元数的冗余是分开的。正如您所注意到的,围绕相反(方向负)轴的相反(负)旋转是相同的旋转,当仅谈论右手四分之一或左手四分之一时,这将是正确的。简而言之,这不是他们惯用手的特征。我很感激,这一切都有点离题,但你也可以在你的帖子里把它写对,或者干脆不提(这可能是更好的选择)