# Rotation, HPB & Quaternions

• THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 25/04/2007 at 06:00, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   9.603
Platform:   Windows  ;
Language(s) :     C++  ;

---------
There seems to be a problem with the Quaternion::SetMatrix() function.

I'm writing a directX exporter and until now I used matrices to animate a model. Due to the limitations (gimbal lock) I switched to Quaternions.

Now here's the problem:
a cube with a rotation of 360° along the Y axis.
Exporting the animation with a 4x4 Matrix -> everything is fine
Exporting the animation with Quaternions -> everything is fine until the rotation is > 180° (pi).
HPB Values higher than pi get a wrong sign in the quaternion which causes rotation to spin back very fast

Has anyone experienced something similar?
And are there solutions?

Any help is greatly appreciated

• THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 27/04/2007 at 04:12, xxxxxxxx wrote:

After 2 days of comparing values and try and error I found the problem.

To build my quaternion I used

rotquat.SetMatrix(LHPBToMatrix(LV(dtRot)));

But (of course) this doesnt work, because the "regular" Matrix brings the gimbal problem back.

The correct way to do this is like this:

``````
Quaternion rotquat, rotquatX, rotquatY, rotquatZ;
//rotquat.SetMatrix(LHPBToMatrix(LV(dtRot)));
rotquatX.SetAxis(LVector(1, 0, 0), dtRot.y);
rotquatY.SetAxis(LVector(0, 1, 0), dtRot.x);
rotquatZ.SetAxis(LVector(0, 0, 1), dtRot.z);
//ZYX
rotquat = QMul(rotquatZ, QMul(rotquatX, rotquatY));
``````