CoursCAO_DAO1 - WordPress.com

publicité
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
Téléchargement