nml::mat4 nml::quatToRotationMatrix(const nml::quat& qua)

Return a 3D rotation matrix from a quaternion.

The conversion from quaternion to a mat4 rotation matrix is calculated this way:

\(\begin{bmatrix} a & d & g & 0.0 \\ b & e & h & 0.0 \\ c & f & i & 0.0 \\ 0.0 & 0.0 & 0.0 & 1.0 \end{bmatrix}\)

\(a = 1.0 - 2.0 * (qua.c^2 + qua.d^2)\)

\(b = 2.0 * (qua.b * qua.c + qua.a * qua.d)\)

\(c = 2.0 * (qua.b * qua.d - qua.a * qua.c)\)

\(d = 2.0 * (qua.b * qua.c - qua.a * qua.d)\)

\(e = 1.0 - 2.0 * (qua.b^2 + qua.d^2)\)

\(f = 2.0 * (qua.c * qua.d + qua.a * qua.b)\)

\(g = 2.0 * (qua.b * qua.d + qua.a * qua.c)\)

\(h = 2.0 * (qua.c * qua.d - qua.a * qua.b)\)

\(i = 1.0 - 2.0 * (qua.b^2 + qua.c^2)\)

Example

#include "include/mat4.h"
#include "include/quat.h"
#include <iostream>

int main() {
        nml::quat q(1.0f, 1.0f, 1.0f, 1.0f);
        q = nml::normalize(q);
        nml::mat4 m = nml::quatToRotationMatrix(q);
        std::cout << nml::to_string(m) << std::endl;

        return 0;
}

Result:

[[0.000000, 1.000000, 0.000000, 0.000000], [0.000000, 0.000000, 1.000000, 0.000000], [1.000000, 0.000000, 0.000000, 0.000000], [0.000000, 0.000000, 0.000000, 1.000000]]