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]]