四元数仍然存在万向节锁问题。

3
我用四元数来表示和处理一个三维立方体的旋转,而不是欧拉角。虽然这样可以解决万向节锁定问题,但我仍然遇到了这个问题。
我的代码如下:
// 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),这是万向节锁定的主要问题。
如何以解决万向节锁定的方式实现四元数旋转?
提前感谢。
2个回答

6
当你进行三次连续旋转(例如欧拉角)以从惯性坐标系到机体坐标系时,就会出现万向节锁问题。这包括通过一个称为组合的操作来组合三个连续的四元数旋转。
四元数可以克服万向节锁的原因是它们可以用单个旋转表示从惯性坐标系到机体固定坐标系的变换。然而,这是四元数的一个很大的缺点 - 很难直观地得出所需的四元数。

4
四元数不易受万向锁的影响,因此这不是你的问题。如果你的x、y和z角度意味着类似欧拉角的东西,问题更可能是你相对于原始坐标系定义了x轴、y轴和z轴。但这将不能给出预期的结果,因为在绕x轴旋转后,Y和Z轴不再指向原来的方向,然而下两次旋转仍参照原始坐标系。

这可能听起来很愚蠢,但是也许有一种方法可以使三个轴相互独立,以便在绕X轴旋转后,Y和Z仍然指向原始方向? - pimvdb
我实际上忘记提到我是在一个3D引擎中使用它。与其使用特定的轴顺序,我改为在旋转后更新立方体顶点的坐标。例如,它基本上会首先绕X轴旋转,然后将计算出的点保存为原始点。任何之后的旋转都会像这是唯一执行的旋转一样行为。无论如何,最终结果就是用四元数存储了万向节锁问题,谢谢! - pimvdb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接