1
votes

Instead of Euler angles I moved to Quaternions to represent and process the rotation of a cube in 3D. Although it would solve gimbal lock, I'm still experiencing this issue.

My code is:

// 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);

The rotate functions comes from http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#Pseudo-code_for_rotating_using_a_quaternion_in_3D_space (translated into JavaScript).

I guess the problem is due to the fact that I still use an order of axes (x y z) which is the main problem of gimbal lock.

How would one implement quaternion rotation in such a way that gimbal lock is solved?

Thanks in advance.

2

2 Answers

4
votes

Quaternions are not susceptible to gimbal lock, so that's not your problem. If your x, y, and z angles are intended to represent something like Euler angles, the issue is more likely that you're defining xaxis, yaxis, and zaxis relative to the original coordinate system. But that won't give the expected results, because after the first rotation around xaxis, the Y and Z axes don't point in the original directions any more, yet the next two rotations are still referenced to the original coordinate system.

4
votes

As you mention the gimbal lock issue arises anytime you do three consecutive rotations (such as Euler Angles) to get from an inertial coordinate frame to a body frame. This includes combining three successive quaternion rotations (through a operation called composition).

The reason why quaternions can overcome gimbal lock is that they can represent the transformation from the inertial coordinate frame to the body fixed frame in a single rotation. This is however imho the big disadvantage of quaternions - it is not physically intuitive to come up with a desired quaternion.