Math 四元数仍然有万向节锁

Math 四元数仍然有万向节锁,math,vector,3d,quaternions,Math,Vector,3d,Quaternions,我移动到四元数来表示和处理三维立方体的旋转,而不是欧拉角。虽然它可以解决万向节锁,但我仍然遇到这个问题 我的代码是: // 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,

我移动到四元数来表示和处理三维立方体的旋转,而不是欧拉角。虽然它可以解决万向节锁,但我仍然遇到这个问题

我的代码是:

// 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
函数来自(翻译成JavaScript)

我想问题是因为我仍然使用轴的顺序(
xyz
),这是万向锁的主要问题

如何实现四元数旋转,以解决万向节锁定问题


提前感谢。

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

四元数对万向节锁不敏感,所以这不是您的问题。如果你的 x、 y角和z角旨在表示类似于欧拉角的东西,这是一个问题 更可能的情况是,您定义的xaxis、yaxis和zaxis是相对于原始的 坐标系。但这不会带来预期的结果,因为在第一次 绕X轴旋转时,Y轴和Z轴不指向原始方向 但接下来的两次旋转仍然参照原始坐标
系统。

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


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

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


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

这听起来可能很愚蠢,但是否有办法使三个轴独立,所以Y和Z在绕X轴旋转后仍然指向原始方向?实际上我忘了在3D引擎中使用这个。我没有使用特定的轴顺序,而是在旋转后更新了立方体顶点的坐标。例如,它基本上首先在X轴上旋转,然后保存计算的点,就像原始点一样。之后的任何最终旋转都将表现为这是唯一执行的旋转。不管怎样,归根结底,万向节锁现在已经用四元数保存了,谢谢!这听起来可能很愚蠢,但是否有办法使三个轴独立,以便Y和Z在绕X轴旋转后仍指向原始方向?我实际上忘记了在3D引擎中使用它。我没有使用特定的轴顺序,而是在旋转后更新了立方体顶点的坐标。例如,它基本上首先在X轴上旋转,然后保存计算的点,就像原始点一样。之后的任何最终旋转都将表现为这是唯一执行的旋转。不管怎样,归根结底,万向节锁现在已经用四元数保存了,谢谢!