12 return ((
float) M_PI / 180) * deg;
17 return (180 / (
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;
52 for(
int i= 0; i < 4; i++)
53 column(i, matrix[4*i], matrix[4*i+1], matrix[4*i+2], matrix[4*i+3]);
59 for(
int i= 0; i < 4; i++)
60 row(i, matrix[4*i], matrix[4*i+1], matrix[4*i+2], matrix[4*i+3]);
66 m[0][0] = x.x; m[0][1] = y.x; m[0][2] = z.x; m[0][3] = w.x;
67 m[1][0] = x.y; m[1][1] = y.y; m[1][2] = z.y; m[1][3] = w.y;
68 m[2][0] = x.z; m[2][1] = y.z; m[2][2] = z.z; m[2][3] = w.z;
69 m[3][0] = 0; m[3][1] = 0; m[3][2] = 0; m[3][3] = 1;
74 assert(c >= 0 && c <= 3);
75 return Vector(m[0][c], m[1][c], m[2][c]);
86 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3];
87 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3];
88 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3];
89 float wt= m[3][0] * x + m[3][1] * y + m[3][2] * z + m[3][3];
94 return Point(xt, yt, zt);
96 return Point(xt*w, yt*w, zt*w);
106 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z;
107 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z;
108 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z;
111 return Vector(xt, yt, zt);
122 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3] * w;
123 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3] * w;
124 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3] * w;
125 float wt= m[3][0] * x + m[3][1] * y + m[3][2] * z + m[3][3] * w;
127 return vec4(xt, yt, zt, wt);
134 m[0][0], m[1][0], m[2][0], m[3][0],
135 m[0][1], m[1][1], m[2][1], m[3][1],
136 m[0][2], m[1][2], m[2][2], m[3][2],
137 m[0][3], m[1][3], m[2][3], m[3][3]);
239 a.x * a.x + (1 - a.x * a.x ) * c,
240 a.x * a.y * (1 - c ) - a.z * s,
241 a.x * a.z * (1 - c ) + a.y * s,
244 a.x * a.y * (1 - c ) + a.z * s,
245 a.y * a.y + (1 - a.y * a.y ) * c,
246 a.y * a.z * (1 - c ) - a.x * s,
249 a.x * a.z * (1 - c ) - a.y * s,
250 a.y * a.z * (1 - c ) + a.x * s,
251 a.z * a.z + (1 - a.z * a.z ) * c,
267 if(s <
float(0.00001))
269 return Scale(std::copysign(c, 1));
276 w.x * w.x + (1 - w.x * w.x ) * c,
277 w.x * w.y * (1 - c ) - w.z * s,
278 w.x * w.z * (1 - c ) + w.y * s,
281 w.x * w.y * (1 - c ) + w.z * s,
282 w.y * w.y + (1 - w.y * w.y ) * c,
283 w.y * w.z * (1 - c ) - w.x * s,
286 w.x * w.z * (1 - c ) - w.y * s,
287 w.y * w.z * (1 - c ) + w.x * s,
288 w.z * w.z + (1 - w.z * w.z ) * c,
298 float itan= 1 / tanf(
radians(fov) * 0.5f);
299 float id= 1 / (znear - zfar);
302 itan/aspect, 0, 0, 0,
304 0, 0, (zfar+znear)*
id, 2.f*zfar*znear*
id,
309Transform Ortho(
const float left,
const float right,
const float bottom,
const float top,
const float znear,
const float zfar )
311 float tx= - (right + left) / (right - left);
312 float ty= - (top + bottom) / (top - bottom);
313 float tz= - (zfar + znear) / (zfar - znear);
316 2.f / (right - left), 0, 0, tx,
317 0, 2.f / (top - bottom), 0, ty,
318 0, 0, -2.f / (zfar - znear), tz,
325 float w= width / 2.f;
326 float h= height / 2.f;
342 right.x, newUp.x, -dir.x, from.x,
343 right.y, newUp.y, -dir.y, from.y,
344 right.z, newUp.z, -dir.z, from.z,
353 for(
int i = 0; i < 4; i++)
354 for(
int j = 0; j < 4; j++)
355 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];
369 int indxc[4], indxr[4];
370 int ipiv[4] = { 0, 0, 0, 0 };
372 for (
int i = 0; i < 4; i++) {
373 int irow = -1, icol = -1;
377 for (
int j = 0; j < 4; j++) {
379 for (
int k = 0; k < 4; k++) {
381 if (fabsf(minv.m[j][k]) >= big) {
382 big = std::abs(minv.m[j][k]);
387 else if (ipiv[k] > 1)
388 printf(
"singular matrix in Transform::inverse()\n");
393 assert(irow >= 0 && irow < 4);
394 assert(icol >= 0 && icol < 4);
399 for (
int k = 0; k < 4; ++k)
400 std::swap(minv.m[irow][k], minv.m[icol][k]);
405 if (minv.m[icol][icol] == 0.)
406 printf(
"singular matrix in Transform::inverse()\n");
409 float pivinv = 1.f / minv.m[icol][icol];
410 minv.m[icol][icol] = 1.f;
411 for (
int j = 0; j < 4; j++)
412 minv.m[icol][j] *= pivinv;
415 for (
int j = 0; j < 4; j++) {
417 float save = minv.m[j][icol];
419 for (
int k = 0; k < 4; k++)
420 minv.m[j][k] -= minv.m[icol][k]*save;
426 for (
int j = 3; j >= 0; j--) {
427 if (indxr[j] != indxc[j]) {
428 for (
int k = 0; k < 4; k++)
429 std::swap(minv.m[k][indxr[j]], minv.m[k][indxc[j]]);
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.