Imagerie Numérique Synthèse d’images Objets 3D Licence Pro Sébastien THON IUT de l’Université de Provence, site d’Arles Département Informatique
2 1. Introduction Un objet 3D peut comporter plusieurs milliers, voire dizaines ou centaines de milliers de faces. Impossible de les générer manuellement dans un code source. Utilisation d’outils : logiciels de modélisation 3D (3D Studio Max, Maya, LightWave, …) qui permettent de générer graphiquement un objet 3D et de le sauver dans un fichier. Il faut ensuite charger ce fichier dans le code source.
3 Interface type d’un logiciel de modélisation 3D : Interface de 3D Studio Max
4 Formats d’objets 3D 3D Studio Max: binaire (.max,.3ds), texte (.ase,.asc) DirectX : (.x) Lightwave : (.lwo) Maya : binaire (.mb), texte (.ma) … Ou trouver des objets 3D 3D Cafe: …
5 2. Codage en mémoire d’un objet 3D Dans notre programme, il faut charger le fichier crée par un modeleur 3D Déclarer des classes appropriées pour coder en mémoire l’objet 3D.
6 2.1 Décomposition en listes de sommets et faces Un objet est composé de faces (souvent des triangles). Une face est définie par 3 sommets. Un sommet = un point 3D (x,y,z).
1ère solution de codage en mémoire : Représenter un objet par une liste de faces : typedef struct { float x, y, z; } Point3D; typedef struct { Point3D p1,p2,p3; } Face; Objet3D : Face *liste_faces; x y p1p2p liste_faces 1 2 3
8 Problème : Un sommet est partagé par plusieurs faces informations redondantes, donc perte de place mémoire. Sommet partagé par 6 faces Sphère composée de 960 faces 960 x 3 point3D(x,y,z) 960 x 3 x 3 float octets Sommet partagé par 32 faces
2ème solution de codage en mémoire : Séparation en liste de sommets et en liste de faces typedef struct { float x, y, z; } Point3D; typedef struct { int a, b, c; } Face; Objet3D : Point3D *liste_sommets; Face *liste_faces; xyz liste_sommets x y abc liste_faces
10 Sphère composée de 960 faceset de 482 sommets 960 x 3 indices point3D(x,y,z) 960 x 3 int x 3 float octets Sommet partagé par 6 faces Sommet partagé par 32 faces Gain en place mémoire.
Décomposition en sous-objets Dans un logiciel de modélisation 3D, les objets sont souvent crées par assemblage de sous-objets. On retrouve cette décomposition dans les fichiers crées. ObjetSous-objets
12 Classe Objet3D Classe SousObjet3D Première idée de décomposition en classes : class Objet3D { private : list liste_sous_objets }; Mais…
Duplication d’objets 3D Si on a plusieurs objets identiques dans la même scène Duplication de la même géométrie. Perte de place mémoire, informations redondantes. Ces objets identiques ne diffèrent que par leur position et leur rotation.
14 Solution: Séparer les informations de positionnement (position, rotation) classe Objet3D et les informations de géométrie (liste de sous objets composés de faces) classe Geometrie3D contient une liste de SousObjet3D
15 Résumé : au final, on utilisera les classes suivantes : class Objet3D { GLfloat xpos, ypos, zpos; GLfloat xrot, yrot, zrot; Geometrie3D *geometrie; }; class Geometrie3D { list liste_sous_objets; }; class SousObjet3D { Point3D *liste_sommets; Face *liste_faces; };