当前位置: 首页 > 面试题库 >

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

叶鹭洋
2023-03-14
问题内容

我试图了解四元数旋转的工作原理,我发现了这个迷你教程http://www.julapy.com/blog/2008/12/22/quaternion-
rotation/,
但是他做出了一些我不能锻炼的假设,就像我如何“ 简单地通过绕轴旋转矢量来计算绕轴的旋转矢量
他如何计算angleDegreesX,angleDegreesY和angleDegreesZ?

有人可以提供可行的示例或解释吗?


问题答案:

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

对于数学上的偏见,我完全知道上述内容过于简化。

为了提供更多细节,让我们参考Wikipedia文章:

单元四元数提供了一种方便的数学符号,用于表示三维物体的方向和旋转。与欧拉角相比,它们的组成更简单,并且避免了万向节锁定问题。与旋转矩阵相比,它们在数值上更稳定,并且效率更高

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

再次,对于数学上的倾向,我上面的唯一性注释假定为右旋。 有一个等效的左手四元数沿相反的方向绕相反的轴旋转。

出于简单说明的目的,这是区别,没有区别。

如果您想制作一个简单的四元数来表示绕轴的旋转,则可以通过以下几步操作来达到目标​​:

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

请注意将这些除以2:将确保轮换中没有混乱。使用法向旋转矩阵,向右旋转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};


 类似资料:
  • 本文向大家介绍unity3d 四元数外观旋转,包括了unity3d 四元数外观旋转的使用技巧和注意事项,需要的朋友参考一下 示例 Quaternion.LookRotation(Vector3 forward [, Vector3 up])将创建一个四元数旋转,该旋转向前看“向下”向前的向量,并使Y轴与“向上”向量对齐。如果未指定up向量,Vector3.up则将使用。 旋转此游戏对象以查看目标游

  • 我喜欢基于度数的Euler旋转,因此我可以为大量度数的动画设置关键帧,比如1000,并在对象上获得多个完整的360度旋转,以便设置旋转等。 然而,我现在正在做一件事,涉及两个不同轴之间的许多连续动画,我想我看到了万向锁的效果。当我执行其中一个链接动画时,我的对象在完成90度旋转后会继续翻转180度。这听起来像万向节锁吗?它只会在沿着不同的轴进行其他先前和成功的旋转之后发生。 在任何情况下,我都尝试

  • 我在这个网站上看到过关于javafx中旋转的问题,但我似乎不太明白。下面是一些代码: 为什么当我改变角度时,矩形开始出现在随机位置?例如,当我将角度设置为 180 时,矩形出现在中间。我的理解是,矩形围绕 X:150 和 Y:225 以指定的角度移动。但是,当我将角度设置为180时,我完全错了。你们能帮帮我吗? 编辑:在阅读和看到回答这个问题的代码时,我想我发现了一个新问题。如何设置pivotX和

  • 问题内容: 我想-使用Python和Qt4– 旋转QPushButton(或至少它的文本),使其可以垂直站立。我在网上看过一些文档,但是我从中没多大意义- 它在C语言中,而且我是C文盲。 根据我的阅读,需要重新实现paintEvent()处理程序,实例化和旋转QPainter()。但是我不知道怎么为我只需要的一个QString或QPushButton做到这一点。我假设QPaintEvent会像信号

  • 给定一个由整数和一个数字组成的数组,,对该数组执行左旋转。然后将更新后的数组打印为单行空格分隔的整数。 示例输入: 如何使用更少的内存来解决这个问题?

  • 从属性中的pom 在构建部分 这是我最后一次尝试,但pom变得越来越大,没有任何结果