810 likes | 1.66k Views
Cours CAO/DAO . Enseignant : Ouissem BEN HENIA Adresse Email : o.benhenia@gmail.com. Plan du cours. Introduction Maillages Definition Stucture Modelisation de courbes et surfaces Modes de représentation Bezier. Introduction CAO (CAD en anglais).
E N D
Cours CAO/DAO • Enseignant : Ouissem BEN HENIA • Adresse Email : o.benhenia@gmail.com
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 • CFD: étude le comportement du système modélisé
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… (expRé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 • Scanner un objet • Nuages de points • Algorithme de triangulation • Delaunay scannage de la statue de David 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) • Typedefstruct _point { • float * coord; • int dimension; //(2 ou 3) • int id;//un numéro pour l’identifier • int * voisinsP;//les points voisins • intnbVP;//nombre de points voisins • int * voisinsA;//les arrêtes auxquelles il appartient • intnbVA; //nombre d’arrêtes voisines • int * voisinsM;//les mailles auxquelles il appartient • intnbM;//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) • Typedefstruct _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 • intnbVM;//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) • Typedefstruct _maille{ • int * pt; //points d’une maille • intnbPt;//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 • intnbVM;//nombre de mailles voisines …}maille;
Maillage (structure) • Typedefstruct _maillage{ • points * pt; //ensemble de sommets • intnbPt;//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 • intnbM;//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 voidajoutPtMaillage(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 voidajoutPolyMaillage(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 • f 1 2 4 • f 4 2 3 • f 1 5 2 … 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 intetat;//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 • elseetat=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 elseetat=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 elseetat=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