Search code examples
openglgraphicsmatrixquaternions

Convert Quaternion rotation to rotation matrix?


Basically, given a quaterion (qx, qy, qz, qw)... How can i convert that to an OpenGL rotation matrix? I'm also interested in which matrix row is "Up", "Right", "Forward" etc... I have a camera rotation in quaternion that I need in vectors...


Solution

  • The following code is based on a quaternion (qw, qx, qy, qz), where the order is based on the Boost quaternions:

    boost::math::quaternion<float> quaternion;
    float qw = quaternion.R_component_1();
    float qx = quaternion.R_component_2();
    float qy = quaternion.R_component_3();
    float qz = quaternion.R_component_4();
    

    First you have to normalize the quaternion:

    const float n = 1.0f/sqrt(qx*qx+qy*qy+qz*qz+qw*qw);
    qx *= n;
    qy *= n;
    qz *= n;
    qw *= n;
    

    Then you can create your matrix:

    Matrix<float, 4>(
        1.0f - 2.0f*qy*qy - 2.0f*qz*qz, 2.0f*qx*qy - 2.0f*qz*qw, 2.0f*qx*qz + 2.0f*qy*qw, 0.0f,
        2.0f*qx*qy + 2.0f*qz*qw, 1.0f - 2.0f*qx*qx - 2.0f*qz*qz, 2.0f*qy*qz - 2.0f*qx*qw, 0.0f,
        2.0f*qx*qz - 2.0f*qy*qw, 2.0f*qy*qz + 2.0f*qx*qw, 1.0f - 2.0f*qx*qx - 2.0f*qy*qy, 0.0f,
        0.0f, 0.0f, 0.0f, 1.0f);
    

    Depending on your matrix class, you might have to transpose it before passing it to OpenGL.