Cours CAO/DAO Enseignant : Ouissem BEN HENIA Adresse Email : [email protected] Plan du cours Introduction Maillages Definition Stucture Modelisation de courbes et surfaces Modes de représentation Bezier Introduction CAO (CAD en anglais) CAO : Logiciels et techniques de modélisation géométrique : AutoCAD, 3D CAD, QCAD, maillage, Spline … But : concevoir et tester virtuellement des objets à fabriquer Domaines connexes : dessin par ordinateur calcul scientifique programmation par contrainte Domaines d’utilisations CAO pour : Mécanique : pièces automobile Electronique : circuits électrique Circuit imprimé microprocesseurs Architecture : plan 2D bâtiment 3D Domaine d’utilisation CAO pour : Urbanisme Route, autoroute Maison, quartier, ville… Modélisation moléculaire Orthopédie Ameublement etc Maillages Définition Différents types de maillages Générer un maillage Structure pour coder un maillage Maillages Ensemble de points reliés par des arrêtes pour former des mailles (faces) But : visualiser un objet Sphere Pyramide Lapin Maillages Différents types de maillages Triangulaire Rectangulaire (ici carré) Polygonal, hexagonal Uniforme : distribution uniforme des sommets sur la surface (contraire non uniforme: maillage en vert) Etc… (exp Régulier/irrégulier) Maillages Différents niveau de détails Exemple modélisation Maillage très fin: réaliste mais nécessite de grandes ressources mémoire et temps de calcul Maillage grossier : rapide à afficher, peu de ressources mémoire mais pas réaliste Maillage : construction Construction de maillage : À la main Formules mathématiques scannage de la statue de David Scanner un objet Nuages de points Algorithme de triangulation Delaunay Le modèle tridimensionnel comporte un milliard de polygones(mailles). Images propriété du projet Michelangelo Structure d’un maillage Composition d’un maillage: Ensemble de points (nœuds) Ensemble d’arrêtes Ensemble de mailles(facettes) : triangles, polygones etc… Maillage (sommet) Un point d’un maillage peut contenir 2 ou 3 coordonnées Une couleur : 3 valeurs RGB Une normale Ensemble de voisins Sommets (nœuds) Arrêtes Mailles Maillage (sommet) Typedef struct _point { float * coord; int dimension; //(2 ou 3) int id;//un numéro pour l’identifier int * voisinsP;//les points voisins int nbVP;//nombre de points voisins int * voisinsA;//les arrêtes auxquelles il appartient int nbVA; //nombre d’arrêtes voisines int * voisinsM;//les mailles auxquelles il appartient int nbM;//nombre de mailles voisins …}point; Maillage (arrête) Composition de l’arrête Deux points : extrémités Arrêtes voisines mailles d’appartenance Couleur Etc… Maillage (arrête) Typedef struct _arrete { int pt[2]; //points d’extrémités int id;//un numéro pour l’identifier int * voisinsA; //les arretes auxquelles il appartient nbVA; //nombre d’arrêtes voisines int * voisinsP;//les mailles auxquelles il appartient int nbVM;//nombre de mailles voisines …}arrete; Maillage (maille) Composition d’une maille (face) Ensemble de points Ensemble d’arrêtes Couleur Numéro d’identifiant Normale Maillage (maille) Typedef struct _maille{ int * pt; //points d’une maille int nbPt;//nombre de points du maille int id;//un numéro pour l’identifier int * Arr;//arrêtes qui délimitent la maille nbA;//nombre d’arrêtes int * voisinsM;//les mailles auxquelles il appartient int nbVM;//nombre de mailles voisines …}maille; Maillage (structure) Typedef struct _maillage{ points * pt; //ensemble de sommets int nbPt;//nombre de points du maille arrete * arr;//ensemble d’arrêtes formant le maillage nbA;//nombre d’arrêtes maille * mailles;//les mailles qui forment le maillage int nbM;//nombre de mailles …}maillage; Initialisation de la structure //initialisation d'un point. point * initPoint(int id){ point * p=(point*)malloc(sizeof(point)); p->id=id; … return p; } Initialisation de la structure //initialisation arrete arrete * initarrete(int p1,int p2, int id){ arrete* ar=(arrete*)malloc(sizeof(arrete)); ar->pt[0]=p1; ar->pt[1]=p2; ar->id=id; … return ar; } Initialisation de la structure //initialisation polygone polygone * initPoly( int id){ polygone *p= (polygone*)malloc(sizeof(polygone)); p->id=id; … return p; } Initialisation de la structure //initialisation du maillage maillage * initMaillage(){ maillage *m =(maillage*)malloc(sizeof(maillage)); m->nbPt=m->nbPoly=0; m->poly=NULL; m->pt=NULL; … return m; } Ajouter un point à un maillage //rajoute un point au maillge void ajoutPtMaillage(maillage * m, point *p){ point *t; m->nbPt++; t=(point*)realloc(m->pt,sizeof(point)*m->nbPt); if(t==NULL) {printf("problème d'allocation mémoire\n");exit(0);} else { m->pt=t; m->pt[m->nbPt-1]=*p; } } Ajouter un polygone à un maillage //rajoute un polygone au maillage void ajoutPolyMaillage(maillage * m, polygone * poly){ polygone *t; m->nbPoly++; t=(polygone*)realloc(m->poly,sizeof(polygone)*m-> nbPoly); if(t==NULL) {printf("problème d'allocation mémoire\n");exit(0);} else { m->poly=t; m->poly[m->nbPoly-1]=*poly; } } Fichier OBJ v -0.274878 -0.274878 -0.274878 v -0.274878 -0.274878 0.274878 v -0.274878 0.274878 0.274878 v 0.274878 0.274878 0.274878 v 0.274878 -0.274878 0.274878 f1 2 4 f 423 f152 … V pour vertex (vecteur, sommet) F pour face Lecture d’un fichier OBJ maillage * lire_obj(char *nom_fichier){ /*declaration des variables*/ FILE *fichier;//fichier obj char carlu;//caractère courant lu int etat;//important pour savoir ce qu'on lit dans le fichier point * pt;//contient les coordonne d'un point polygone *poly;//contient un polygone maillage*m; // le maillage resultat int i; float f; int a; Lecture d’un fichier OBJ /**ouverture du fichier**/ fichier=fopen(nom_fichier,"r"); if (fichier==NULL) {printf("echec d'ouverture de fichier \n"); exit(0);} /*Initialisation*/ m=initMaillage(); //initialisation du maillage etat = 0;//initialisation de l’etat while(etat!=-1 ){ switch (etat){ Lecture d’un fichier OBJ case 0://on dans l'etat initiale carlu=fgetc(fichier); switch (carlu){ case 'v':etat=1;break; case 'f':etat=2;break; default:while(carlu!='\n'&& carlu!=EOF ) { carlu=fgetc(fichier); } //on traite le cas ou on est à la fin du fichier if(carlu==EOF)etat=-1;//cas final fin du texte else etat=0; break; } break;//fin du cas initiale Lecture d’un fichier OBJ case 1://on lit les coordonnees du point pt=initPoint(m->nbPt); for(i=0;i<3;i++){ fscanf(fichier,"%f",&f); pt->coord[i]=f; } // on rajoute le point dans l'ensemble des points du maillage ajoutPtMaillage(m,pt); // on retourne à la ligne while(carlu!='\n'&& carlu!=EOF && carlu!='\r'){carlu=fgetc(fichier);} //on traite le cas ou on est à la fin du fichier if(carlu==EOF)etat=-1;//cas final fin du texte else etat=0; break; Lecture d’un fichier OBJ case 2://on li le polygone poly=initPoly(m->nbPoly); for(i=0;i<3;i++){ fscanf(fichier,"%i",&a); poly->pt[i]=a-1; } ajoutPolyMaillage(m, poly); // on retourne à la ligne while(carlu!='\n'&& carlu!=EOF && carlu!='\r'){carlu=fgetc(fichier);} //on traite le cas ou on est à la fin du fichier if(carlu==EOF)etat=-1;//cas final fin du texte else etat=0; break; Lecture d’un fichier OBJ default :break;//on ne fait rien break; }//fin du switch }//fin du while return m; }//fin de la fonction Maillage (visualisation avec OpenGL) OpenGL Librairie graphique 3D Caractéristiques : Simplicité et Performance Indépendance du langage de programmation et du système d’exploitation Fait de la synthèse d’image : Traçage de primitives géométrique Position d’une caméra Lumières, textures Maillage (visualisation avec OpenGL) OpenGL s’occupe de : Changements de repère Projection en perspective à l’écran Elimination des parties cachées Interpolation des couleurs Rasteriser (tracer ligne à ligne) les faces pour faire des pixels (Bresenam) OpenGL indépendant du sytème de fenetrage Maillage (visualisation avec OpenGL) OpenGL, pourquoi? Open Source Simple et performant Très utilisé dans le domaine de la 3D Dans des logiciels : Blender AutoCAD Animation 3D Jeux video OpenGL dans Blender Maillage (visualisation avec OpenGL) OpenGL, quelques références Livres OpenGL Programming Guide OpenGL Reference Manual OpenGL Extensions Guide Sites web http://www.opengl.org/ http://user.xmission.com/~nate/tutors.html (pleins de tutoriaux) Maillage (visualisation avec OpenGL) OpenGL : Synthèse d’image Glut : Gestion des fenêtres Création de fenêtres (dimension, position ) Gestion de la souris Gestion du clavier Liens pour utiliser OpenGL Utilisation d’opengl avec DevCpp: http://henri.garreta.perso.luminy.univmed .fr/generique/autres/OGL/index.html Maillage Compléter les structures point, arrête, polygone, maillage (fonction qui calcule les arrêtes) Trouver les voisins d’un point Trouver le contour d’un maillage Calculer la normale d’un polygone Calcule la normale en un point