13 const float pi = 3.1415926535f;
14 return (pi / 180.f) * deg;
19 const float pi = 3.1415926535f;
20 return (180.f / pi) * rad;
24 const float t00,
const float t01,
const float t02,
const float t03,
25 const float t10,
const float t11,
const float t12,
const float t13,
26 const float t20,
const float t21,
const float t22,
const float t23,
27 const float t30,
const float t31,
const float t32,
const float t33 )
29 m[0][0]= t00; m[0][1]= t01; m[0][2]= t02; m[0][3]= t03;
30 m[1][0]= t10; m[1][1]= t11; m[1][2]= t12; m[1][3]= t13;
31 m[2][0]= t20; m[2][1]= t21; m[2][2]= t22; m[2][3]= t23;
32 m[3][0]= t30; m[3][1]= t31; m[3][2]= t32; m[3][3]= t33;
42 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3];
43 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3];
44 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3];
45 float wt= m[3][0] * x + m[3][1] * y + m[3][2] * z + m[3][3];
50 return Point(xt, yt, zt);
52 return Point(xt*w, yt*w, zt*w);
62 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z;
63 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z;
64 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z;
78 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3] * w;
79 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3] * w;
80 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3] * w;
81 float wt= m[3][0] * x + m[3][1] * y + m[3][2] * z + m[3][3] * w;
83 return vec4(xt, yt, zt, wt);
90 m[0][0], m[1][0], m[2][0], m[3][0],
91 m[0][1], m[1][1], m[2][1], m[3][1],
92 m[0][2], m[1][2], m[2][2], m[3][2],
93 m[0][3], m[1][3], m[2][3], m[3][3]);
189 a.x * a.x + (1 - a.x * a.x ) * c,
190 a.x * a.y * (1 - c ) - a.z * s,
191 a.x * a.z * (1 - c ) + a.y * s,
194 a.x * a.y * (1 - c ) + a.z * s,
195 a.y * a.y + (1 - a.y * a.y ) * c,
196 a.y * a.z * (1 - c ) - a.x * s,
199 a.x * a.z * (1 - c ) - a.y * s,
200 a.y * a.z * (1 - c ) + a.x * s,
201 a.z * a.z + (1 - a.z * a.z ) * c,
211 float itan= 1 / tanf(
radians(fov) * 0.5f);
212 float id= 1 / (znear - zfar);
215 itan/aspect, 0, 0, 0,
217 0, 0, (zfar+znear)*
id, 2.f*zfar*znear*
id,
223 float w= width / 2.f;
224 float h= height / 2.f;
240 right.x, newUp.x, -dir.x, from.x,
241 right.y, newUp.y, -dir.y, from.y,
242 right.z, newUp.z, -dir.z, from.z,
251 for(
int i = 0; i < 4; i++)
252 for(
int j = 0; j < 4; j++)
253 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];
267 int indxc[4], indxr[4];
268 int ipiv[4] = { 0, 0, 0, 0 };
270 for (
int i = 0; i < 4; i++) {
271 int irow = -1, icol = -1;
275 for (
int j = 0; j < 4; j++) {
277 for (
int k = 0; k < 4; k++) {
279 if (fabsf(minv.m[j][k]) >= big) {
280 big = std::abs(minv.m[j][k]);
285 else if (ipiv[k] > 1)
286 printf(
"singular matrix in make_inverse()\n");
291 assert(irow >= 0 && irow < 4);
292 assert(icol >= 0 && icol < 4);
297 for (
int k = 0; k < 4; ++k)
298 std::swap(minv.m[irow][k], minv.m[icol][k]);
303 if (minv.m[icol][icol] == 0.)
304 printf(
"singular matrix in make_inverse()\n");
307 float pivinv = 1.f / minv.m[icol][icol];
308 minv.m[icol][icol] = 1.f;
309 for (
int j = 0; j < 4; j++)
310 minv.m[icol][j] *= pivinv;
313 for (
int j = 0; j < 4; j++) {
315 float save = minv.m[j][icol];
317 for (
int k = 0; k < 4; k++)
318 minv.m[j][k] -= minv.m[icol][k]*save;
324 for (
int j = 3; j >= 0; j--) {
325 if (indxr[j] != indxc[j]) {
326 for (
int k = 0; k < 4; k++)
327 std::swap(minv.m[k][indxr[j]], minv.m[k][indxc[j]]);
float degrees(const float rad)
conversion en degres.
Vector normalize(const Vector &v)
renvoie un vecteur unitaire / longueur == 1.
Transform Transpose(const Transform &m)
renvoie la transposee de la matrice.
Transform operator*(const Transform &a, const Transform &b)
renvoie la composition des transformations a et b, t = a * b.
Transform Identity()
construit la transformation identite.
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
vecteur generique 4d, ou 3d homogene, utilitaire.
float radians(const float deg)
conversion en radians.
Transform Normal(const Transform &m)
renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m...
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
representation d'un vecteur 3d.
Transform RotationX(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe X. ...
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 Rotation(const Vector &axis, const float angle)
renvoie la matrice representation une rotation de angle degree autour de l'axe axis.
Transform compose_transform(const Transform &a, const Transform &b)
renvoie la composition des transformations a et b, t= a * b.
Transform Scale(const float x, const float y, const float z)
renvoie la matrice representant une mise a l'echelle / etirement.
Transform Translation(const Vector &v)
renvoie la matrice representant une translation par un vecteur.
Transform RotationZ(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe Z. ...
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 Perspective(const float fov, const float aspect, const float znear, const float zfar)
renvoie la matrice representant une transformation projection perspective.
representation d'un point 3d.
Vector cross(const Vector &u, const Vector &v)
renvoie le produit vectoriel de 2 vecteurs.
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.