2011-03-10 144 views
0

取代欧拉角,我转移到四元数来表示和处理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),这是万向节锁的主要问题。

如何实现四元数旋转,以便万向节锁解决?

在此先感谢。

回答

3

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

+0

这可能听起来很愚蠢,但是有没有办法使三个轴独立,这样Y和Z在绕X轴旋转后仍然会指向原始方向? – pimvdb 2011-03-10 17:09:55

+0

我其实忘了提及我在3D引擎中使用它。而不是使用特定的轴顺序,而是在旋转后更新立方体顶点的坐标。所以例如它将首先在X轴上旋转,然后将计算出的点保存为原始点。之后的任何最终轮换将表现得如同这是唯一的轮换。无论如何,它的结果是万向节锁现在已经被四元数保存了,谢谢! – pimvdb 2011-03-10 17:48:22

2

正如你所提到的,万向节锁定问题随时都会出现,你需要连续三次旋转(如欧拉角)才能从惯性坐标系获取到身体框架。这包括结合三个连续的四元数旋转(通过称为合成的操作)。

四元数可以克服万向节锁的原因是它们可以表示在一次旋转中从惯性坐标系到身体固定框架的转换。然而,这却是四元组的最大缺点 - 想出四元数并不直观。