readme - Romain
Transcription
readme - Romain
Aztech v1.0, 21 novembre 2006 Auteurs : – Benoît Bossavit – Stéphane Romero-Romero – Romain Vergne Chargé de TD : – Pascal Desbarats Responsable du cours : – Tamy Boubekeur Installation Bibliothèques additionnelles requises : – QT4 (http ://www.trolltech.com/) – QGLViewer (http ://artis.imag.fr/ Gilles.Debunne/QGLViewer/) – Trimesh2 (http ://www.cs.princeton.edu/gfx/proj/trimesh2/) Recommandations : – QGLViewer doit être compilé avec QT4 – Trimesh2 n’est pas indispensable pour l’application, il est utilisé seulement par les plugins de chargement (load) et de sauvegarde (save) de fichiers. Compilation de l’application principale : – Modifier le fichier "buildcfg.pro" en y indiquant le chemin vers les bibliothèques citées ci-dessus. – Se placer à la racine de l’application (répertoire Aztech/) – Taper les commandes suivantes : – qmake main.pro – make Remarque : le qmake est celui de QT4 Compilation des plugins – Se placer dans le répertoire Aztech/plugins – Taper les commandes suivantes : – qmake plugins.pro – make Remarque : pour compiler de cette manière les plugins rajoutés ultérieurement, il suffit d’ajouter dans le fichier plugins.pro le nom du plugin. 1 Utilisation Lancement de l’application – Se placer dans le répertoire Aztech/ – Taper ./aztech Liste des raccourcis clavier – Menu Mode – ’tab’ : passage du mode object au mode d’édition et vice versa – Menu Manipulation – ’e’ : extruder des faces – ’f’ : bouger des faces – ’v’ : bouger des sommets – Menu Subdivision – ’l’ : Loop – ’b’ : Butterfly – ’s’ : Sqrt3 – Menu Settings – ’ctrl+H’ : afficher l’historique – ’ctrl+S’ : afficher les statistiques – ’ctrl+F’ : afficher la fréquence de rafraîchissement – Au niveau des visualiseurs – ’a’ : afficher les axes – ’g’ : afficher la grille – ’h’ : afficher l’aide QGLViewer Manipulations de la souris (hors plugin) – ’clic gauche’ : tourner la caméra – ’clic droit’ : translater la caméra – ’molette’ : zoomer/dézoomer – ’shift+clic gauche’ : sélectionner des sommets ou des faces – ’ctrl+clic gauche’ : désélectionner des sommets ou des faces – ’clic droit sur la sphère’ : déplacer la lumière Remarque : – Il existe beaucoup d’autres raccourcis (voir l’aide QGLViewer) – Les plugins peuvent prendre la main sur les évenements souris. Par exemple, pour bouger des points ou extruder des faces on utilisera le clic droit. Architecture L’application est structurée en quatre paquetages : GUI, Core, Support et Plugin. Chacun de ces modules est construit sous forme de bibliothèque dynamique (voir figure ci-dessous). 2 Fig. 1 – Diagramme UML GUI L’interface graphique est gérée par la classe MainWidget qui contient 4 visualiseurs (un pour chaque vue bloqué sur un plan et un pour la vue libre en 3D), une zone reservée à l’historique et une autre à l’affichage des statistiques. A chaque fois que l’utilisateur lance un plugin, son action est enregistrée dans une structure. A l’aide de cette structure, l’utilisateur peut afficher l’historique, la sauvegarder dans un fichier ou charger un historique préalablement sauvegardé. Il peut afficher les statistiques correspondantes aux maillages, c’est à dire le nombre de sommets et de faces. L’interface RenderContext permet de changer le type de rendu utilisé pour la vue libre. Quelqu’uns sont déja implémentés comme le rendu en fil de fer, le phong shading, ... L’interface est basée sur un modèle observeur/observé. En effet, MainWidget contient un observeur qui se charge de remettre à jour toutes les composantes 3 de l’interface lorsque le maillage (observé) est modifié. Core Le paquetage Core contient le noyau de l’application, qui suit le protocole de communication avec les plugins (voir partie correspondante). Cette classe possède le maillage qui est en statique afin de faciliter l’échange avec les plugins. Elle possède aussi l’historique de toutes les actions effectuées dans le mainWidget. Support Le paquetage Support contient le maillage (Mesh) qui est utilisé par tous les autres modules. Il contient aussi la classe History qui propose une structure pour stocker les appels des plugins effectués par l’utilisateur. Remarque : la base de notre maillage est composée seulement des sommets et des faces, nous ne stockons pas de liste d’arrêtes. Plugin Ce paquetage contient tous les plugins chargés par l’application. Il contient des plugins : – créant des primitives – cube – tetrahèdre – octahèdre – sphère – manipulant le maillage – moveVertices – moveFaces – extrudeFaces – effectuant des subdivisions – loop – butterfly – sqrt3 – chargeant et sauvegardant des modèles (off, obj, ...) – load – save Fonctionnement des plugins Au lancement de l’application, tous les plugins présents dans le répertoire Aztech/plugins sont chargés par un appel à la méthode loadPlugins() du module Core. La méthode query() de chaque plugin est alors appelée et l’instance de la structure PluginProperties qu’elle renvoie est stockée dans une table de hachage indexée par le nom du plugin. 4 La structure PluginProperties contient les champs suivants : – directory : nom du menu dans la barre de menu de l’application dans lequel le plugin sera ajouté – exec_event : évènement déclenchant l’exécution du plugin. Les choix possibles sont : – ON_MENU_SELECTION – ON_PRESSED_MOUSE – ON_MOVED_MOUSE – ON_RELEASED_MOUSE – ON_LEFT_MOUSE_CLICK – ON_RIGHT_MOUSE_CLICK – ON_MID_MOUSE_CLICK Remarque : un plugin peut exécuter des actions lors de plusieurs évènements différents. Par exemple, le plugin extrudeFaces crée les nouvelles faces lors d’un clic souris droit (ON_PRESSED_MOUSE | ON_RIGHT_MOUSE_CLICK) et change la position des vertices de ces faces lors du déplacement de la souris (ON_MOVED_MOUSE) – exec_selection_mode : mode de sélection dans lequel le plugin peut être exécuté. Les choix possibles sont : – ON_EDIT_MODE – ON_OBJECT_MODE – shortcut_key : touche de raccourci clavier (cf Liste des raccourcis) permettant d’appeler le plugin (équivalent à sélectionner le plugin dans le menu) – args : liste des arguments nécessaires au plugin pour être exécuté (cf l’énumération labels dans le fichier Aztech/core/inc/labels.h pour une liste exhaustive des paramètres que le plugin peut demander à l’application principale) Chaque plugin est ensuite ajouté au menu correspondant (spécifié dans le champ directory), et son raccourci est également ajouté s’il a été spécifié (champ shortcut_key) Au moment de l’exécution d’un plugin (spécifié dans le champ exec_event), l’application appelle la méthode run() du plugin avec comme paramètres ceux demandés dans le champ args de la structure PluginProperties) 5 Fig. 2 – De gauche à droite : wire, flat, gouraud, phong, toon et normal shading Résultats et performances Comparaisons visuelles Temps d’exécution Cette première série de tests a été effectuée sous Linux, avec une machine disposant d’une carte graphique nVidia GeForce Go 7600, de 1Go de mémoire vive, et d’un processeur AMD Turion 64 X2 Mobile TL50, 1,6 GHz / 200 MHz : N˚ iter 1 2 3 4 5 6 7 8 9 10 Sommets 26 98 386 1538 6146 24578 98306 393218 1572866 - Faces 48 192 768 3072 12288 49152 196608 786432 3145728 - FPS > 125 > 125 > 125 > 125 > 125 > 125 94 24 6 - Loop (s) 0.000148 0.00048 0.002042 0.007214 0.033532 0.145419 0.631621 2.61754 11.645 - MAJ normales (s) 0.00473 0.004326 0.007024 0.017822 0.06205 0.223248 0.906983 2.28974 12.7065 - Total (s) 0.004878 0.004806 0.009066 0.025036 0.095582 0.368667 1.5386 4.90729 24.3515 > 10 min Fig. 4 – Subdivision Loop, effectuée sur la primitive cube, disposant de 8 sommets et 12 faces, avec un rendu de type Phong Shading dans une fenêtre de 590*420 pixels 6 Fig. 3 – Résulats des subdivisions N˚ iter 1 2 3 4 5 6 7 8 9 10 11 Sommets 26 98 386 1538 6146 24578 98306 393218 1572866 6291458 - Faces 48 192 768 3072 12288 49152 196608 786432 3145728 12582912 - FPS > 125 > 125 > 125 > 125 > 125 > 125 95 25 6 7 0.2 - Butterfly (s) 0.000149 0.00036 0.001418 0.005736 0.02577 0.107876 0.478345 2.06021 8.81306 43.561 - MAJ normales (s) 0.002 0.004356 0.006933 0.017343 0.055918 0.20828 0.511059 1.55928 6.15083 27.2584 - Fig. 5 – Subdivision Butterfly, effectuée sur la primitive cube, disposant de 8 sommets et 12 faces, avec un rendu de type Phong Shading dans une fenêtre de 590*420 pixels Total (s) 0.002149 0.004716 0.008351 0.023079 0.081688 0.316156 0.989404 3.61949 14.9639 70.8194 > 10 min N˚ iter 1 2 3 4 5 6 7 8 9 10 11 12 13 Sommets 20 56 164 488 1460 4376 13124 39368 118100 354396 1062884 3188648 - Faces 36 108 324 972 2916 8748 26244 78732 236196 708588 2125764 6377292 - FPS > 125 > 125 > 125 > 125 > 125 > 125 > 125 > 125 60 25 8.5 2.8 - Sqrt(3) (s) 0.000112 0.00027 0.000702 0.001989 0.006006 0.01975 0.061038 0.18666 0.598279 1.86998 5.56012 17.5798 - MAJ normales (s) 0.002014 0.002542 0.005545 0.009226 0.019334 0.05683 0.160463 0.48274 1.19116 3.76218 10.3578 30.1413 - Total (s) 0.002126 0.002812 0.006247 0.011215 0.02534 0.07658 0.221501 0.6694 1.78944 5.63216 15.9179 47.7211 > 10 min Fig. 6 – Subdivision Sqrt(3), effectuée sur la primitive cube, disposant de 8 sommets et 12 faces, avec un rendu de type Phong Shading dans une fenêtre de 590*420 pixels On remarque que nos performances sont très bonnes. En moins d’une minute, nous arrivons à obtenir un maillage (quelle que soit la subdivision) contenant plus de 1.5 millions de sommets et plus de 3 millions de faces, ceci avec une fréquence de rafraîchissement toujours acceptable, grâce, entre autre, à l’utilisation des Vertex Arrays d’OpenGL. Le plus gros maillage est atteint avec la subivision Butterfly, pour laquelle le nombre de sommets obtenu est supérieur à 6 millions, et le nombre de faces dépasse 12.5 millions. Le nombre de normales à mettre à jour est moins grand lors d’une subdivision Butterfly que pour une subdivision Loop, ce qui explique, en partie, la rapidité de l’algorithme. La subdivision Sqrt(3) est rapide mais requiert une grosse mise à jour des normales du maillage après exécution. Ceci est dû au fait que le nombre de faces augmente d’un facteur de 3 à chaque fois. Limites Cette seconde série de tests montre les limites obtenues avec les primitives de notre application. Ces tests ont été réalisés avec une carte graphique nVidia GeForce 6600 GT, 1Go de mémoire vive, et un processeur Intel(R) Pentium(R) 4, 2.80GHz. 8 cube tetrahedron octahedron Sommets 8 4 6 Faces 12 4 8 Fig. 7 – Primitives cube tetrahedron octahedron N˚ iter 9 10 9 Sommets 1572866 2097154 1048578 Faces 3145728 4194304 2097152 Temps (s) 24.3515 40.2883 16.6064 Fig. 8 – Limites obtenues avec la subdivision Loop cube tetrahedron octahedron N˚ iter 10 11 10 Sommets 6291458 8338810 4194306 Faces 12582912 16777216 8388608 Temps (s) 70.8194 198.396 41.1287 Fig. 9 – Limites obtenues avec la subdivision Butterfly cube tetrahedron octahedron N˚ iter 12 13 12 Sommets 3188648 3188648 2125766 Faces 6377292 6377292 4251528 Temps (s) 47.7211 44.9962 28.658 Fig. 10 – Limites obtenues avec la subdivision Sqrt(3) On remarque que l’on obtient plus de 8 millions de sommets, et plus de 16 millions de faces avec la subdivision Butterfly sur le tetrahedron. Dans toutes les subdivisions, on obtient facilement 4 millions de sommets et 6 millions de faces. De plus, nous n’avons pas d’erreurs de segmentation, même en continuant à subdiviser : cela montre que notre programme est robuste. Problèmes et extensions – Problèmes : – La lumière est difficile à sélectionner lorsqu’on clique avec la souris. – Les sommets et/ou faces sélectionnés le restent même après l’exécution d’un plugin ne se servant pas de la sélection. 9 – On ne peut pas sélectionner un trop grand nombre de sommets à la fois – Les paramètres de la caméra sauvegardés dans l’historique semblent insuffisants car si l’on bouge la caméra et que l’on charge l’historique, les résultats ne sont pas forcément ceux escomptés. – Le plugin exécutant la subdivision Butterfly ne fonctionne que sur des objets 2-variétés (et lève une erreur dans le cas contraire). Ainsi elle ne fonctionne pas non plus après extrusion car celle-ci conserve la face extrudée. – Extensions : – Pouvoir charger plusieurs modèles – Proposer la suppression de faces et de sommets 10