Cours Monde3D 2017 05-Transformations

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 17

Transformations

[email protected]

http://www.labri.fr/perso/pbenard/teaching/mondes3d
Les transformations mises en jeu

repère
caméra
repère
lumière
(spot)
ML
Mc
viewport pr
pe ojec
S rs tio
pe
cti n
ve
Pc
repère
scène
repère
local

Mo
repère
image
Rappels sur les Transformations

• Utilisation des coordonnées homogènes


– point euclidien :
• v=(x,y,z,w) ~ v'=(x',y',z') = (x/w, y/w, z/w) si w ≠ 0
– vecteur/direction : w = 0 (point à l'infini !)
– transformations affines représentées par produit matriciel
• v' = M * v v = M-1 * v'
– enchaînement de transformations = multiplication
matricielle
• v' = T * R * v
– ATTENTION :
non commutatif ! y y

T*R*v ≠ R*T*v
x x
Transformations élémentaires
y
• Translation :
y
• Eigen :
– v' = v + t; x
– v' = Translation3f(t) * v;
– v' = Translation3f(tx,ty,tz) * v; x
• Mise à l'echelle : y
• Eigen :
– v' = s * v ;
– v' = Scaling3f(sx,sy,sz) * v x
– v' = Vector3f(sx,sy,sz).asDiagonal() * v
• Rotation :
• Eigen :
– v' = AngleAxis3f(angle,axis) * v; y y
– Matrix3f R = Matrix3f(AngleAxis3f(angle,axis)); x
– Quaternion q = AngleAxis3f(angle,axis) ;
x
Combinaison

• Combination with Eigen :

• Affine3f M = AngleAxisf(angle1,axis1)
* Translation3f(t1)
* Scaling3f(s1)
* AngleAxisf(angle2,axis2) ;
Transformation des normales

• Problème d'une mise à l'échelle non uniforme M :

n' = M * n correct
=> Faux !

• Règle: utiliser la transposée de l'inverse:


– Soit M la matrice 3x3 de transformation courante:
v' = M * v + T
– Alors :
n' = (M-1)t * n
Les transformations mises en jeu

repère
caméra
repère
lumière
(spot)
ML
Mc
viewport

ct n
ive
rs tio
pe ojec
S PL

pe
pr
repère
scène
repère
local

Mo
repère
image
“Penser” les transformations
• Approche “repère global” • Approche “repère local”
– le repère reste fixe – chaque transformations
– définir les transformations affecte le repère courant
de droite à gauche – “amener” le repère dans la
position/orientation voulue
– composer de gauche à
droite
R*T*v
y
x

y y
y
x

x x
Transformation de visualisation
y
• Permet de positionner la caméra
z
transformation de visualisation x
~ inverse du repère local

x
z

• Exercice : positionner et orienter la caméra :


• Matrix4f lookAt(const Vector3f& p, // position de la caméra
const Vector3f& t, // point de visé (target)
const Vector3f& u) // vecteur “hauteur” (up)
Rastérisation

projection des 3 sommets


→ triangle en 2D

• Rastérisation
– Pour chaque primitive P_i, trouver les rayons intersectant P_i
– Rendu en deux étapes
• projection des primitives sur l'écran (forward projection)
• discrétisation (conversion des primitives 2D en pixels)
Transformation de projection
• Projection perspective : top
left

bottom
near right
far
Transformation de projection
• Projection perspective :
aspect=w/h

fovy
w h

near
far

• Exercice : écrire une fonction :


Matrix4f makePerspective(float fov, float aspect, float n, float f)
Transformation de projection
• Projection orthogonale top

left
toward right
the
viewpoint
bottom
near
far
Vertex pipeline : résumé

Sommets exprimés dans le


repère local de l'objet (3D)

Vertex local → global → camera → projection


Shader
Sommets exprimés dans le repère
de la caméra normalisé (3D)
Division (coordonnées homogènes)
perspective
Coordonnées écran normalisé
(réel entre [-1..1] , 2D)
Viewport

Coordonnées écran (entier entre [0..w] , 2D)


Viewport = zone rectangulaire de la fenêtre
glViewport(GLint x, GLint y, GLint w, GLint h)
API

GLSL C++ (Eigen)


vecteur 2D vec2 Vector2f
vecteur 3D vec3 Vector3f
vecteur 4D vec4 Vector4f
matrice 2x2 mat2,mat2x2 Matrix2f
matrice 3x3 mat3,mat3x3 Matrix3f
matrice 4x4 mat4,mat4x4 Matrix4f
matrice 3x4 mat3x4 Matrix<float,3,4>

accès v.x v.x(), v[0], v(0)


v.y v.y(), v[1], v(1)
v.z v.z(), v[2], v(2)
v.w v.w(), v[3], v(3)

(i=ligne,j=colone) M[j][i] M(i,j)


colone d'une matrice M[j] M.col(j)
ligne d'une matrice M.row(i)
sous-matrice M.block(i,j,rows,cols)
API

GLSL C++ (Eigen)


produits M * v M * v
M1 * M2 M1 * M2
transpose transpose(M) M.transpose()
combinaison linéaire a*v1 + b*v2 a*v1 + b*v2
produit scalaire dot(v1,v2) v1.dot(v2)
v1.transpose()*v2
longueur/norme length(v) v.norm()
produit vectoriel v3 = cross(v1,v2) v3 = v1.cross(v2)
Eigen

Initialisation
Matrix3 M ;
M << 1, 2, 3,
4, 5, 6,
7, 8, 9;
Translation par un vecteur v Translation3f(v)
Rotation d'un angle theta autour AngleAxisf(theta,v)
d'un axe v M = Matrix3f(AngleAxisf(theta,v))
Mise à l'échelle Scaling3f(v)
Scaling3f(s0, s1, s2)
Transformation affine Affine3f A ;
partie linéaire (3x3) A.linear()
translation A.translation()
matrice 4x4 A.matrix()
Exemple :

Affine3f A ;
A = Translation3f(p) * AngleAxisf(theta,v) * Translation3f(-p) ;
v2 = A * v1 ;

Vous aimerez peut-être aussi