取代欧拉角,我转移到四元数来表示和处理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
),这是万向节锁的主要问题。
如何实现四元数旋转,以便万向节锁解决?
在此先感谢。
这可能听起来很愚蠢,但是有没有办法使三个轴独立,这样Y和Z在绕X轴旋转后仍然会指向原始方向? – pimvdb 2011-03-10 17:09:55
我其实忘了提及我在3D引擎中使用它。而不是使用特定的轴顺序,而是在旋转后更新立方体顶点的坐标。所以例如它将首先在X轴上旋转,然后将计算出的点保存为原始点。之后的任何最终轮换将表现得如同这是唯一的轮换。无论如何,它的结果是万向节锁现在已经被四元数保存了,谢谢! – pimvdb 2011-03-10 17:48:22