【问题标题】:Quaternions still have gimbal lock四元数仍然有万向节锁
【发布时间】:2011-07-12 20:52:39
【问题描述】:

我使用四元数代替欧拉角来表示和处理 3D 中立方体的旋转。虽然它可以解决云台锁定,但我仍然遇到这个问题。

我的代码是:

// p is the point to be rotated
// angles is a Vector3D representing the rotation angles

var xaxis = new Vector3D(1, 0, 0);
var yaxis = new Vector3D(0, 1, 0);
var zaxis = new Vector3D(0, 0, 1);

p = rotate(p, xaxis, angles.x);
p = rotate(p, yaxis, angles.y);
p = rotate(p, zaxis, angles.z);

rotate 函数来自http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#Pseudo-code_for_rotating_using_a_quaternion_in_3D_space(翻译成 JavaScript)。

我想问题是由于我仍然使用轴的顺序(x y z),这是云台锁定的主要问题。

如何以解决万向节锁定的方式实现四元数旋转?

提前致谢。

【问题讨论】:

    标签: math vector 3d quaternions


    【解决方案1】:

    正如您所提到的,只要您连续三个旋转(例如欧拉角)以从惯性坐标系到身体坐标系,就会出现万向节锁定问题。这包括组合三个连续的四元数旋转(通过称为组合的操作)。

    四元数之所以能克服万向节锁定,是因为它们可以表示单次旋转从惯性坐标系到身体固定系的变换。然而,恕我直言,这是四元数的一大缺点 - 想出所需的四元数在物理上并不直观。

    【讨论】:

      【解决方案2】:

      四元数不易受到万向节锁定的影响,所以这不是您的问题。如果你的 x、y 和 z 角旨在表示类似欧拉角的东西,问题 更有可能您正在相对于原始定义 xaxis、yaxis 和 zaxis 坐标系。但这不会给出预期的结果,因为在第一个 绕 x 轴旋转,Y 和 Z 轴不指向原始方向 再多,但接下来的两个旋转仍以原始坐标为参考 系统。

      【讨论】:

      • 这听起来可能很愚蠢,但是有没有办法让三个轴独立,这样 Y 和 Z 在绕 X 轴旋转后仍然指向原始方向?
      • 我实际上忘了提到我在 3D 引擎中使用它。我没有使用特定的轴顺序,而是在旋转后更新了立方体顶点的坐标。所以例如它基本上会首先在 X 轴上旋转,然后将计算的点保存为原始点。之后的任何最终旋转都将表现得好像这是唯一执行的旋转。无论如何,归根结底是云台锁现在已经用四元数保存了,谢谢!
      猜你喜欢
      • 2015-04-30
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      相关资源
      最近更新 更多