Search code examples
mathxnaquaternions

Extracting Yaw from a Quaternion


I have a rotation quaternion and want to extract the angle of rotation about the Up axis (the yaw). I am using XNA and as far as I can tell there is no inbuilt function for this. What is the best way to do this?

Thanks for any help, Venatu


Solution

  • The quaternion representation of rotation is a variation on axis and angle. So if you rotate by r radians around axis x, y, z, then your quaternion q is:

    q[0] = cos(r/2);
    q[1] = sin(r/2)*x;
    q[2] = sin(r/2)*y;
    q[3] = sin(r/2)*z;
    

    If you want to create a quaternion that only rotates around the y axis, you zero out the x and z axes and then re-normalize the quaternion:

    q[1] = 0;
    q[3] = 0;
    double mag = sqrt(q[0]*q[0] + q[2]*q[2]);
    q[0] /= mag;
    q[2] /= mag;
    

    If you want the resulting angle:

    double ang = 2*acos(q[0]);
    

    This assumes that the quaternion representation is stored: w,x,y,z. If both q[0] and q[2] are zero, or close to it, the resulting quaternion should just be {1,0,0,0}.