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