TP Compression de maillages

publicité
TP Compression de maillages
durée – 4h -- Mars 2010
Thibaut Le Naour - http://www-valoria.univ-ubs.fr/Thibaut.Le-Naour
Vous avez jusqu'ici suivi les cours sur le C/C++ par Nicolas Courty et la réalisation d'un moteur 3D en Java par
Gildas Ménier. Nous introduirons dans ce TP les notions portant sur la compression topologique de maillages. Soit
la modification de maillages 3D déjà modélisés, notion qui sera vu l'année prochaine dans le cour de synthèse
d'image.
Le TP se fera donc avec le langage C++, et pour l'occasion nous utiliserons le logiciel Visual C++ (cf annexe 2)
Objectifs:
–se familiariser avec la structure de donnée classique d'un maillage (nécessaire à son affichage avec OpenGL)
–Manipuler les structures algorithmiques associés
–Appliquer une compression sur les informations topologiques d'un maillage triangulaire
1 Manipulations de maillages et structures associées
Un maillage (ou mesh) est classiquement représenté par une liste de sommets (ou vertex) et une liste de faces
(des triangles dans notre cas). Chaque triangle possède 3 sommets qui sont représentés par leurs indices dans
la liste de sommets. Un cube pourra donc être décrit comme suit:
8 S o m m e t s:
-1 , -1 , -1
1, -1 , -1
1 , 1 , -1
-1 , 1 , -1
-1 , -1 , 1
1 , -1, 1
1, 1, 1
-1, 1, 1
1 2 f a c e s:
21 0
032
261
1 65
...
1.1 Téléchargez le fichier http://www-valoria.univ-ubs.fr/Thibaut.Le-Naour/ens/TPInfoMultimedia.zip.
Compilez et exécutez le projet (touche F5), une liste d'indications sur Visual sont dans l'annexe 2.
Familiarisez vous avec le code des fichiers main.cpp, mesh.h et mesh.cpp (modifier les commandes dans les
fonctions OnInit et OnRender). Les autres fichiers n'entrent pas dans les objectifs mais les comprendre est
toujours un plus !
1.2 Afin de comprendre comment marche les structures liées à un maillage, créer une nouvelle classe Cube
(qui hérite de la classe Mesh), prenez exemple sur la classe Sphere, et affichez le.
2 Compression de la topologie
Pour une première approche, nous allons ré exprimer les informations relatives aux faces pour les
transformer en triangle strip. Plus précisément, un triangle strip est une série de triangles connectés de telle
façon que les deux deniers indices de sommets d'un triangle soient les deux premiers indices du suivant.
2.1 La mise en pratique d'un tel principe (NP-complet par ailleurs) pouvant être périlleuse et source de
multiple solutions, vous élaborez votre propre algorithme sous la forme d'un concours. En binôme, vous
aurez comme objectif de fournir à l'issue du TP un algorithme proposant pour un maillage triangulaire au
hasard une compression maximum (le moins de triangle strip possibles, ...). Sachant qu'une face est orienté,
vous fournirez deux versions de l'algorithme, dans le cas où les faces sont orientées et l'autre non.
Indications:
–Écrivez une méthode qui pour un maillage, calcul les arêtes de chaque face associée à une
orientation ainsi que ses sommets.
–Une part importante de l'efficacité de cet algorithme réside dans le choix du premier triangle de
chaque triangle strip
–Dans le cas de l'algorithme avec les faces orientées, vous pouvez utiliser le symbole swap qui
permet la connexion entre deux triangles. Par exemple la liste d'indices (1,2,3,4,5,4,6,7) devient
(1,2,3,4,5,swap,6,7)
–Une compression vis a vis de la géométrie (soit de la liste de sommets) est elle possible ?
–Écrivez une méthode qui calcule la taille de votre nouveau maillage
Pour aller plus loin, il faut aller chercher du coté des algorithmes SGI, STRIPE ainsi que la notion de graphe
dual.
Annexe 1: description succincte des fichiers
Le projet se divise en 4 parties (en gras les parties dans lesquelles nous allons travailler) :
- Le chargement (fichier MeshLoader.h/.cpp, classes ObjLoader et PlyLoader), la création et la
modification (fichier Mesh.h/.cpp, classes Vertex, Face, Mesh …) de maillages.
- L'affichage des maillages via OpenGL (fichier Renderer.h/.cpp, classe Renderer) et leurs manipulations
dans l'espace de la caméra (fichier Renderer.h/.cpp classe Camera et CameraLookAt)
- La partie Application qui contient l'ensemble des classes et méthodes nécessaire à l'affichage d'une fenêtre
(fichier GUI.h/.cpp, classes GUI et GUISDL), les méthodes d'initialisation, de mise à jour et de destruction
(classe Application)
- Et enfin la partie consacré au programme principal (fichier main.cpp, classe DemoMesh), c'est dans
cette classe que l'on gère l'initialisation, la modification, l'affichage et la destruction des maillages.
Annexe 2: quelques commandes Visual
–compiler: touche F7 ou dans l'explorateur de solution, clic droit sur Main_app → Build
–exécuter: touche F5 ou triangle vert dans la barre d'outils
–arreter l'execution: Maj+F5
–aller a la définition (de n'importe quoi): F12
–Débugger:
–placer un point d'arrêt: F9
–passer a la ligne suivante: F10 (après avoir atteint le point d'arrêt)
–rentrer dans la méthode: F11
Téléchargement