17 for (
int i = 0; i < 4; i++)
18 for (
int j = 0; j < 4; j++)
19 m[i][j] = (i == j) ? 1.0 : 0.0;
44 m[0][3] =
m[1][3] =
m[2][3] = 0.0;
89 m[0][3] =
m[1][3] =
m[2][3] = 0.0;
109 for (
int i = 0; i < 4; ++i)
122 for (
int i = 0; i < 4; ++i)
165 T sinH = sin(heading);
166 T cosH = cos(heading);
171 m[0][0] = cosH * cosB - sinH * sinP * sinB;
172 m[1][0] = -cosP * sinB;
173 m[2][0] = sinH * cosB + cosH * sinP * sinB;
175 m[0][1] = cosH * sinB + sinH * sinP * cosB;
176 m[1][1] = cosP * cosB;
177 m[2][1] = sinH * sinB + cosH * sinP * cosB;
179 m[0][2] = -sinH * cosP;
181 m[2][2] = cosH * cosP;
186 T sinH = sin(heading);
187 T cosH = cos(heading);
192 m[0][0] = cosB * cosH;
193 m[1][0] = -sinB * cosH;
196 m[0][1] = sinB * cosP + cosB * sinH * sinP;
197 m[1][1] = cosB * cosP - sinH * sinB * sinP;
198 m[2][1] = -cosH * sinP;
200 m[0][2] = sinB * sinP - cosB * sinH * cosP;
201 m[1][2] = cosB * sinP + sinH * sinB * cosP;
202 m[2][2] = cosH * cosP;
206 T m10, T m11, T m12, T m13,
207 T m20, T m21, T m22, T m23,
208 T m30, T m31, T m32, T m33)
210 m[0][0] = m00;
m[0][1] = m01;
m[0][2] = m02;
m[0][3] = m03;
211 m[1][0] = m10;
m[1][1] = m11;
m[1][2] = m12;
m[1][3] = m13;
212 m[2][0] = m20;
m[2][1] = m21;
m[2][2] = m22;
m[2][3] = m23;
213 m[3][0] = m30;
m[3][1] = m31;
m[3][2] = m32;
m[3][3] = m33;
236 for (
int i = 0; i < 4; ++i)
238 for (
int j = 0; j < 4; ++j)
249 for (
int i = 0; i < 4; ++i)
251 for (
int j = 0; j < 4; ++j)
253 r[i][j] =
m[i][0] * m1.
m[0][j] +
254 m[i][1] * m1.
m[1][j] +
255 m[i][2] * m1.
m[2][j] +
256 m[i][3] * m1.
m[3][j];
265 int indxc[4], indxr[4];
266 int ipiv[4] = { 0, 0, 0, 0 };
270 for (
int i = 0; i < 4; i++)
272 int irow = -1, icol = -1;
275 for (j = 0; j < 4; j++)
279 for (
int k = 0; k < 4; k++)
283 if (abs(minv.
m[j][k]) >= big)
285 big = abs(minv.
m[j][k]);
290 else if (ipiv[k] > 1)
return *
this;
298 for (
int k = 0; k < 4; ++k)
Swap(minv.
m[irow][k], minv.
m[icol][k]);
302 if (minv.
m[icol][icol] == 0.)
return *
this;
304 T pivinv = 1.f / minv.
m[icol][icol];
305 minv.
m[icol][icol] = 1.f;
306 for (j = 0; j < 4; j++) minv.
m[icol][j] *= pivinv;
308 for (j = 0; j < 4; j++)
312 T save = minv.
m[j][icol];
314 for (
int k = 0; k < 4; k++)
315 minv.
m[j][k] -= minv.
m[icol][k]*save;
320 for (j = 3; j >= 0; j--)
322 if (indxr[j] != indxc[j])
324 for (
int k = 0; k < 4; k++)
325 Swap(minv.
m[k][indxr[j]], minv.
m[k][indxc[j]]);
337 T xp = v.
x*
m[0][0] + v.
y*
m[1][0] + v.
z*
m[2][0] +
m[3][0];
338 T yp = v.
x*m[0][1] + v.
y*m[1][1] + v.
z*m[2][1] + m[3][1];
339 T zp = v.
x*m[0][2] + v.
y*m[1][2] + v.
z*m[2][2] + m[3][2];
357 T xp = v.
x*
m[0][0] + v.
y*
m[1][0] + v.
z*
m[2][0];
358 T yp = v.
x*
m[0][1] + v.
y*
m[1][1] + v.
z*
m[2][1];
359 T zp = v.
x*
m[0][2] + v.
y*
m[1][2] + v.
z*
m[2][2];
374 v->
x = x*
m[0][0] + y*
m[1][0] + z*
m[2][0] +
m[3][0];
375 v->
y = x*m[0][1] + y*m[1][1] + z*m[2][1] + m[3][1];
376 v->
z = x*m[0][2] + y*m[1][2] + z*m[2][2] + m[3][2];
377 T w = x*m[0][3] + y*m[1][3] + z*m[2][3] + m[3][3];
392 v.
x*
m[0][1] + v.
y*
m[1][1] + v.
z*
m[2][1],
393 v.
x*
m[0][2] + v.
y*
m[1][2] + v.
z*
m[2][2]);
408 #endif // MATRIX4X4_H