gKit3
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | List of all members

representation d'une transformation, une matrice 4x4, organisee par ligne / row major. More...

#include <mat.h>

Public Member Functions

 Transform (const float t00=1, const float t01=0, const float t02=0, const float t03=0, const float t10=0, const float t11=1, const float t12=0, const float t13=0, const float t20=0, const float t21=0, const float t22=1, const float t23=0, const float t30=0, const float t31=0, const float t32=0, const float t33=1)
 constructeur.
 
 Transform (const Vector &x, const Vector &y, const Vector &z, const Vector &w)
 constructeur a partir de 4 Vector colonnes, met (0, 0, 0, 1) dans la 4e ligne
 
Transformcolumn (const int id, const float t0, const float t1, const float t2, const float t3)
 initialise une colonne de la matrice a partir de 4 floats.
 
Transformrow (const int id, const float t0, const float t1, const float t2, const float t3)
 initialise une ligne de la matrice.
 
Transformcolumn_major (const float matrix[16])
 initialise la matrice avec 16 floats organises par colonne.
 
Transformrow_major (const float matrix[16])
 initialise la matrice avec 16 floats organises par ligne.
 
Vector operator[] (const int c) const
 renvoie le Vector colonne c de la matrice
 
Point operator() (const Point &p) const
 renvoie le point transforme.
 
Vector operator() (const Vector &v) const
 renvoie le vecteur transforme.
 
vec4 operator() (const vec4 &v) const
 renvoie le point/vecteur homogene transforme.
 
Transform operator() (const Transform &b) const
 renvoie la composition de la transformation this et b, t = this * b. permet de transformer un point sans "ambiguite" Point q= a(b(c(p)));
 
Transform transpose () const
 renvoie la transposee de la matrice.
 
Transform inverse () const
 renvoie l'inverse de la matrice.
 
Transform normal () const
 renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.
 
const float * data () const
 renvoie l'adresse de la premiere valeur de la matrice.
 

Public Attributes

float m [4][4]
 

Detailed Description

representation d'une transformation, une matrice 4x4, organisee par ligne / row major.

Definition at line 20 of file mat.h.

Constructor & Destructor Documentation

◆ Transform() [1/2]

Transform::Transform ( const float  t00 = 1,
const float  t01 = 0,
const float  t02 = 0,
const float  t03 = 0,
const float  t10 = 0,
const float  t11 = 1,
const float  t12 = 0,
const float  t13 = 0,
const float  t20 = 0,
const float  t21 = 0,
const float  t22 = 1,
const float  t23 = 0,
const float  t30 = 0,
const float  t31 = 0,
const float  t32 = 0,
const float  t33 = 1 
)

constructeur.

Definition at line 20 of file mat.cpp.

25{
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;
30}

◆ Transform() [2/2]

Transform::Transform ( const Vector x,
const Vector y,
const Vector z,
const Vector w 
)

constructeur a partir de 4 Vector colonnes, met (0, 0, 0, 1) dans la 4e ligne

Definition at line 64 of file mat.cpp.

65{
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;
70}

Member Function Documentation

◆ column()

Transform & Transform::column ( const int  id,
const float  t0,
const float  t1,
const float  t2,
const float  t3 
)

initialise une colonne de la matrice a partir de 4 floats.

Definition at line 32 of file mat.cpp.

33{
34 m[0][id]= t0;
35 m[1][id]= t1;
36 m[2][id]= t2;
37 m[3][id]= t3;
38 return *this;
39}

◆ row()

Transform & Transform::row ( const int  id,
const float  t0,
const float  t1,
const float  t2,
const float  t3 
)

initialise une ligne de la matrice.

Definition at line 41 of file mat.cpp.

42{
43 m[id][0]= t0;
44 m[id][1]= t1;
45 m[id][2]= t2;
46 m[id][3]= t3;
47 return *this;
48}

◆ column_major()

Transform & Transform::column_major ( const float  matrix[16])

initialise la matrice avec 16 floats organises par colonne.

Definition at line 50 of file mat.cpp.

51{
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]);
54 return *this;
55}
Transform & column(const int id, const float t0, const float t1, const float t2, const float t3)
initialise une colonne de la matrice a partir de 4 floats.
Definition mat.cpp:32

◆ row_major()

Transform & Transform::row_major ( const float  matrix[16])

initialise la matrice avec 16 floats organises par ligne.

Definition at line 57 of file mat.cpp.

58{
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]);
61 return *this;
62}
Transform & row(const int id, const float t0, const float t1, const float t2, const float t3)
initialise une ligne de la matrice.
Definition mat.cpp:41

◆ operator[]()

Vector Transform::operator[] ( const int  c) const

renvoie le Vector colonne c de la matrice

Definition at line 72 of file mat.cpp.

73{
74 assert(c >= 0 && c <= 3);
75 return Vector(m[0][c], m[1][c], m[2][c]);
76}
representation d'un vecteur 3d.
Definition vec.h:58

◆ operator()() [1/4]

Point Transform::operator() ( const Point p) const

renvoie le point transforme.

Definition at line 80 of file mat.cpp.

81{
82 float x= p.x;
83 float y= p.y;
84 float z= p.z;
85
86 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3]; // dot(vec4(m[0]), vec4(p, 1))
87 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3]; // dot(vec4(m[1]), vec4(p, 1))
88 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3]; // dot(vec4(m[2]), vec4(p, 1))
89 float wt= m[3][0] * x + m[3][1] * y + m[3][2] * z + m[3][3]; // dot(vec4(m[3]), vec4(p, 1))
90
91 assert(wt != 0);
92 float w= 1.f / wt;
93 if(wt == 1.f)
94 return Point(xt, yt, zt);
95 else
96 return Point(xt*w, yt*w, zt*w);
97}
representation d'un point 3d.
Definition vec.h:21

◆ operator()() [2/4]

Vector Transform::operator() ( const Vector v) const

renvoie le vecteur transforme.

Definition at line 100 of file mat.cpp.

101{
102 float x= v.x;
103 float y= v.y;
104 float z= v.z;
105
106 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z; // dot(vec4(m[0]), vec4(v, 0))
107 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z; // dot(vec4(m[1]), vec4(v, 0))
108 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z; // dot(vec4(m[2]), vec4(v, 0))
109 // dot(vec4(m[3]), vec4(v, 0)) == dot(vec4(0, 0, 0, 1), vec4(v, 0)) == 0 par definition
110
111 return Vector(xt, yt, zt);
112}

◆ operator()() [3/4]

vec4 Transform::operator() ( const vec4 v) const

renvoie le point/vecteur homogene transforme.

Definition at line 115 of file mat.cpp.

116{
117 float x= v.x;
118 float y= v.y;
119 float z= v.z;
120 float w= v.w;
121
122 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3] * w; // dot(vec4(m[0]), v)
123 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3] * w; // dot(vec4(m[1]), v)
124 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3] * w; // dot(vec4(m[2]), v)
125 float wt= m[3][0] * x + m[3][1] * y + m[3][2] * z + m[3][3] * w; // dot(vec4(m[3]), v)
126
127 return vec4(xt, yt, zt, wt);
128}
vecteur generique 4d, ou 3d homogene, utilitaire.
Definition vec.h:171

◆ operator()() [4/4]

Transform Transform::operator() ( const Transform b) const

renvoie la composition de la transformation this et b, t = this * b. permet de transformer un point sans "ambiguite" Point q= a(b(c(p)));

Definition at line 141 of file mat.cpp.

142{
143 return compose_transform(*this, b);
144}
Transform compose_transform(const Transform &a, const Transform &b)
renvoie la composition des transformations a et b, t= a * b.
Definition mat.cpp:350

◆ transpose()

Transform Transform::transpose ( ) const

renvoie la transposee de la matrice.

Definition at line 131 of file mat.cpp.

132{
133 return Transform(
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]);
138}
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition mat.h:21

◆ inverse()

Transform Transform::inverse ( ) const

renvoie l'inverse de la matrice.

Definition at line 365 of file mat.cpp.

366{
367 Transform minv= *this;
368
369 int indxc[4], indxr[4];
370 int ipiv[4] = { 0, 0, 0, 0 };
371
372 for (int i = 0; i < 4; i++) {
373 int irow = -1, icol = -1;
374 float big = 0.f;
375
376 // Choose pivot
377 for (int j = 0; j < 4; j++) {
378 if (ipiv[j] != 1) {
379 for (int k = 0; k < 4; k++) {
380 if (ipiv[k] == 0) {
381 if (fabsf(minv.m[j][k]) >= big) {
382 big = std::abs(minv.m[j][k]);
383 irow = j;
384 icol = k;
385 }
386 }
387 else if (ipiv[k] > 1)
388 printf("singular matrix in Transform::inverse()\n");
389 }
390 }
391 }
392
393 assert(irow >= 0 && irow < 4);
394 assert(icol >= 0 && icol < 4);
395
396 ++ipiv[icol];
397 // Swap rows _irow_ and _icol_ for pivot
398 if (irow != icol) {
399 for (int k = 0; k < 4; ++k)
400 std::swap(minv.m[irow][k], minv.m[icol][k]);
401 }
402
403 indxr[i] = irow;
404 indxc[i] = icol;
405 if (minv.m[icol][icol] == 0.)
406 printf("singular matrix in Transform::inverse()\n");
407
408 // Set $m[icol][icol]$ to one by scaling row _icol_ appropriately
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;
413
414 // Subtract this row from others to zero out their columns
415 for (int j = 0; j < 4; j++) {
416 if (j != icol) {
417 float save = minv.m[j][icol];
418 minv.m[j][icol] = 0;
419 for (int k = 0; k < 4; k++)
420 minv.m[j][k] -= minv.m[icol][k]*save;
421 }
422 }
423 }
424
425 // Swap columns to reflect permutation
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]]);
430 }
431 }
432
433 return minv;
434}

◆ normal()

Transform Transform::normal ( ) const

renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.

Definition at line 147 of file mat.cpp.

148{
149 return inverse().transpose();
150}
Transform inverse() const
renvoie l'inverse de la matrice.
Definition mat.cpp:365
Transform transpose() const
renvoie la transposee de la matrice.
Definition mat.cpp:131

◆ data()

const float * Transform::data ( ) const
inline

renvoie l'adresse de la premiere valeur de la matrice.

Definition at line 65 of file mat.h.

65{ return &m[0][0]; }

Member Data Documentation

◆ m

float Transform::m[4][4]

Definition at line 67 of file mat.h.


The documentation for this struct was generated from the following files: