Chapitre 3 : Repères et positionnement 3D Modélisation 3D et Synthèse Fabrice Aubert fabrice.aubert@lifl.fr Master Informatique 2014-2015 F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 1 / 58
1 Repères d une scène 3D F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 2 / 58
Repère 3D Z z A k Y y A O j i A x A X Repère noté (O,i,j,k) (origine et vecteurs de base). Un point : A = A x OA = A y ou A z A = (A x,a y,a z ). A = O + xi + yj + zk. Les repères considérés seront généralement directs : Règle de la main droite : (Pouce,Index,Majeur) = (X,Y,Z) Un repère est dit orthonormé si : Vecteurs (i, j, k) deux à deux orthogonaux. (i,j,k) de même normes 1. F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 3 / 58
Plusieurs repères On travaillera avec plusieurs repères : toujours préciser le repère en indice : Sur l exemple, un même point A a les coordonnées (x 1,y 1,z 1 ) dans le repère 1 et (x 2,y 2,z 2 ) dans le repère 2. y 1 y 2 A Repère 2 x 2 Repère 1 x 1 Noter A 1 ou A 2 selon le repère considéré. F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 4 / 58
Points et directions Différencier les positions (i.e. les points) et les directions (i.e. les vecteurs). Exemple : Le point A est déplacé au point A par le vecteur u. Le point B est déplacé au point B par le même vecteur u. Par le calcul : A = A + u et B = B + u. Remarque sur les notations : pas de "flêche" sur u. Par contre u = AA = BB. Pour les calculs, on utilisera souvent la relation : u = A A = B B. Attention : dans le code on représente généralement les positions et les directions par une même classe (Vector3 pour les tps). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 5 / 58
Scène 3D Pour la conception d une scène 3D et des objets 3D, nous considérons les repères suivants : Le repère de l observateur (ou repère de la caméra ; noté Eye dans la suite) : c est dans ce repère qu on définit le volume de visualisation (i.e. placement de l écran et définition des paramètres de la projection). Le repère local (ou repère objet ; noté Local dans la suite) : on conçoit un objet indépendamment du reste de la scène. On prendra le repère le plus naturel pour définir les points de l objet. Le repère du monde (ou repère de scène ; noté World dans la suite) : il s agit du repère de référence de tout positionnement. Nous placerons les repères les uns par rapport aux autres avec des changements de repères (en général par translations, rotations, changements d échelle). Le repère "initial" étant le repère de scène World. Les positions (x, y, z) des sommets seront données dans le repère Local de l objet qu ils définissent (en général). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 6 / 58
Scène 3D et OpenGL Nous savons déjà comment donner à OpenGL des positions P Eye = (x,y,z) définies dans le repère Eye (expression en clip coordinates avec la matrice de projection dans le vertex shader). Nous souhaitons à présent donner à OpenGL des positions P Local définies dans le repère de l objet à tracer. Il faudra donc indiquer à OpenGL : comment obtenir P Eye à partir de P Local : pour cela on indiquera comment est placé le repère Local par rapport au repère Eye (par changement de repères ; vu dans la suite du cours). comment obtenir P ClipCoordinates à partir de P Eye (par matrice de projection ; vu au chapitre précédent). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 7 / 58
2 Transformations et changement de repères F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 8 / 58
Exemple de la translation Rappel (cf introduction des coordonnées homogènes dans le chapitre précédent) : la t x translation de vecteur t = t y peut se traduire par une matrice en coordonnées t z homogènes : 1 0 0 t x T = 0 1 0 t y 0 0 1 t z 0 0 0 1 On donne, dans les transparents suivants, 3 interprétations de cette translation (avec les mêmes coordonnées P(x,y,z) et la même translation t dans les 3 cas). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 9 / 58
Interprétation par transformation On connait le point P(x,y,z) donné dans un repère 1 et on déplace le point P en P par la translation t. T appelée matrice de transformation. P = TP F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 10 / 58
Interprétation par changement de repère On connait le point P(x,y,z) exprimé dans un repère 2 et on sait que le repère 2 est déplacé par rapport au repère 1 par la translation t. Dans cette interprétation, on appelle T la matrice de passage du repère 1 au repère 2, et on la note M 1 2. On connait P 2 = P(x,y,z). On peut connaitre P 1 par : P 1 = M 1 2 P 2 avec P 2 = P et M 1 2 = T Remarque : P 1 correspond à P du transparent précédent (c est le même calcul). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 11 / 58
Interprétation inverse On connait le point P(x,y,z) donné dans le repère 1 et on se donne un repère 2 par rapport au repère 1 par la translation t. On a toujours la relation : P 1 = M 1 2 P 2 mais c est P 1 qu on connait : P 1 = P Si on souhaite P 2, on peut l obtenir par P 2 = M 2 1 P 1. M 2 1? obtenue par la translation opposée t. F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 12 / 58
Changement de repère (généralisation) P 1 = M 1 2 P 2 (bien noter la position et l ordre des indices dans la relation). M 1 2 dans la relation indique : comment le repère 2 est obtenu à partir du repère 1 permet d exprimer les coordonnées du point P dans le repère 1 à partir des coordonnées dans le repère 2. donc attention à la confusion "passer du repère 1 au repère 2" (dans ce cours : signifie "comment le repère 2 est obtenu à partir du repère 1", i.e. M 1 2 ). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 13 / 58
Rotation en 2D Rotation d angle θ autour de l origine. { x = x cos(θ) y sin(θ) Comment retrouver? Soit α l angle (i,op) et r = OP = OP. Alors { x = r cos(α + θ) y = r sin(α + θ) y = x sin(θ) + y cosθ { x = r cos(α)cos(θ) r sin(α)sin(θ) y = r cos(α)sin(θ) + r sin(α)cos(θ) or x = r cos(α) et y = r sin(α) ( P cosθ sinθ = RP avec R = sinθ cosθ ) F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 14 / 58
Rotation en 3D La rotation en 3D s effectue autour d un axe dont on donne un vecteur directeur u (rotations considérées : axe passant par l origine). Le sens de rotation est le sens trigonométrique par rapport à l axe («tourne» dans le sens direct quand le vecteur de l axe pointe vers vous). Exemple : autour de l axe z (droite de vecteur directeur (0,0,1)). R OZ = cosθ sinθ 0 sin θ cosθ 0 0 0 1 F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 15 / 58
Rotation 3D : autres axes R OX = 1 0 0 0 cos θ sinθ 0 sin θ cosθ Substituer Y à X et Z à Y R OY = cosθ 0 sinθ 0 1 0 sinθ 0 cosθ Substituer Z à X et X à Y (attention aux signes) La rotation autour d un axe de vecteur u quelconque est un peu plus laborieuse à exprimer. Avec c = cos(θ), s = sin(θ) et u = (u x,u y,u z ) normé. ux 2 + (1 ux 2 )c u x u y (1 c) u z s u x u z (1 c) + u y s u x u y (1 c) + u z s uy 2 + (1 uy 2 )c u y u z (1 c) u x s u x u z (1 c) u y s u y u z (1 c) + u x s uz 2 + (1 uz 2 )c F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 16 / 58
Rotation en coordonnées homogènes On ajoute une ligne et une colonne par rapport à la matrice 3D : P = RP ( R3D 0 R H = 0 1 ) F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 17 / 58
Scale Changement d échelle de rapport k. x = kx y = ky z = kz x = k x x peut être défini pour chaque coordonnée : y = k y y z = k z z P = SP avec S = k x 0 0 0 k y 0 0 0 k z F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 18 / 58
Scale en coordonnées homogènes S = k x 0 0 0 0 k y 0 0 0 0 k z 0 0 0 0 1 P = SP F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 19 / 58
Composition On obtient la composition en effectuant le produit des matrices homogènes des transformations/changements de repères successifs. Toute transformation/changement de repère (composition de translations/rotations/scales/projections) peut être représentée par une unique matrice. Attention à l interprétation entre transformations de coordonnées et changements de repères (voir l exemple transparent suivant) : La composition des transformations obtenue par T = T 1 T 2...T n consiste à appliquer à un point donné T n puis T n 1 puis... T 1 (lecture de droite à gauche). La composition des changements de repères obtenue par T 1 n = T 1 2 T 2 3...T n n+1 consiste à passer du repère 1 au repère n + 1 en passant par le repère 2, puis 3 puis... n + 1 (lecture de gauche à droite). On obtient bien sûr le même résultat si T 1 = T 1 2, T 2 = T 2 3, etc dans ces 2 interprétations (il s agit du même calcul). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 20 / 58
Exemple RT La rotation et la translation sont les mêmes dans les 2 interprétations suivantes : Transformations : P = RTP Repères : P 1 = R 1 2 T 2 3 P 3 F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 21 / 58
Exercice Soient deux translations de vecteurs T 1 (x 1,y 1,z 1 ) et T 2 (x 2,y 2,z 2 ). Appliquer T 1 au point A(x,y,z) avec les coordonnées homogènes et retrouver le résultat A = A + T 1. Quelle est la composition de T 1 et T 2 en coordonnées homogènes? (retrouver que le résultat est la translation T 1 + T 2 ). Appliquer la composition T 1 + T 2 au vecteur u(x,y,z). Quelle est la forme générale de la composition TR? Que constate-t-on quand on applique TR au vecteur u? F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 22 / 58
Changements inverses L inverse de M 1 2 (notée M 1 1 2 ) permet d obtenir M 2 1 Inverse d un produit de matrices : (M 1 M 2 M 3 ) 1 = M 1 3 M 1 2 M 1 1 (attention à l ordre!) Inverse d une composition de changements de repères : (M 1 2 M 2 3 M 3 4 ) 1 = M 4 3 M 3 2 M 2 1 Dans le cas général l inversion consiste à résoudre MM 1 = I (pivot de gauss, par calcul de déterminant,...), Mais l inverse s obtient aisément pour les transformations usuelles : La translation inverse de T est la translation de vecteur opposé T. La rotation inverse de R θ est la rotation d angle opposé R θ Le changement d échelle inverse de S(k x,k y,k z ) est S( 1 k x, 1 k y, 1 k z ). L inverse de toute matrice orthonormale (matrice 3 3 de rotation par exemple) s obtient en la transposant : a 0 b 0 c 0 1 a 0 a 1 a 2 a 1 b 1 c 1 = b 0 b 1 b 2 si orthonormal a 2 b 2 c 2 c 0 c 1 c 2 F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 23 / 58
Changements de repère et application 3D Le placement des objets dans la scène se traduit en donnant M World Local (on place Local par rapport à World). Nous verrons dans la suite que ce placement peut être décomposé (cf graphes de scènes). Le placement de l observateur (la caméra) dans la scène se traduit en donnant M World Eye (on place Eye par rapport à World). Pour un objet, les coordonnées d un point P Local sont données dans Local. Pour le tracé en OpenGL, il faut obtenir P Eye : On doit donc connaitre M Eye Local pour appliquer P Eye = M Eye Local P Local On l obtient en décomposant avec World : M Eye Local = M Eye World M World Local On dispose déjà de M World Local, et il faut inverser M World Eye pour avoir M Eye World : il reste alors à faire le produit. La détermination de M Eye Local est généralement assurée par l application, et on donne à OpenGL (i.e. au vertex shader) cette matrice M Eye Local. La matrice M Eye Local est appelée MODELVIEW. F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 24 / 58
Traduction en OpenGL On fournira au vertex shader : l attribut position exprimé dans le repère local (i.e. P Eye ). la modelview (i.e. M Eye Local ). la projection (i.e. M ClipCoordinate Eye ). Vertex Shader : in vec3 position ;... uniform mat4 projection ; uniform mat4 modelview ;... void main ( ) {... gl_position = projection modelview vec4 ( position, 1. 0 ) ; } Application : _shader. uniform ( " modelview ",p3d : : modelview ) ; / / p3d : : modelview gérée par l application ( variable " globale " ) _shader. uniform ( " projection ",p3d : : projection ) ; / / p3d : : projection gérée par l application ( " globale " ) gldraw... F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 25 / 58
Classe pour les matrices Nécessité d une classe pour gérer les matrices homogènes dans l application (dans les tps : Matrix4). Matrix4 m1,m2,m3; Vector3 p1,p2,u1, u2 ;... m1. setidentity ( ) ; / / i n i t i a l i s a t i o n m1. mul (m2 ) ; / / Attention! m u l t i p l i c a t i o n à d r o i t e! (changement de repère ). m1. translate (x, y, z ) ; / / compose avec la matrice de translation (à droite... ) m1. r o t a t e ( angle, axisx, axisy, axisz ) ; / / compose avec l a matrice de r o t a t i o n ( angle en degré ). m1. invert ( ) ; / / inverse l a matrice m1=m2 m3; / / p r o d u i t m1 =m2; / / produit ( i.e. m1=m1 m2) p1 = m1. transformpoint (p2 ) ; / / transformation d un p o i n t u1 = m1. transformdirection (u2 ) ; / / transformation d une d i r e c t i o n ( i.e. vecteur ). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 26 / 58
Attention aux notations! Dans le code, la matrice de passage M Rep1 Rep2 sera (généralement) représentée par la variable rep1rep2 (par exemple : worldlocal, eyeworld, etc). Le nom de la variable indique bien le changement de repère et non la transformation. Par exemple, si vous connaissez un point P_World et que vous souhaitez le connaitre dans le repère Eye, il faut appliquer P_Eye=eyeWorld.transformPoint(P_World) Attention à la confusion (interprétation par transformations de points/par changements de repères). bien comprendre l intérêt du raisonnement par changement de repères (notamment pour la composition et la conception). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 27 / 58
Exemple de code avec la modelview En décomposant avec world, eye et local : worldlocal. s e t I d e n t i t y ( ) ; worldeye. setidentity ( ) ; / / placement de l objet par rapport à world : world >local worldlocal. r o t a t e ( angle, 1, 0, 0 ) ; / / placement de l a camé ra par r a p p o r t à world : world >eye worldeye. translate (0,0,10); worldeye. r o t a t e ( 5, 0, 1, 0 ) ; p3d : : modelview = worldeye. inverse () worldlocal ; / / noter l inversion drawobject ( ) ; / / p3d : : modelview est passée au shader Avec uniquement la modelview (attention aux interprétations pour la caméra! l objet est placé directement par rapport à la caméra ; à proscrire pour des positionnements plus complexes) : p3d : : modelview. s e t I d e n t i t y ( ) ; / / placement de l a camé ra : eye >world p3d : : modelview. rotate ( 5,0,1,0); p3d : : modelview. translate (0,0, 10); / / traduction du placement de l objet : world >local p3d : : modelview. r o t a t e ( angle, 0, 1, 0 ) ; drawobject ( ) ; / / p3d : : modelview est passée au shader F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 28 / 58
3 Conception hiérarchique F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 29 / 58
Conception hiérarchique On peut généraliser l approche de placer les objets par rapport au monde, en les plaçant les uns par rapport aux autres : Le positionnement relatif des repères peut se représenter sous forme d arbre : Chaque branche se traduit par un changement de repère M parentnode childnode Chaque sous-arbre est conçu indépendamment de son parent (i.e. on associe à chaque noeud un drawnode sans se préoccuper du noeud parent). On remarque que les deux roues sont identiques dans leurs repères locaux (ce sera donc la même procédure qui tracera les deux roues). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 30 / 58
Traduction de la hiérarchie en OpenGL La matrice p3d::modelview=m Eye Local indique dans quel repère Local on se trouve (i.e. le repère courant). Descendre dans l arbre consiste à changer le repère courant (on applique le passage du noeud à son fils). Lorsqu un noeud a plusieurs enfants (tous placés par rapport au parent) : on doit mémoriser le repère du parent. Eviter de faire des inversions préférer mémoriser les repères. utilisation d une pile pour mémoriser p3d::modelview (i.e. p3d::modelview.push(); p3d::modelview.pop()). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 31 / 58
L exemple p3d::modelview.apply(r1,r2) est du pseudo code : correspond à une suite d instructions (translate, rotate, etc) qui modifie la modelview pour traduire le changement de repère de R1 à R2 : void drawwheel ( ) { / / repè re l o c a l à une roue p3d : : modelview. push ( ) ; / / par pr é caution ( i n u t i l e i c i ). drawsquare ( ) ; p3d : : modelview. pop ( ) ; } void drawcar ( ) { / / repè re l o c a l à une v o i t u r e p3d : : modelview. push ( ) ; / / MODELVIEW = M_Eye_Car (Repere courant = Voiture ) drawbody ( ) ; p3d : : modelview. push ( ) ; p3d : : modelview. apply (Car, Wheel1 ) ; / / MODELVIEW = M_Car_Wheel1 / / i.e. Repère courant = Wheel1 drawwheel ( ) ; p3d : : modelview. pop ( ) ; / / on r e v i e n t à Car : MODELVIEW = M_Eye_Car p3d : : modelview. apply (Car, Wheel2 ) ; / / MODELVIEW = M_Car_Wheel2 ; / / i.e. Repère courant = Roue2 drawwheel ( ) ; p3d : : modelview. pop ( ) ; } void drawscene ( ) { p3d : : modelview. s e t I d e n t i t y ( ) ; p3d : : modelview. apply ( Eye, World ) ; / / camé ra p3d : : modelview. apply ( World, Car ) ; / / o b j e t drawcar ( ) ; } F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 32 / 58
A noter Remarquez que c est le noeud père (le draw appelant) qui place ses fils (les draw appelés). Par exemple : c est la voiture qui place les roues (et non les roues qui se placent elle mêmes par rapport à la voiture) ; c est le monde qui place la voiture ; etc. Remarquez les push/pop systématiques à l entrée/sortie des draw : permet d éviter tout effet de bord (aucun noeud fils doit modifier le repère courant d un noeud après son appel). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 33 / 58
Attention au Scale! Comparez le résultat de : p3d : : modelview. s e t I d e n t i t y ( ) ; p3d : : modelview. r o t a t e ( angle, 0, 0, 1 ) ; p3d : : modelview. scale ( 2, 1, 1 ) ; drawsquare ( ) ; et p3d : : modelview. s e t I d e n t i t y ( ) ; p3d : : modelview. scale ( 2, 1, 1 ) ; p3d : : modelview. r o t a t e ( angle, 0, 0, 1 ) ; drawsquare ( ) ; F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 34 / 58
Conception hiérarchique : résumé Concevoir les composants dans des repères locaux les plus simples (ou intuitifs) possibles. Assembler les composants hiérarchiquement (sous forme d arbres), en les positionnant relativement les uns par rapport aux autres (on place les enfants par rapport au parent par un changement de repère M parentnode childnode ). La conception hiérarchique est fondamentale et constitue la fondation de la majeure partie des librairies 3D (graphes de scène). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 35 / 58
4 Quelques changements de repères usuels F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 36 / 58
123 2? 3 M 1 2 1 M 1 3 On connait M 1 2 et M 1 3, quelle est la matrice M 2 3? Solution : M 2 3 = M 2 1 M 1 3 (il reste à inverser M 1 2 pour avoir M 2 1 ). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 37 / 58
Transformation par rapport au repère "précédent" On connait M 1 2, et on connait la translation t exprimée dans 1 (de matrice T 1 ). On souhaite appliquer t 1 sur 2. Expliquez pourquoi M 1 2 = M 1 2 T 1 ne donnera pas le bon résultat. Plusieurs approches : Exprimez le vecteur t 1 dans 2 : t 2 = M 1 2 t 2 puis M 1 2 = M 1 2 T 2. On "attache" 2 à 1, puis on "bouge" 1 de t 1 sur 1 : M 2 2 = M 2 1 M 1 1 M 1 2 (même raisonnement que précédent). M 1 2 = t 1 M 1 2 (ce qui donne une autre interprétation : on applique la translation avant M 1 2 ). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 38 / 58
Transformation exprimée dans un autre repère Exemple : rotation R 2 du repère 1 pour obtenir 1 (rotation exprimée dans 2). Interprétation possible : attacher le repère 1 au repère 2. M 1 1 = M 1 2 M 2 2 M 2 1 avec M 2 2 = R et M 2 1 = M 2 1. M 1 1 = M 1 2 RM 2 1 Rotation de 1 autour d un point quelconque : prendre M 1 2 la plus simple possible (translation). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 39 / 58
La matrice TR Tout changement de repères orthonormés directs s exprime par une matrice de la forme TR. Autrement dit : tout objet peut être placé par en déplaçant son repère par une translation suivie d une rotation. Il s agit d une composition que l on retrouve très souvent (transformation rigide). Soit 2 changements de repère T (translation) et R (rotation). alors ( ) R3D T TR = 3D 0 1 L inverse? Il "suffit" de transposer R 3D (inverse d une matrice orthonormale), d opposer T 3D, puis faire le produit : ( )( R (TR) 1 = R 1 T 1 t = 3D 0 I T3D 0 1 0 1 ( R t = 3D R3D t T ) 3D 0 1 ) F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 40 / 58
Passage orthonormé Soient 1 = (O (1),i (1),j (1),k (1) ) et 2 = (O (2),i (2),j (2),k (2) ), deux repères orthonormés. On connait les expressions de l origine et de la base de 2 dans le repère 1. Alors : ( ) i (2) M 1 2 = 1 j (2) 1 k (2) 1 O (2) 1 0 0 0 1 L inverse M 2 1? il suffit de faire comme pour (TR) 1 : transposer le bloc haut-gauche (c est une rotation) et d opposer le bloc haut-droit (c est une translation) et faire le produit des inverses. F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 41 / 58
LookAt Placer la caméra par rapport à World en donnant sa position A World, quel point elle regarde (point At World ) et son roulis par un vecteur Up World. Construire (i, j, k) : k est donné par k = O At, et on le normalise. i est tel que i = up k enfin j est calculé par j = k i La matrice M World Eye est donnée en mettant en colonne i, j, k et O (repère étant orthonormé). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 42 / 58
5 Changement de repères et éclairement F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 43 / 58
Calcul dans le repère Eye Pour un calcul cohérent, il faut que toutes les données nécessaires (N, position des sources, L,...) soient exprimées dans le même repère. transformation des normales : void main ( ) { vec4 positioneye=modelviewmatrix vec4 ( vertex, 1. 0 ) ; vec4 normaleye=modelviewmatrix vec4 ( normal, 0. 0 ) ; / / c a l c u l FAUX en géné r a l L=lightPosition positioneye. xyz / positioneye.w; N=normalEye. xyz ;... g l _ P o s i t i o n = p r o j e c t i o n positioneye ; } F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 44 / 58
Attention au Scale! (la suite) Transformation des normales incorrecte lors d un changement d échelle. avant transformation après transformation par modelview La matrice correcte pour transformer les normales est (M 1 ) t où M est la sous-matrice 3x3 (3 premières lignes, 3 premières colonnes) de modelview. Il faut donc passer une matrice supplémentaire : vec4 positioneye=modelviewmatrix vec4 ( position, 1. 0 ) ; vec3 normaleye=normalmatrix normal ; L=lightPosition positioneye. xyz / positioneye.w; N=normalEye ;... g l _ P o s i t i o n = p r o j e c t i o n positioneye ; F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 45 / 58
6 Représentation des changements de repères par TRS - Quaternions F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 46 / 58
Représenter la conception hiérarchique Représenter explicitement la hiérarchie par un arbre (graphe de scène). class Object3D { Matrix4 _parentchild ; / / changement de repè re Object3D _parent ; / / r é f érence sur l e noeud parent std : : vector <Object3D > _child ; / / noeuds enfants public :... v i r t u a l void draw ( ) = 0 ; / / i n t e r f a c e : t r a c e dans l e repè re l o c a l... } ; Le visualiseur ("renderer") se charge de parcourir tout l arbre en composant la modelview et en traçant les géométries à chaque noeud (+ gestion des shaders/textures/etc). Offrir toutes les méthodes de positionnement et de changements de repères nécessaires. Ex : translate (par rapport au local ou au parent) ; rotate (idem) ; matrice worldlocal ; localworld ; pointtoworld(p L ocal) ; directiontoworld(u L ocal) ; etc ; etc. On fera plus simple lors des TPs : uniquement un niveau. F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 47 / 58
TR(S) Si les matrices homogènes s imposent (composition simple par produit, librairie OpenGL), la représentation du placement est souvent couplée à une représentation Translation/Rotation. Tout placement d un objet rigide (composition de translations et rotations) peut se réduire à TR : c est à dire une translation (c est la position de l objet) et une rotation (c est l orientation de l objet). On peut éventuellement compléter par un changement d échelle S pour contrôler les dimensions d un objet. class Object3D { Vector3 _ position ; / / T Quaternion _ orientation ; / / R Vector3 _scale ; / / S... } ; Quaternion? F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 48 / 58
Représentation d une orientation Plusieurs choix pour représenter l orientation : matrices (quel est l axe? l angle? ; erreurs numériques lors de compositions multiples ; interpolation M = (1 λ)m1 + λm2). angle/axe : intuitif mais pas nécessairement évident à manipuler (composition) angles de Cardan ("abusivement" appelés angles d Euler en informatique graphique). quaternions. F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 49 / 58
Remarques sur angles d Euler M 0 3 = R Z0 R Y1 R X2 (ordre Z Y X). r o t a t i o n ( bleu ) ; / / l a c e t (yaw ) r o t a t i o n ( rouge ) ; / / tangage ( p i t c h ) r o t a t i o n ( v e r t ) ; / / r o u l i s ( r o l l ) Remarque : en informatique graphique, l ordre des axes est généralement Y X Z : autour de y (= lacet), puis autour de x (= tangage), puis autour de z (= roulis). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 50 / 58
Représentation par angles d Euler (2) class Object3D { Vector3 _ position ; / / p o s i t i o n en t r a n s l a t i o n double _ay, _ax, _az ; / / orientation ( angles d Euler )... public :... } Draw : p3d : : modelview. t r a n s l a t e ( _ p o s i t i o n. x ( ), _ p o s i t i o n. y ( ), _ p o s i t i o n. z ( ) ) ; p3d : : modelview. rotate ( _ay,0,1,0); / / yaw : autour de y p3d : : modelview. rotate ( _ax,1,0,0); / / p i t c h : autour de x p3d : : modelview. rotate ( _az,0,0,1); / / r o l l : autour de z... } Représentation peut sembler simple : 3 angles, et l orientation totale est alors donnée par M = R Y0 R X1 R Z2, mais la composition pose un véritable problème de conception : Comment composer par rapport à l orientation actuelle? (exemple de l interaction à la souris : comment faire un yaw après un pitch??). Gimbal lock : possible de perdre un degré de liberté. F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 51 / 58
Gimbal Lock r o t a t i o n ( bleu ) ; / / yaw r o t a t i o n ( rouge ) ; / / p i t c h r o t a t i o n ( v e r t ) ; / / r o l l rouge = 90 degrés F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 52 / 58
Représentation d une orientation par quaternion (1) Définition : q = (a,u) avec a un scalaire de IR, et u un vecteur de IR 3 (donc 4 composantes en tout). Un vecteur u peut s écrire avec le quaternion q = (0,u). Somme : q 1 + q 2 = (a,u) + (b,v) = (a + b,u + v). Multiplication : q 1 q 2 = (a,u)(b,v) = (ab u v,u v + av + bu) Conjugué : (a,u) = (a, u) Multiplication par un scalaire : kq = k(a,u) = (ka,ku) Norme : q = a 2 + u u F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 53 / 58
Représentation par quaternion (2) Calcul à partir de 2 vecteurs : u et v unitaires, et formant un angle θ alors le quaternion q = (u v,u v) est une représentation d une rotation de vecteur u v et d angle 2θ. Tout quaternion normé s écrit q = (cosα, sinαu) avec u normé : représente une rotation d angle 2α et de vecteur u (axe passant par l origine). Soit q un quaternion représentant une rotation, alors l image w du vecteur w s obtient par w = qwq Soient q1 et q2 deux rotations, alors la rotation composée est q1q2. F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 54 / 58
Conversion quaternion en matrice Soit q = (a,u) = (a,(x,y,z)) une rotation, alors la matrice homogène de rotation est : 1 2y 2 2z 2 2xy 2za 2xz + 2ya 0 2xy + 2za 1 2x 2 2z 2 2yz 2xa 0 2xz 2ya 2yz + 2xa 1 2x 2 2y 2 0 0 0 0 1 F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 55 / 58
Intérêt des quaternions représentation de la composition moins gourmande en temps de calcul (comparer à la multiplication entre matrice). composition des rotations plus robuste : il suffit de normaliser le quaternion pour s assurer que nous avons toujours une rotation. interpolation : l interpolation linéaire de deux quaternions donne un résultat plus naturel qu avec les matrices (i.e. q3 = (1 λ)q1 + λq2, mais il faut toutefois normaliser q3). Remarque : l attribut _position est également interpolé linéairement. F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 56 / 58
Classe Quaternion La classe Quaternion est disponible pour les tps. Les méthodes utiles sont : Initialisation à la rotation identité : q.setidentity() Conversion d une représentation (angle,axe) à un quaternion : q.setfromangleaxis(angle,axe) (axe de type Vector3) Conversion d un quaternion à une représentation (angle,axe) : q.copytoangleaxis(&angle,&axe) Composition de 2 rotations : q3=q1*q2 Composition avec une rotation représentée par (angle,axe) : q.rotate(angle,axe) (q est modifié) Rotation d un vecteur : v=q*u (avec u et v de type Vector3) F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 57 / 58
Transformation position ou direction Attention : il faut différencier les points P(x, y, z) et les directions u(x, y, z) lors des transformations. Une direction ne doit pas subir la translation : Avec les matrices homogènes : il suffit d appliquer une coordonnée homogène 0 pour les vecteurs. Avec une représentation translation/rotation : la direction subit uniquement la rotation (ignorer la translation). F. Aubert (MS2) M3DS/ 3 - Repères et positionnement 3D 2014-2015 58 / 58