GÉOMÉTRIE GRAPHIQUE ET NUMÉRIQUE Modélisation de formes 3D Introduction Marie Samozino INRIA - Équipe GÉ GÉOMETRICA 2 1 Motivations Médical Histoire de l'art Jeu Motivations Ingé Ingénierie Données brutes Nuage de points Soupe de polygones Surfaces maillages Fonctions implicites Surfaces de subdivision Fonctions paramétriques (Spline, bezier,.) Plus généralement qu'est ce qu'un objet 3D? Suite des primitives géométriques Ensemble de courbes Fonction(s) Comment modéliser, visualiser sur un ordinateur? 3 Représentation d'objets 3D Qu'est ce qu'un cube? Les 8 sommets? Les 6 faces? Une fonction? Topographie Simulation Multimé Multimédia 4 Modélisation d'objets 3D Un objet 3D = un modèle Une géométrie Des attributs Des propriétés physiques, etc. Une camera Comment on obtient des objets 3D? Synthèse d'image Scanner 3D Reconstruction à partir d'images Structures de haut niveau CSG Graphes de scène 5 6 1
Exemple :Scanner 3D Exemple :Scanner 3D Acquisition Edition Recalage Fusion Simplification 7 8 Interpolation / Approximation Interpolation Surfaces Approximation 9 10 Représentation Surfacique Pourquoi des surfaces? Suffisante pour les objets opaques Surfaces Mathématiquement : une surface est une 2-Variété un espace topologique non vide où tout point possède un voisinage homéomorphe à un ouvert de R 2 Objets transparents -> volumes Simulation -> tout Caractéristiques A bords / sans bords Orientation Genre. Courtesy B.Cutler 11 12 2
Caractéristiques ristiques : Le bord Sans bord : homéomorphe a un disque en tout point. Caractéristiques ristiques : Non-Vari Variétés Non-Varieté : Existence de point ou la surface ne peut pas être localement un plan Avec bord : homéomorphe à un demi disque en tout point. 13 Courtesy Open Geometry 14 Caractéristiques ristiques : Orientation Notion d'intérieur et d'extérieur Caractéristiques : Décomposition cellulaire Le cercle Pas de classifications possibles La sphère + 2 x Le cylindre 15 Courtesy Open Geometry 16 Caractéristiques ristiques : Genre Le genre d'une surface connexe est le nombre maximum de courbes fermées simples sans points communs que l'on peut tracer à l'intérieur de cette surface sans la déconnecter Deux surfaces n'ayant pas le même genre ne sont pas homéomorphes Caractéristique : Équation d Euler une surface bornée sans bord orientable vérifie l équation d Euler avec v e + f = 2c 2g + t c = nombre de composantes connexes g = nombre de trous à travers l objet ou genre t = nombre de trous sur les faces v = nombre de sommets e = nombre d'arêtes f = nombre de faces caractéristique d Euler χ = v e + f 17 18 3
Représenter une surface Représentation d une surface Constructive Explicite z=f(x,y) Implicite f(x,y,z)=0 Paramétrique x=x(t,u),y=y(t,u), z=z(t,u) Polygonale/ Maillage 19 Représentation explicite 20 Représentation implicite Surface : { (x,y,z) R3/ f(x,y,z)=0 Surface : { (x,y,z) R3/ z=f(x,y) plan dans IR3: Ax+By+Cz+D=0 cercle dans IR2: x2 + y2 - r2 = 0 surfaces algébriques: f(x,y,z) = polynôme f(x)>0 Il peut être difficile de représenter une courbe en 3D sous une forme implicite Elle n'existe pas pour toutes les courbes Représentation du plan x=0? Intersection de deux surfaces: f(x, y, z) = 0 et g(x, y, z) = 0 f(x)=0 21 Repré Représentation implicite : Exemple f(x)<0 22 Discretisation Surface quadrique : équation algébrique implicite d une quadrique Q(x, y, z) = a1x2 + a2y2 + a3z2 + a4xy + a5xz + a6yz + a7x + a8y + a9z + a10 Manipulation des quadriques dans OpenGL Créer un objet de type quadrique à l aide de glunewquadric() Spécifier les attributs de l objet crée à l aide de: gluquadricorientation(), gluquadricdrawstyle(), gluquadricnormals(), gluquadrictexture () Spécifier le type de quadrique désiré à l aide des primitives: glusphere(), glucylinder(), gludisk() ou glupartialdisk(). OpenGL implémente ces objets à l aide d une approximation polygonale 23 Exploitation par des ordinateurs, le continu n'existe pas Discretisation Différents niveaux Approximation 24 4
Représentation paramétrique Courbe de Bézier Surface : { (x(t),y(t),z(t)) R 3 / t Ω Courbe (cubique): x(t), y(t), z(t) Surface ou patche (bicubique): x(s, t), y(s, t), z(s, t) Expression mathématique P N M ( u, v) = Pi, jbi, N ( u) B j, M ( v) i= 0 j= 0 P N,0 PN,M Définition à partir de points de contrôles. Exemples : Bezier, Splines,NURBS,. V 0 à t=0 V 1 V 3 V 2 V 4 V 5 à t=1 B k, p k p k ( w) = C w ( 1 w) p w compris entre 0 et 1 Étapes avec OpenGl k Définir l évaluateur P(u,v) Activer l évaluateur P 1,0 P 1,1 P 0,0 P 0,1 Calculer les points de la courbe P 0,M 25 26 Courbe de Bézier et OpenGl Définition d un évaluateur void glmap1{fd ( GLenum target, // plus bas TYPE u1, // valeur initiale du paramètre TYPE u2, // valeur finale du paramètre GLint stride, // Incrément entre x successifs GLint order, // ordre de la courbe = nb points const TYPE * points); // points de contrôle GLenum GL_MAP1_VERTEX_3 GL_MAP1_VERTEX_4 GL_MAP1_INDEX GL_MAP1_COLOR_4 GL_MAP1_NORMAL Courbes de Bezier Évaluer les points de la courbe void glevalcoord1{fd (TYPE u); // valeur du paramètre Exemple void AfficherFils ( Point3D_T *pts ) { int i; const int Ordre = 4; const int n = 30; glmap1f ( GL_MAP1_VERTEX_3, 0.0, 1.0, //u varie de 0.0 à 1.0 pour une courbe de Bézier 3, // incrément entre les x Ordre, // ordre de la Bézier = nb pts (GLfloat *) &pts[0]); // points de contrôle glenable ( GL_MAP1_VERTEX_3 ); glcolor3f ( Grey10 ); glbegin ( GL_LINE_STRIP ); for ( i = 0; i < n; i++) { // Évaluation de n points intermédiaires glevalcoord1f ( (GLfloat) i /n ); GL_MAP1_TEXTURE_COORD_1 GL_MAP1_TEXTURE_COORD_2 GL_MAP1_TEXTURE_COORD_3 glend(); GL_MAP1_TEXTURE_COORD_4 27 28 Courbes B-Spline et NURBS Expression mathématique : S N M ( u v) = Pi, jni, k ( u) N j, l ( v) k, l, i= 0 j= 0 Où k et l contrôle l ordre de la B-spline Courbes B-Spline et NURBS Étapes Créer un objet Nurbs avec glunewnurbsrenderer(); Définir les caractéristiques (si nécessaire) de la courbe (épaisseur du trait,. ) avec glunurbsproperty(); Enregistrer une fonction de rappel en cas d erreur avec glunurbscallback (); Commencer la courbe ou surface avec glubegincurve() ou glubeginsurface(); Générer la courbe ou la surface avec glunurbscurve() ou glunurbssurface(); Terminer la courbe ou la surface avec gluendcurve() ou gluendsurface(); 29 30 5
Courbes B-Spline Exemple : void AfficherFils1 ( Point4D_T *pts ) { const int Ordre = 4; const int Degre = Ordre - 1 ; GLfloat VecteurNodal[] = { 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0; GLUnurbsObj *Fils = glunewnurbsrenderer(); glunurbscallback ( Fils, GLU_ERROR, NurbsErreur ); glubegincurve ( Fils ); glunurbscurve ( Fils, Ordre + Degre + 1, VecteurNodal, 4, (GLfloat *) &pts[0], Ordre, GL_MAP1_VERTEX_3); gluendcurve ( Fils); 31 Représentation polygonale Surface : ensemble de petits patch de surfaces Maillages 32 Les maillages Un maillage Données: géométrie Connectivité Propriétés: Variété Topologie arbitraire Connectivité irrégulière Echantillonnage non uniforme 33 34 Géométrie Connectivité (combinatoire) 35 36 6
Degré / valence Dualisation degré degré 5 primal dual valence 4 37 Primal / dual 38 Régularité / triangles 39 Régularité / polygones 40 Attributs - e.g. couleur index de couleur par sommet 41 42 7
Attributs, e.g. coord.. texture Structures de données u,v par sommet 43 44 Structure de données Primitives: sommets arêtes faces (degré) Structure simple (sans arêtes) Triangle // ses sommets vertex *vertices[3]; // faces voisines triangle *nfaces[3]; Relations d'incidence: simples demi-arêtes, etc. Vertex double coordinates[3]; // sommets voisins array<vertex> nvertices; // faces incidentes array<triangle > nfaces; 45 46 Structure de donnée e basée e sur des demi arêtes Requiert: Surface orientée Orientation des faces (sens des aiguilles d'une montre) 1 arête 2 flèches Demi-arêtes Demi arête: arête orientée Idée: sommet incident considérer plusieurs manières d'accéder à une arête : Demi arête suivante Demi arête précédente Demi arête opposée Sommet de départ Face demi arête suivante demi arête opposée demi arête face incidente demi arête précédente 47 48 8
Demi-arêtes Géométrie: Sommets Connectivité: demi-arête (seulement!) Attributs: Sommets Demi arêtes Faces Attributs Par primitive: face sommet arête demi-arête (~coin) wedge Exemples: couleurs, normales, dureté, coordonnée de texture, matériau 49 50 Structure de donnée «halfedge» Maillages surfaciques Vertex double coordinates[3]; //une demi arête adjacente HalfEge h; Face //une demi arête adjacente HalfEge h; //coordonnées de la normale double normal[3]; //Plan support Plane p; HalfEdge //Sommet origine Vertex v; //Les arêtes opposée, suivante, précédente HafEdge h_opposite, h_next, h_prev; //La face incidente Face f; sommet incident demi arête suivante demi arête opposée demi arête face incidente Formats: ASCII vs binaire Primitives indépendantes Indexés Bandes de triangles Compressés Autres... demi arête précédente 51 52 Primitives indépendantes Formats indexés e.g. OFF / VRML Sommets Faces (géom ométrie) (connectivité) v1 (x1;y1;z1) f1 (v1( v1;v3;v2) v2 (x2;y2;z2) f2 (v4;v3;v1 v1) face: x1 y1 z1 x2 y2 z2 x3 y3 z3 v3 (x3;y3;z3) v4 (x4;y4;z4) v5 (x5;y5;z5) v6 (x6;y6;z6) f3 (v4;v1 v1;v5) f4 (v1( v1;v6;v5) f5 (v6;v1 v1;v7) f6 (v2;v7;v1 v1) Duplication des sommets 53 v7 (x7;y7;z7) f7 ( )( 54 9
Bandes de triangles Calculs et Affichages 55 56 Normales : par face ou par sommet? Normales Normale à une surface: définition par face n c n = (b a) (c a ) b a Une surface? seulement une approximation 57 Normales : par coin? {sommet;face Condition d'unicité: C1-différentiabilité 58 Normales : par secteur (wedge)? Normales multiples 59 60 10
Application : Illumination Illumination en un point = résultat de l'interaction scène / lumière Calcul de l'intensité d'un point Cas simple : Ombrage constant sur un polygone La couleur d'un point dépend: position du point orientation (liée / géométrie de la surface) propriété interaction lumière / matière sources de lumières Source V N L e i Caméra L. N = cos i Orientation connaissance de la normale intérêt : une seule couleur par polygone. inconvénient : des discontinuités à chaque arête. 61 62 Interpolation de l illuminationl Interpolation de Gouraud Calculer la couleur pour chaque sommet, puis on interpole Interpolation de Gouraud Normale d un sommet : Moyenne des normales aux polygones voisins du sommet Quelle est la normale d un sommet? Si la surface de départ est analytiquement connue, on extrait les normales Si la donnée de départ est un maillage polygonal? 63 64 Interpolation de Gouraud Quand on a la normale à un sommet : Calcul de la couleur pour ce sommet Puis interpolation suivant chaque scanline : V1 scanline Interpolation de Phong Au lieu d interpoler les couleurs, on interpole les normales Sur chaque arrête Sur chaque scanline Plus lent que Gouraud, mais nettement plus beau V3 Permet de calculer les effets spéculaires contenus dans une facette V2 65 66 11
Illumination : Exemple Illumination : Exemple Création de la lumière et des matériaux Affichage d une facette : void initcontext (void) { //Lumière GLfloat specular[] = { 1.0,1.0,1.0,1.0 ; GLfloat shinines[] = { 50.0 ; GLfloat l_pos[] = { 1.0,1.0,1.0, 0.0 ; //Matériaux glmaterialfv(gl_front,gl_specular,specular); glmaterialfv(gl_front,gl_shininess,shinines); //Eclairage de la scene gllightfv(gl_light0,gl_position,l_pos); glenable(gl_lighting); glenable(gl_light0); //Initialisation Depth-buffer gldepthfunc(gl_less); glenable(gl_depth_test); 67 void gl_draw_facet( Facet_handle hfacet, const bool smooth) { glbegin(gl_polygon); if(!smooth){ //une normale par facette const Facet::Normal_3& normal = hfacet->normal(); glnormal3f(normal[0],normal[1],normal[2]); Halfedge_around_facet_circulator he = hfacet->facet_begin(); do{//une normale par sommets if(smooth){ const Vertex::Normal_3& normal=he->vertex()->normal(); glnormal3f(normal[0],normal[1],normal[2]); const Point& p = he->vertex()->point(); glvertex3d(p[0],p[1],p[2]); if (smooth) while(++he!= hfacet->facet_begin()); glshademodel(gl_smooth); glend(); else glshademodel(gl_flat); 68 TP2 : Enfin de la 3D Initialisations Glut, caméra, contexte de rendu. TP : Enfin de la 3D Maillage Création d une structure de donnée Affichage Interactions dans l affichage 69 70 Standard Template Library Iterators Intérêt : Avoir une implémentation unique, indépendante du type d objet quelle contient. Le parcours d une liste se fait à l aide d itérateurs. #include <list> std::list<int> v; //Déclaration de la liste v.push_back(3); // 3 v.push_front(5); // 5 3 Type T : int, Sommet, Face, Élément de type T std::list<int> v; //Déclaration de la liste std::list<int>::iterator it; //Déclaration de l itérateur for( it = v.begin(); it!= v.end(); it++) //On incrémente l itérateur { int x = *it; //Récupération de l élément courrant begin end 71 it-- it it++ 72 12