// Apply a rotation about an arbitrary axis to a matrix.
1
2 /*!
3 * Apply a rotation about an arbitrary axis to a matrix.
4 * m is just a float[4][4], q is just a float[4]
5 */
6 void lib3ds_matrix_rotate(Lib3dsMatrix m, Lib3dsQuat q) {
7 float s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz, l;
8 Lib3dsMatrix R;
9
10 l = q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3];
11 s = 2.0f / l;
12
13 xs = q[0] * s;
14 ys = q[1] * s;
15 zs = q[2] * s;
16 wx = q[3] * xs;
17 wy = q[3] * ys;
18 wz = q[3] * zs;
19 xx = q[0] * xs;
20 xy = q[0] * ys;
21 xz = q[0] * zs;
22 yy = q[1] * ys;
23 yz = q[1] * zs;
24 zz = q[2] * zs;
25
26 R[0][0] = 1.0f - (yy + zz);
27 R[1][0] = xy - wz;
28 R[2][0] = xz + wy;
29 R[0][1] = xy + wz;
30 R[1][1] = 1.0f - (xx + zz);
31 R[2][1] = yz - wx;
32 R[0][2] = xz - wy;
33 R[1][2] = yz + wx;
34 R[2][2] = 1.0f - (xx + yy);
35 R[3][0] = R[3][1] = R[3][2] = R[0][3] = R[1][3] = R[2][3] = 0.0f;
36 R[3][3] = 1.0f;
37
38 lib3ds_matrix_mult(m, R);
39 }