   gimbal lock (again...)
  Just when I thought I had solved the problem a new one comes along...here''s what I implemented :///////////////////////////////////////////// glPushMatrix;   glLoadIdentity;    key_quat := Euler2Q(key_x, key_y, key_z);   temp_quat := Obj_quat;   Obj_quat := Q_MultN(temp_quat, key_quat);   GetAxisAngle(Obj_quat, angle, axis);   angle := (angle*180/Pi);   glRotatef(angle, axis[1], axis[2], axis[3]);   glGetFloatv(GL_MODELVIEW_MATRIX, @Model_Matrices); glPopMatrix; glMultMatrixf(@Model_Matrices); DrawModel;///////////////////////////////////////////and here''s what happens:The model rotates just fine about its local coordinate system. But after a couple of random rotations the orientation of the model and its euler angels dont match up.(if you dont understand: In my processKeys function I wrote this Key_x := 0; if DownKeyPressed  Begin    ModelX  := ModelX + 1;    Key_X   := +1;   End;  So ModelX keeps track of the overall rotation angle. But after numerous rotations 90 degrees ain''t exactly 90 degrees anymore)It seem like a roundoff error to me. But with floats?Assuming the functions are correct, What did I do wrong???please help.   
  Use a quaternian? ;  I always hate it when forum goers ask ''Why are you ____?''.That said, why are you building a quaternion from Euler Angles?  Shouldn''t you use the Euler Angles in an Axis-Angle to build quaternion rotations (thus instantly rotating around object-space)?  I see you are using Axis-Angle for something, it gets kind of hard (for me) to follow.I''d wager if you''re having problems it is because of the Euler to Quaternion Building that happens when this function is called.Do your Euler values ''build up'' from cycle to cycle, or do they get rebuilt ever time the function is called?  In my own program I zero them out (though I do use Axis-Angle, rather than strict Euler - Euler rotations are always about the ''identity'' and not the local coords) after they''ve been piled in to the quaternion rotation.  I used to keep them and just rebuild the quaternion, but the rotation would fritz out at higher euler values.  Now the values never get that high and the program doesn''t wig out. 