12 return ((
float) M_PI / 180.f) * deg;
17 return (180.f / (
float) M_PI) * rad;
21 const float t00,
const float t01,
const float t02,
const float t03,
22 const float t10,
const float t11,
const float t12,
const float t13,
23 const float t20,
const float t21,
const float t22,
const float t23,
24 const float t30,
const float t31,
const float t32,
const float t33 )
26 m[0][0]= t00; m[0][1]= t01; m[0][2]= t02; m[0][3]= t03;
27 m[1][0]= t10; m[1][1]= t11; m[1][2]= t12; m[1][3]= t13;
28 m[2][0]= t20; m[2][1]= t21; m[2][2]= t22; m[2][3]= t23;
29 m[3][0]= t30; m[3][1]= t31; m[3][2]= t32; m[3][3]= t33;
44 return vec4(m[0][
id], m[1][
id], m[2][
id], m[3][
id]);
50 return vec4(m[0][
id], m[1][
id], m[2][
id], m[3][
id]);
66 return vec4(m[
id][0], m[
id][1], m[
id][2], m[
id][3]);
72 return vec4(m[
id][0], m[
id][1], m[
id][2], m[
id][3]);
78 for(
int i= 0; i < 4; i++)
79 column(i, matrix[4*i], matrix[4*i+1], matrix[4*i+2], matrix[4*i+3]);
85 for(
int i= 0; i < 4; i++)
86 row(i, matrix[4*i], matrix[4*i+1], matrix[4*i+2], matrix[4*i+3]);
92 m[0][0] = x.x; m[0][1] = y.x; m[0][2] = z.x; m[0][3] = w.x;
93 m[1][0] = x.y; m[1][1] = y.y; m[1][2] = z.y; m[1][3] = w.y;
94 m[2][0] = x.z; m[2][1] = y.z; m[2][2] = z.z; m[2][3] = w.z;
95 m[3][0] = 0; m[3][1] = 0; m[3][2] = 0; m[3][3] = 1;
100 m[0][0] = x.x; m[0][1] = y.x; m[0][2] = z.x; m[0][3] = w.x;
101 m[1][0] = x.y; m[1][1] = y.y; m[1][2] = z.y; m[1][3] = w.y;
102 m[2][0] = x.z; m[2][1] = y.z; m[2][2] = z.z; m[2][3] = w.z;
103 m[3][0] = x.w; m[3][1] = y.w; m[3][2] = z.w; m[3][3] = w.w;
109 return Vector(m[0][c], m[1][c], m[2][c]);
120 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3];
121 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3];
122 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3];
123 float wt= m[3][0] * x + m[3][1] * y + m[3][2] * z + m[3][3];
128 return Point(xt, yt, zt);
130 return Point(xt*w, yt*w, zt*w);
140 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z;
141 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z;
142 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z;
145 return Vector(xt, yt, zt);
156 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3] * w;
157 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3] * w;
158 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3] * w;
159 float wt= m[3][0] * x + m[3][1] * y + m[3][2] * z + m[3][3] * w;
161 return vec4(xt, yt, zt, wt);
168 m[0][0], m[1][0], m[2][0], m[3][0],
169 m[0][1], m[1][1], m[2][1], m[3][1],
170 m[0][2], m[1][2], m[2][2], m[3][2],
171 m[0][3], m[1][3], m[2][3], m[3][3]);
273 a.x * a.x + (1 - a.x * a.x ) * c,
274 a.x * a.y * (1 - c ) - a.z * s,
275 a.x * a.z * (1 - c ) + a.y * s,
278 a.x * a.y * (1 - c ) + a.z * s,
279 a.y * a.y + (1 - a.y * a.y ) * c,
280 a.y * a.z * (1 - c ) - a.x * s,
283 a.x * a.z * (1 - c ) - a.y * s,
284 a.y * a.z * (1 - c ) + a.x * s,
285 a.z * a.z + (1 - a.z * a.z ) * c,
301 if(s <
float(0.00001))
303 return Scale(std::copysign(c, 1));
310 w.x * w.x + (1 - w.x * w.x ) * c,
311 w.x * w.y * (1 - c ) - w.z * s,
312 w.x * w.z * (1 - c ) + w.y * s,
315 w.x * w.y * (1 - c ) + w.z * s,
316 w.y * w.y + (1 - w.y * w.y ) * c,
317 w.y * w.z * (1 - c ) - w.x * s,
320 w.x * w.z * (1 - c ) - w.y * s,
321 w.y * w.z * (1 - c ) + w.x * s,
322 w.z * w.z + (1 - w.z * w.z ) * c,
332 float itan= 1 / tanf(
radians(fov) * 0.5f);
333 float id= 1 / (znear - zfar);
336 itan/aspect, 0, 0, 0,
338 0, 0, (zfar+znear)*
id, 2.f*zfar*znear*
id,
343 Transform Ortho(
const float left,
const float right,
const float bottom,
const float top,
const float znear,
const float zfar )
345 float tx= - (right + left) / (right - left);
346 float ty= - (top + bottom) / (top - bottom);
347 float tz= - (zfar + znear) / (zfar - znear);
350 2.f / (right - left), 0, 0, tx,
351 0, 2.f / (top - bottom), 0, ty,
352 0, 0, -2.f / (zfar - znear), tz,
359 float w= width / 2.f;
360 float h= height / 2.f;
376 right.x, newUp.x, -dir.x, from.x,
377 right.y, newUp.y, -dir.y, from.y,
378 right.z, newUp.z, -dir.z, from.z,
387 for(
int i = 0; i < 4; i++)
388 for(
int j = 0; j < 4; j++)
389 m.m[i][j]= a.m[i][0] * b.m[0][j] + a.m[i][1] * b.m[1][j] + a.m[i][2] * b.m[2][j] + a.m[i][3] * b.m[3][j];
403 int indxc[4], indxr[4];
404 int ipiv[4] = { 0, 0, 0, 0 };
406 for (
int i = 0; i < 4; i++) {
407 int irow = -1, icol = -1;
411 for (
int j = 0; j < 4; j++) {
413 for (
int k = 0; k < 4; k++) {
415 if (fabsf(minv.m[j][k]) >= big) {
416 big = std::abs(minv.m[j][k]);
421 else if (ipiv[k] > 1)
422 printf(
"singular matrix in Transform::inverse()\n");
427 assert(irow >= 0 && irow < 4);
428 assert(icol >= 0 && icol < 4);
433 for (
int k = 0; k < 4; ++k)
434 std::swap(minv.m[irow][k], minv.m[icol][k]);
439 if (minv.m[icol][icol] == 0.)
440 printf(
"singular matrix in Transform::inverse()\n");
443 float pivinv = 1.f / minv.m[icol][icol];
444 minv.m[icol][icol] = 1.f;
445 for (
int j = 0; j < 4; j++)
446 minv.m[icol][j] *= pivinv;
449 for (
int j = 0; j < 4; j++) {
451 float save = minv.m[j][icol];
453 for (
int k = 0; k < 4; k++)
454 minv.m[j][k] -= minv.m[icol][k]*save;
460 for (
int j = 3; j >= 0; j--) {
461 if (indxr[j] != indxc[j]) {
462 for (
int k = 0; k < 4; k++)
463 std::swap(minv.m[k][indxr[j]], minv.m[k][indxc[j]]);
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
Transform Transpose(const Transform &m)
renvoie la transposee de la matrice.
Transform Normal(const Transform &m)
renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.
Transform Rotation(const Vector &axis, const float angle)
renvoie la matrice representation une rotation de angle degree autour de l'axe axis.
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
float degrees(const float rad)
conversion en degres.
Transform Identity()
construit la transformation identite.
Transform RotationX(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe X.
Transform compose_transform(const Transform &a, const Transform &b)
renvoie la composition des transformations a et b, t= a * b.
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Transform Perspective(const float fov, const float aspect, const float znear, const float zfar)
renvoie la matrice representant une transformation projection perspective.
float dot(const Vector &u, const Vector &v)
renvoie le produit scalaire de 2 vecteurs.
Transform Ortho(const float left, const float right, const float bottom, const float top, const float znear, const float zfar)
renvoie la matrice representant une transformation orthographique, passage d'un cube []x[]x[] vers [-...
Transform operator*(const Transform &a, const Transform &b)
renvoie la composition des transformations a et b, t = a * b.
float radians(const float deg)
conversion en radians.
Vector normalize(const Vector &v)
renvoie un vecteur unitaire / longueur == 1.
Transform Translation(const Vector &v)
renvoie la matrice representant une translation par un vecteur.
Transform Lookat(const Point &from, const Point &to, const Vector &up)
renvoie la matrice representant le placement et l'orientation d'une camera pour observer le point to.
Transform RotationZ(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe Z.
float length(const Vector &v)
renvoie la longueur d'un vecteur.
Vector cross(const Vector &u, const Vector &v)
renvoie le produit vectoriel de 2 vecteurs.
Transform Scale(const float x, const float y, const float z)
renvoie la matrice representant une mise a l'echelle / etirement.
representation d'un point 3d.
representation d'un vecteur 3d.
vecteur generique 4d, ou 3d homogene, utilitaire.