Contribution à l`élaboration de modèles urbains virtuels - MAP-ARIA
Transcription
Contribution à l`élaboration de modèles urbains virtuels - MAP-ARIA
Diplôme Universitaire Technologique Spécialité informatique Juin/septembre 2001 RAPPORT DE STAGE Goenaga Julien Contribution à l’élaboration de modèles urbains virtuels 3D. Laboratoire MAP – ARIA Ecole d’architecture de Lyon 3, rue Maurice Audin BP 170 69512 Vaulx-en-Velin cedex Université Claude Bernard Lyon 1 Institut Universitaire de Technologie A Département informatique 71, rue Peter Fink – 01000 Bourg-en-Bresse Téléphone : 04 74 45 50 50 Télécopie : 04 74 45 50 51 Courriel : [email protected] Web : http://iutbourg.univ-lyon1.fr Résumé en francais : Mon stage, qui se déroule à l’école d’architecture de Lyon, a pour but la réalisation de deux taches distinctes concernant la création de modèles 3D urbains. La première est la création d’une interface, avec la librairie Qt, permettant de gérer les algorithmes de génération de modèles urbains du laboratoire par compression fractale d’une image. Il faut pouvoir en choisir les paramètres et les images. Le deuxième projet, plus complexe, a pour but la réalisation de scènes en 3D à partir d’images de villes en 2D, niveaux de gris. La partie analyse est importante, car il s’agit , en plus de créer la scène en 3D, d’en optimiser la géométrie, pour pouvoir l’explorer avec un navigateur temps réel, sans ralentissement. En ce qui concerne le premier projet, un rapport d’utilisation de Qt expliquant les bases de son fonctionnement doit être rendu à ARIA. Résumé en anglais : The goal of my training course, in Lyon architecture high school, is the realisation of two tasks concerning the creation of two and three-dimensional urban models. The first task is an interface, with Qt library, which includes ARIA’ s algorithms. We will be able to choose our parameters for the different algorithms. The second project, more complex, has to convert a two dimensional picture into a three-dimensional scene in VRML format. The analysing part is important because I have to simplify the picture before creating the three dimensional scene. Indeed we must obtain scenes that can be explored easily in real time without latency. Concerning the first project, I must make a report which explains how to use the Qt library. Mots clés : VRML : Virtual Reality Modelling Language. Langage informatique utilisé pour représenter des scènes 3D surtout sur Internet. Pixel : Point élémentaire d’un écran. Une image est composée de pixels. Modèle 3D urbain : modèle géométrique d’une ville représentée en 2D par une image, ou en 3D grâce au format VRML par exemple. BMP : format d’image (bitmap) sous Windows. Matériel / logiciel / méthode(s) utilisée(s) : Matériel : Développement sous PC PIII 800Mhz en réseau (100Mbits) Logiciels : Environnement Windows 2000, Microsoft Visual C++ 6, librairie Windows QT (de Troll Tech), Paint Shop Pro 2 SOMMAIRE I- Introduction 1- Objectifs du stage 2- Présentation du sujet. 3- Plan II- Présentation de l’environnement du stage 1- Le laboratoire 2- Les chercheurs 3- Aspects techniques 4- Relations avec le laboratoire durant le stage III- Travaux effectués 1 -Projet n°1. (création d’une interface graphique) A –Description Origine du projet Cahier des charges Champ d’investigation et contraintes Matériel et logiciels utilisés B -Analyses des besoins Définition des phases Conception des phases C -Réalisation Structure des programmes Problèmes rencontrés 3 2 -Projet n°2. (programme de conversion d’images 2D en 3D) A –Description Origine du projet Cahier des charges Champ d’investigation et contraintes Matériel et logiciels utilisés B -Analyses des besoins Définition des phases Conception des phases C -Réalisation Structure des programmes Problèmes rencontrés IV- Conclusion V- Annexes VI- Bibliographie VII- Remerciements Fin du sommaire. 4 I- Introduction 1- Objectifs du stage Les objectifs sont multiples. Dans un premier temps, avant même de parler de l’aspect conception, il est impératif de s’introduire et de s’adapter à l’environnement de travail. Sans cela, il serait très dur de développer quelque chose de correct car nous sommes juste le traducteur entre les idées de l’utilisateur et le programme lui même. Mais cela s’acquiert progressivement. Le but final est donc de comprendre la structure de « l’entreprise », son mode de fonctionnement et les processus qui la font avancer. Dans mon cas je dois me familiariser avec tous les membres du laboratoire, connaître ce que chacun apporte au projet global, pour pouvoir demander en temps voulu des explications sur certains points et pour voir comment ils fonctionnent entre eux pour mettre au point leur projet. En ce qui concerne la conception plusieurs points sont à prendre en compte. D’abord il est question d’analyser avec attention le sujet proposé, en étant à l’écoute de l’utilisateur. En effet il n’est pas envisageable de se mettre à créer sans réflexion un programme qui ne conviendrait pas à l’utilisateur. Cela serait une perte de temps. De plus il faut rester à l’écoute de l’utilisateur en le conseillant si nécessaire. De plus il faut assurer une fonction de conseil, et s’assurer tout au long du développement de l’adéquation avec ses besoins. En ce qui me concerne, mon objectif minimum est de créer une interface graphique sous Windows avec la librairie Qt, permettant de gérer au moins un algorithme de gestion d’images, et dans un second temps, de réaliser un programme convertissant des images en niveaux de gris en images 3D comme nous allons le voir dans la section suivante. 2- Présentation du sujet. Contexte : Le laboratoire de recherche, ARIA, participe à un projet régional : DEREVE1. Celui-ci est bâti autour de trois thèmes de recherche phares de la réalité virtuelle aujourd’hui : - les performances de scènes, - la génération de mondes et de décors virtuels, - l’interaction multisensorielle. L’implication dans ce projet du laboratoire, est à l’heure actuelle , de composer un rapport complet sur le « texturage NPR2 multi échelles » mais aussi, en vertu de la spécificité du laboratoire, de proposer des travaux touchant aux deuxième et 1 2 DEREVE: Développement d’un Environnement logiciel de REalité Virtuelle Elaboré. NPR: Non Photo Réaliste. 5 troisième axes, par exemple dans le domaine de la création des décors urbains de type NPR et de la génération automatique de tissus urbains. Sujet du laboratoire, en cours de développement : Le sujet est à placer dans le cadre d’une recherche d’un modèle fractal généralisé pour les tissus urbains, qui ne soit pas un modèle de croissance à base de règles, mais un générateur à l’instant t. L’idée de départ repose donc sur : - l’association à un tissu urbain tridimensionnel d’une image en niveaux de gris représentant dans le plan (x, y) la position du bâti par rapport au sol, et le long de la coordonnée z la hauteur du bâti par rapport au sol (ce qui autorise donc la représentation des toitures). La surface non-bâtie ne nous intéresse pas dans un premier temps : nous portons notre attention uniquement sur la distribution spatiale du bâti en (x, y). - le codage fractal des images par les IFS3. De nombreux travaux ont été menés avec succès depuis 12 ans sur leur application à la compression des images. Ici, ce n’est pas l’aspect compression qui nous intéresse mais plutôt le modèle de codage fractal. - la reconstruction d’un modèle 3D : c’est l’étape inverse de la première, où l’on associe l’image générée par IFS une scène 3D unique, obtenu après filtrage( car il y a des éléments de détails à éliminer dans une phase de pré traitement, dus à des approximations dans les calculs). Mon sujet : Mon intervention dans ce projet ce fait au niveau des étapes 1 et 2 dans un premier temps, et peut-être au niveau de l’étape 3 s’il reste assez de temps. Je dois développer deux parties indépendantes. La première consiste à créer une interface graphique sous Windows pour pouvoir manipuler et appliquer les algorithmes de traitement des images de tissus urbains. L’utilisateur doit pouvoir choisir ses paramètres sans difficulté et pouvoir visualiser les points importants du déroulement de l’algorithme choisi. La deuxième étape consiste à développer un logiciel permettant de convertir des images 2D en niveau de gris en images 3D (l’intensité du gris représentant la hauteur de l’objet). Celles-ci pourront être visionnées à partir soit d’une interface sous Windows, soit directement dans une fenêtre d’un explorateur de pages web. Mais bien sur nous étudierons ces deux étapes du projet plus en détail dans le paragraphe III. 3 IFS: Iterated Functions Systems. 6 3- Plan Mon rapport va donc être développé autour des thèmes suivants : 1. Dans un premier temps, je vais décrire l’environnement de mon stage, les chercheurs et le lieu de travail, et ensuite l’aspect technique (matériel utilisé, logiciels…). 2. Dans un second temps je développerai la partie du travail réalisé. J’expliquerai mon sujet en définissant le cahier des charges (pour chacune des deux parties). Nous en verrons les objectifs ainsi que les contraintes. 3. Toujours dans « travail réalisé », je définirai les différentes phases et leurs buts, et pour terminer j’expliquerai le travail que j’ai effectué en décrivant tous les points difficiles rencontrés et les solutions apportées. Les résultats seront présentés grâce à des captures d’écran et des commentaires. 4. Pour terminer, je développerai les bibliographie, remerciements et annexes. Fin de l’introduction 7 parties suivantes : conclusion, II- Présentation de l’environnement du stage 1-Le laboratoire ARIA est un laboratoire appartenant à l’un des sites de l’Unité Mixte de Recherche MAP (Modèles et simulations pour l’Architecture, l’urbanisme et le Paysage). L’UMR MAP associe le CNRS et le Ministère de la Culture et de la Communication. La problématique centrale de l’UMR recouvre l’élaboration de modèles et d’outils de simulation en architecture, celle-ci étant considérée dans ses dimensions patrimoniales, constructives, urbaines et paysagères. 2- Les chercheurs Le laboratoire ARIA est composé de chercheurs et d’enseignants chercheurs de l’école d’architecture. Il y a trois membres permanents : MM Hervé Lequay, Xavier Marsault et Renato Saleri, chercheurs et enseignants. De plus, à ce groupe viennent se joindre, à mi-temps, d’autres personnes pour accomplir des tâches auxiliaires. Ajoutons que certains élèves viennent de temps à autres aider les chercheurs dans la réalisation de modèles 3D par exemple ou pour la réalisation de sites. 3- Aspects techniques Le laboratoire se situe à l’intérieur de l’école d’architecture dans une salle aménagée. Sont à la disposition de l’équipe une dizaine de machines, comme des Pc, Macintosh, ou même des Silicon Graphics. Ce matériel se révèle assez puissant pour les travaux qui sont effectués. De plus, toutes ces machines sont reliées en réseau (100Mbits) et à Internet pour pouvoir disposer de toutes les données souhaitées à n’importe quel moment. 4- Relations avec le laboratoire durant le stage Comme nous l’avons vu, l’équipe du laboratoire est constituée de 3 personnes (enseignants, chercheurs ) à plein temps, et de plusieurs autres personnes (étudiants) qui viennent pendant certaines périodes. La taille du laboratoire, qui ne contient qu’une dizaine de machines, confère une atmosphère agréable et amicale. Dès que l’on commence a y travailler, on ne peut que se sentir à l’aise. La pression des résultats à obtenir ne se fait pas trop sentir pour moi et je pense que les relations ne peuvent qu’en être améliorées. De plus, la majeure partie de l’équipe étant constituées de chercheurs, la communication, tant au point de vue purement relationnel, qu’au point de vue technique, s’en trouve grandement améliorée. Ils sont aptes à comprendre les termes techniques utilisés en informatique et comme ils sont pour la plupart professeurs ils peuvent plus facilement aider un élève à s’exprimer. 8 Je peux dire aussi, sans aucun sous entendu, que grâce à la jeunesse relative de l’équipe travaillant sur le projet, les échanges d’informations entre eux et moi sont grandement facilités. Je dois avouer que l’on ose plus les déranger pour demander un service que s’il s’agissait de personnes plus âgées. III- Travaux effectués. 1-Projet n°1. (création d’une interface graphique) A –Description Origine du projet Comme nous l’avons vu dans l’introduction, le laboratoire MAP – ARIA participe à un projet régional : DEREVE. Le but du laboratoire dans ce projet est, entre autre de créer des tissus urbains (des images) avec des algorithmes basés sur les fractals4. Ces algorithmes servent à générer des images originales de tissus urbains. Pour cela, il faut posséder des modèles compressés sous forme fractale. Ensuite, on peut appliquer les différents algorithmes à l’image obtenue. Par exemple, l’algorithme de croisement permet, à partir de deux images d’en générer une nouvelle comportant certaines caractéristiques de la première et de la deuxième image. Nous obtenons un nouveaux modèle urbain qui va être analysé par la suite pour en déterminer les points forts et les points faibles. La laboratoire ARIA se charge de concevoir ces algorithmes (une dizaine environ comme la compression fractale, la mutation…). Cependant, étant développés sous DOS, ils ne sont pas très faciles à manipuler car il faut rentrer certains paramètres que seul le concepteur connaît. Mon rôle est donc de créer une interface graphique sous Windows, regroupant tous les algorithmes développés, pour pouvoir les utiliser presque intuitivement. En effet pour chacun d’entre eux, leur fonction est expliquée ainsi que leurs paramètres. Mais nous allons voir cela dans le cahier des charges qui suit. 4 Fractals: ce sont des figures géométriques dans lesquelles on peut observer des similitudes à différentes échelles. 9 Cahier des charges • Analyser les paramètres d’entrée des programmes ainsi que les résultats que l’on souhaite afficher. (textes, images…) • Concevoir l’application sous Windows : grâce à son interface elle doit permettre, entre autre, de sélectionner un des algorithmes, et pour chacun d’eux afficher les paramètres d’entrée et les résultats (mis en évidence dans le premier point). • Développer l’interface avec la librairie Qt, et montrer sur au moins un exemple son utilisation pour faire fonctionner un programme. • Développer un outil permettant de connaître à tout moment le temps écoulé jusqu’à la fin de l’algorithme. • Rédiger une note précise et brève sur l’utilisation de Qt pour parvenir aux résultats demandés dans l’étape 3. Les fichiers sources seront commentés largement. Les difficultés ou les astuces seront désignées et commentées de la même manière. Champ d’investigation et contraintes Pour arriver au terme de ce projet, il est donc nécessaire d’apprendre à utiliser la librairie de développement sous Windows Qt. Cette tâche est d’autant plus intéressante que toute sa syntaxe et son aide, fournies avec le logiciel, sont en anglais. Pour cela, il me faut étudier les exemples fournis avec la librairie (eux aussi en anglais). Heureusement ceux ci sont clairs et nous apprennent à utiliser les différents objets disponibles de manière progressive. Premier exemple de l’aide : Un bouton dans une fenêtre. 10 Dernier exemple de l’aide: Jeu ou l’on doit tirer sur une cible en ajustant l’angle et la force. On constate ici la différence de complexité entre les deux exemples ! Je dois aussi me renseigner sur le format des images que l’interface gèrera : en effet, pour la plupart des algorithmes, une ou deux images sont nécessaires en entrée ou en sortie. Il faut donc les afficher et les manipuler. Pour cela je cherche des indications sur Internet, sur les formats existant. Enfin je dois aussi me pencher sur le problème de la gestion du temps pour pouvoir calculer le temps restant pendant l’exécution d’un algorithme. Là encore je vais me renseigner sur Internet et je demande conseil à mon maître de stage. Matériel et logiciels utilisés Pour ce projet, j’utilise un ordinateur PC 800Mhz, avec Windows 2000. Pour le développement, il faut bien sûr la librairie Qt mais les fichiers sources seront édités avec Visual C++ 6. La compilation de l’exécutable sera effectuée grâce à « Nmake » , compilateur que l’on trouve sur Internet, indispensable pour compiler le code contenant des objets Qt. 11 B -Analyses des besoins Définition des phases. Phase 1 : Mon premier travail consiste en l’étude des algorithmes déjà réalisés pour en extraire les paramètres d’entrée et de sortie nécessaires à la conception de l’interface. Phase 2 : Apprentissage des concepts de base de la librairie Qt. Je m’entraîne d’abord sur des exemples sans rapport apparent avec le projet. Phase 3 : Création du squelette de l’interface avec les fenêtres principales. Mise en forme avant d’intégrer les algorithmes. Phase 4 : Intégration d’un algorithme (compression fractale) dans l’interface, puis adaptation de cet algorithme à l’environnement de Windows. Phase 5 : Liaison des différents objets dans l’interface. Notion des « SIGNALS / SLOTS » propre à Qt et amélioration de la manipulation des images par l’ajout de ScrollBars5. Phase 6 : Ajout dans le menu déroulant permettant de choisir une image, toutes celles disponibles dans un répertoire donné. Images nécessaires pour le bon déroulement de l’algorithme. Phase 7 : Programmation d’une fonction estimant le temps restant avant la fin de l’exécution d’un algorithme. Certains peuvent tourner pendant plusieurs jours ou plus encore. Conception des phases. Le cahier des charges impose de créer une interface pouvant gérer au moins un algorithme réalisé par Xavier Marsault. Nous intégrons donc le plus important, « compression fractale » car les fichiers fractals sont à la base de tous les autres algorithmes. Phase 1 : Etude de l’algorithme de compression fractale. Cet algorithme a pour but de créer un fichier fractal (*.fra) à partir d’une image graphique Bitmap représentant le plan d’une ville ou d’un quartier. Les fichiers *.fra ne sont pas visionnables directement car ils ne sont pas codés en fonction de pixels6 5 6 ScrollBar : Barre de défilement qui permet par exemple de faire défiler une image. Pixel: sur un écran d’ordinateur un pixel est un point d’une couleur définie. Tous ces points forment une image. 12 mais de blocs fractals (des fonctions mathématiques). Le déroulement proprement dit de l’algorithme n’est pas pour moi le point essentiel à étudier. Je dois juste étudier ses entrées et sorties. Comme nous l’avons donc vu, le premier paramètre indispensable est une image Bitmap (nous verrons plus tard comment je gère ces images). La hauteur et la largeur de cette image doivent impérativement être une puissance de 2 pour que l’algorithme puisse fonctionner. Cependant il n’y a pas de maximum imposé, seul les capacités de la machine utilisée pourront restreindre ces tailles. De plus l’image doit être au format 8bits pour pouvoir coder 256 niveaux de gris. En effet ces 256 niveaux de gris ont une importance durant la conversion en image 3D dans un autre programme. Après avoir sélectionné une image, il reste trois paramètres à choisir : la taille des « blocs Range », la taille des « blocs Domain » et la contrainte de collage. Ces trois paramètres sont indispensables, mais nous ne rentrerons pas plus dans les détails car il faudrait alors décrire l’algorithme lui même. Phase 2 : Familiarisation avec la librairie Qt. Connaissant maintenant les paramètres, donc les éléments dans l’interface qui permettront de modifier ces paramètres, je peux donc commencer à me familiariser avec la librairie graphique sous Windows Qt. Au cours de ma recherche, je sélectionne donc les objets adéquats pour créer mon interface. Je regarde le premier exemple proposé et j’essaie de le reproduire pour obtenir un fichier exécutable. Mais là un premier problème se pose. Après avoir écrit le code en C++, j’essaie de le compiler sous Visual Studio mais celui ci ne reconnaît pas les objets Qt. J’ai donc parcouru l’aide pour trouver la manipulation, et petit à petit j’ai trouvé les différentes phases à effectuer. Voici la démarche à suivre : Etape 1: Dans un éditeur de texte créer le fichier « nomprog.pro ». Celui ci donne les indications pour créer un « Makefile ». Il doit avoir la forme suivante : TEMPLATE = app CONFIG += qt_warn_on release HEADERS = header1.h, header2.h …tous les fichiers *.h du projet. SOURCES = source1.cpp, source2.cpp …tous les fichiers sources du projet. TARGET = nomprogFinal … nom du programme après compilation. DEPENDPATH = ./include … répertoire où se trouvent les fichier *.h de Qt. REQUIRES = large_config Etape 2 : Créer un fichier makefile à partir du fichier *.pro dans le répertoire du projet. Taper : Tmake nomprog.pro –o Makefile Etape 3: Créer l’exécutable. Taper à partir du répertoire où se trouve le projet et le fichier Makefile : nmake Cette méthode est valable si on écrit nous même le fichier *.h comportant la classe décrivant la fenêtre Windows que l’on veut créer. Cette technique étant assez complexe, un éditeur Qt permet de mettre en forme notre fenêtre comme dans Visual Basic, et sauve le projet en *.ui. Ce fichier n’est pas du code C++. Il faut donc passer par les étapes suivantes : 13 Etapes préliminaires pour la compilation d’un exécutable. Etape 1: Création du fichier *.h à partir du projet *.ui. Taper : Uic –o prog.h projet.ui Etape 2: Création du fichier *.cpp. Taper : Uic –i prog.h –o prog.cpp projet.ui Après avoir compilé un exemple, j’ai recherché grâce à Qt Designer, les éléments que je vais incorporer dans mon programme. Voici la liste d’objets disponibles dans la libraire Qt qui me serviront, mais d’autres objets seront sûrement ajoutés. • La liste déroulante servira pour le choix de l’algorithme et le choix des images. • La spin Box servira à donner une valeur aux différents paramètres de l’algorithme. • Les PushButton… pour confirmer des commandes. • Les séparateurs… à votre avis ☺ ? • Les zones de textes pour donner des informations à l’utilisateur sur la fonction du programme, la signification des options… Phase 3 :Mise en forme de l’interface. Comme je l’ai expliqué, il existe un éditeur créant des projets Qt. Celui ci se présente sous une forme proche de Visual Basic (Annexe 1) mais en moins complexe car toute la partie programmation, liens entre les différents objets, n’est pas gérée. Cette étape n’est donc pas très difficile à réaliser car il suffit de placer les objets au bon endroit. De plus il reste à tout moment possible de modifier cette interface en manipulant le fichier cpp créé comme nous l’avons vu précédemment. En effet dans 14 ce fichier se trouve le constructeur7 de la fenêtre, il est donc très facile de modifier une ligne codant par exemple la taille ou la position d’un bouton. Cependant il faut veiller à ce que la disposition des boutons et fenêtres reste cohérente pour l’utilisateur. Après plusieurs tentatives, et quelques conseils des utilisateurs potentiels, j’ai mis au point une première interface. Celle-ci est classique, mais je l’espère compréhensible par tous. Vous pouvez la voir en annexe 2. Elle est composée de 3 parties principales et d’une barre centrale comportant quelques indicateurs comme nous le verrons par la suite. - la première partie, en haut à gauche, est une zone comprenant une liste déroulante et une boite de texte. La liste déroulante servira à sélectionner un algorithme et la boite de texte expliquera à quoi sert cet algorithme. - la deuxième partie, en haut à droite, est une zone comportant tous les paramètres et leur commentaire. Pour la compression fractale il y a trois paramètres à rentrer : B, D, C. - la dernière partie, en bas, est réservée à l’affichage des images que l’on charge et des images obtenues. Au maximum il y aura trois images à afficher : 2 images en entrée et 1 image en sortie. - la barre centrale comporte des outils comme une ligne de texte affichant des messages ou bien une barre de défilement indiquant l’avancement de l’algorithme. Nous verrons comment tous ces éléments interagissent dans la phase 5. Phase 4 :Intégration de l’algorithme « compression fractale ». A l’origine, les algorithmes développés par Xavier Marsault étaient écrits en C. Mon but à donc été de les modifier pour les adapter à la syntaxe C++. Cette tâche a été minime car il a juste fallu faire des modifications pour l’allocation, et la libération de mémoire. En effet la syntaxe est différente en C et C++ : Ex : entiers = (int *) malloc(sizeof(int) * 50 ) ; en C. int *entiers ; entiers = new int[50] ; en C++. Ensuite pour intégrer cet algorithme dans l’interface, il faut déclarer la fonction en tant que méthode de la classe de l’application. Il ne peut pas venir d’un fichier *.h externe car celui ci ne serait pas reconnu par l’interface. Il suffit donc de rajouter une ligne dans le fichier .h de l’application. 7 Constructeur: en C++ c’est la fonction qui initialise, qui définit tous les paramètres d’un nouvel objet. 15 Phase 5 : Liaison des différents objets. Notion de SIGNAL / SLOT Qt Designer est, comme nous l’avons vu, un programme permettant de mettre en forme l’application que l’on veut créer. Pourtant cela n’est, dans 90% des cas, pas suffisant pour créer une application complète car on a besoin de créer de nouvelles fonctions, inexistantes dans Qt. Cependant Qt Designer introduit une nouvelle notion : les SLOTS et les SIGNALS qui permet de lier des objets. Une application Qt est composée d’objets (boites de dialogue, boites de texte, boutons…). Ce qui est intéressant c’est que, à chaque objet, sont associés des SLOTS et des SIGNALS. Les SLOTS et les SIGNALS sont des méthodes appartenant aux objets, mais qui sont utilisées seulement pour relier deux objets. En fait on associe un SIGNAL d’un objet à un SLOT d’un ou d’autres objets. Dès qu’un SIGNAL est activé tous les SLOTS que l’on avait préalablement liés sont exécutés. Par exemple on peut lier un bouton « quit » avec la fonction exit(), donc quand on appuiera sur le bouton l’application en cours s’arrêtera. Il existe quelques SLOT et SIGNALS prédéfinis pour chaque objet mais heureusement il nous est tout à fait possible d’en rajouter autant que l’on désire. Par exemple, une SpinBox qui permet de choisir une valeur numérique, renvoie un SIGNAL valueChanged() donc on peut vérifier, à chaque fois que l’on modifie la valeur si celle ci est valable. Mais on aurait très bien pu créer un SIGNAL valeurDepassee() qui se déclenche dès que la valeur est supérieure à 100. Je vais donc décrire les différentes liaisons entre les SIGNALS et SLOTS de mon application : • On a tout d’abord une liaison entre le SIGNAL clicked() du bouton QUIT et le SLOT exit() de l’application. Le résultat est évident, quand on clique sur ce bouton on sort du programme. • Ensuite nous avons un SIGNAL activated() de la liste déroulante du choix de l’algorithme associé à 2 SLOTS : affiche_indic() et update_choix_algo(). Le premier lit dans un fichier choisi selon l’algorithme, les informations le concernant et les affiche dans la boite de texte de la première zone. Le deuxième, selon l’algorithme choisi, active ou désactive les options nécessaires. • Dans la deuxième zone, il est possible grâce à deux boites déroulantes de sélectionner les images que l’on va traiter. J’ai donc associé leur SIGNAL activated() à deux slots que j’ai créés : update_image1(), update_image2(). Ces SLOTS, dès que l’on choisit une image, les affichent dans les cadres prédéfinis dans la troisième zone. • Dans la troisième zone, comme nous l’avons dit, nous affichons les images. Cependant certaines peuvent être assez grandes (4092*4092 pixels), donc elles ne tiennent pas en entier dans les cadres. C’est pourquoi j’ai rajouté des ScrollBars. Il m’a donc fallu créer des de nouveaux SLOTS qui affichent l’image selon la position des ScrollBars. (voir ci dessous). 16 Scroll Bar 1. • • Scroll Bar 2. J’ai ensuite créé des slots (verify_optb(), verify_optc() …) qui pour chaque option vérifient si elle est correcte quand on la change. Enfin j’ai créé un SLOT run_algo(), qui, quand on appuie sur le bouton Go se situant dans la barre du milieu, exécute l’algorithme choisi. Phase 6 :Remplissage de la boite déroulante des images. Pour pouvoir utiliser un algorithme il faut au moins une image. Mais comment la sélectionner ? J’ai pour cela créé une boite déroulante où se trouve tous les noms des images disponibles dans un répertoire donné. Et c’est là que se trouvait la petite difficulté. Pour y parvenir j’ai utilisé de nouveaux objets que j’ai découvers dans la librairie QT. Il s’agit de QfileInfo et Qdir principalement. Ces objets sont très pratiques. Qdir par exemple permet de renvoyer le répertoire courant dans une chaîne de caractères. Il suffit alors de rajouter le répertoire où se trouve les images(ex : .\images) ainsi on à déjà le chemin. Ensuite grâce à QfileInfo et QfileInfoListe il nous est alors possible de composer un filtre pour la sélection des fichiers(ex : « *.bmp ; *.jpg » ). Donc, tant qu’il existe des fichiers de ce type, je les ajoute dans la boite déroulante. ( nomim1>insertItem( nomfichier ) ; ). Phase 7 : Calcul du temps restant de l’algorithme en cours Certains calculs, étant donnée la taille des images, peuvent devenir très longs. On peut facilement atteindre 7 ou 8 jours de calcul pour la compression fractale par exemple. Nous avons donc décidé d’intégrer dans l’interface une barre de défilement indiquant le pourcentage de calcul effectué et une barre de message indiquant une estimation en jours, heures, minutes, secondes du temps qu’il reste avant la fin de 17 l’application. Cela permet de rassurer l’utilisateur et de savoir combien de temps il va attendre. Je vais expliquer leur réalisation : Barre de défilement : Pour connaître le pourcentage de calcul effectué ce n’est pas très complexe. L’algorithme est composé de trois boucles principales dans lesquelles sont effectuées diverses opérations. Donc il est facile au départ de connaître le nombre totale de boucles (nbBoucle1 * nbBoucle2 * nbBoucle3). Ainsi dès que l’on en finit une on regarde où on est par rapport au total et on obtient facilement le pourcentage. Temps restant : Pour estimer le temps restant, cela est plus difficile. J’ai développé une première méthode qui fonctionne correctement, que nous avons modifiée par la suite pour obtenir des résultats plus précis. Première méthode : Comme je l’ai dit, le programme de compression fractale est développé autour de trois boucles. Cependant, par la nature de l’algorithme, le temps d’une boucle pourra être totalement différent de celui de la boucle suivante. On ne peut donc pas multiplier le nombre de boucles restantes par le temps écoulé dans la première boucle par exemple. J’ai donc décidé de calculer le temps passé dans la boucle de plus haut niveau à chaque tour pour la multiplier par le nombre de boucles restantes. Donc il y a réactualisation de l’estimation à chaque fois que l’on passe dans la boucle de plus haut niveau. Pour plus de précision, j’aurais réactualisé à chaque boucle de plus bas niveau , mais cela prend un certain temps, donc le programme en est ralenti, ce qui devient indésirable. Deuxième méthode : Réalisée pour la plus grande partie par Xavier Marsault, cette méthode s’appuie sur une évaluation du temps restant selon une prédiction. Au début de l’algorithme, on évalue le temps moyen à passer dans une boucle ; celui ci peut être totalement différent dans la boucle suivante. On fait donc apparaître un modèle de prédiction pour les différentes valeurs du paramètres D (taille des blocs Domain). Pour cela il faut connaître la complexité de l’algorithme en fonctions des différents paramètres. Dès que l’on a ce modèle de prédiction (en fonction de D) on fait la somme des multiplications entre le temps moyen, calculé au départ, et une estimation du temps de la boucle en cours, donnée par le modèle trouvé précédemment. Nous obtenons des estimations un largement plus précises qu’avec la première méthode. 18 C –Réalisation Structure du programme Le programme réalisé se compose en fait de deux fichiers. Le premier fichier, « prog.h » a été créé lors de la première compilation pour passer du projet Qt au fichier source en C ; il définit la classe de l’application créée, c’est à dire tous les objets Qt présents dans l’interface, les prototypes de leurs fonctions ainsi que les SIGNALS et les SLOTS. Cependant, au fur et à mesure du développement de l’application, c’est à nous de rajouter les éléments souhaités. Le second fichier est le programme proprement dit. Il contient la définition de toutes les méthodes de l’application, des SIGNALS et SLOTS ainsi que le constructeur8 et le destructeur9 de l’application. Dans la fonction main(), il y a seulement quelques lignes pour appeler l’interface. Ensuite, tant que nous ne quittons pas, ce sont les SIGNALS et SLOTS qui agissent. J’ai donc intégré les algorithmes de Xavier Marsault en tant que SLOTS. Ainsi, pour les déclencher, il faudra appuyer sur le bouton « go » qui enverra un SIGNAL. Bien sur, il faudra auparavant avoir rempli les champs des options correctement. Le listing peut être fourni aux membres du jury uniquement, sur simple demande à [email protected] (il contient près de 2000 lignes de code). Problèmes rencontrés Le premier problème rencontré, a été la compilation d’un projet Qt en un exécutable. Comme nous l’avons vu pour y parvenir, nous sommes obligés de passer par plusieurs étapes dont la création de fichier Makefile. Ce n’est pas instantané comme sous Visual C++ où il suffit de cliquer sur compiler. Heureusement dans l’aide de Qt était décrite la création de petits programmes donc, la compilation était abordée. Ainsi grâce à deux ou trois exemples, j’ai pu faire la synthèse de la compilation d’un exécutable. J’ai rencontré un deuxième problème durant la programmation. Après avoir choisi un algorithme, nous devons choisir l’image ou les images que nous allons traiter. La liste des images se trouve dans une ListeBox. Le problème a été de créer cette liste. En effet le premier problème a été de lire les fichiers présents sur le disque dans un certain répertoire, puis le second d’isoler les fichiers BMP10 pour les mettre dans la ListeBox. Heureusement, un objet de Qt permet de « pointer » un fichier dans un répertoire voulu. Il est alors plus facile de lire le nom du fichier et son extension pour pouvoir l’ajouter dans la ListeBox. Cependant, l’utilisation de cet objet n’est pas très aisée, c’est pourquoi l’aide de Qt reste indispensable. Un troisième problème s’est posé à la fin. Quand nous avons testé des algorithmes avec de grandes images, nous nous sommes rendu compte qu’il était impossible de faire autre chose en même temps car l’application était alors cachée et ne réapparaissait qu’à la fin du programme. Donc, quand on manipule de grandes 8 Constructeur: fonction permettant l’initialisation de tous les éléments de l’application (allocation de mémoire). Destructeur: fonction qui termine l’application par la libération de mémoire. 10 BMP: extension des fichiers Bitmap. Les fichiers Bitmap sont des images Windows. 9 19 images, on ne peut plus savoir combien de temps il reste. Aucune solution n’a encore été trouvée car cela reste un problème mineur, mais je chercherai une solution après avoir terminé la deuxième phase. En attendant, nous exécutons le programme sur une machine libre, c’est-à-dire totalement dédiée à ces calculs. Fin de la partie 1. 20 2-Projet n°2. (création d’un moteur 3D) A –Description Origine du projet La première phase servait à obtenir des modèles urbains originaux en 2 dimensions et en 256 niveaux de gris. Cependant, l’objectif global de l’équipe est la réalisation de modèles urbains en 3 dimensions. En effet, pour se rendre compte des points forts ou des points faibles des modèles générés il est plus facile de les examiner dans un environnement en 3 dimensions plutôt que 2. Il manquait donc un programme réalisant la conversion entre les images 2D et les images 3D. C’est là le but de la 2eme phase. Quel format 3D allons nous utiliser ? Nous avons choisi de créer les fichiers 3D sous format VRML. Il existe plusieurs raisons à cela. D’abord ce format est simple à comprendre et à mettre en œuvre comme nous le verrons dans l’explication des phases. De plus celui ci est accessible par tous (avec des « plugin » ), et son point fort est qu’il est interactif, c’est à dire que l’on peut faire des rotations et des zooms sur les objets créés. Ainsi on est capable d’analyser le modèle sous tous les angles en temps réel. Bien sur, il existe sûrement des programmes proposant déjà de telles fonctions de conversion, mais dans notre cas il faut prendre en compte certains paramètres, et les ajuster à la demande précisée par X. Marsault. De plus cela fournit un sujet intéressant de réflexion et d’analyse. Cahier des charges • Apprendre les bases du format VRML pour extruder des faces. • Créer une petite interface pour choisir un fichier 2D et le convertir en 3D. • Créer le fichier sous format VRML à partir de Visual C++. • Simplifier autant que possible les fichiers 3D. Champ d’investigation et contraintes Pour la partie VRML, il est nécessaire de se renseigner soit dans des livres soit sur Internet. En ce qui concerne la partie de la création de l’image en 3D il faut s’inspirer d’algorithmes qui trouvent les contours des polygones dans une image ; pour cela je vais chercher sur Internet et je demande à Xavier Marsault des renseignements. Matériel et logiciels utilisés Le matériel utilisé sera le même que pour la première partie, mais en ce qui concerne le programme nous le compilerons maintenant avec Visual C++ car la partie importante n’est pas l’interface mais le codage des algorithmes pour la détection de contours, par exemple. 21 B -Analyses des besoins Définition des phases Phase 1 : Apprentissage du format VRML pour pouvoir créer des fichiers 3D depuis Visual C++. Description de la syntaxe de base. Phase 2 : Analyse préliminaire, pour savoir de quelle manière je vais sauvegarder les contours. Phase 3 : Recherche d’une technique de passage des polygones 2D en objets 3D. Phase 4 : Mise en œuvre de la 1ere méthode de la création d’un fichier VRML en C++ à partir d’une image 2D. Pas de simplification. Phase 5 : 2eme méthode : simplification des fichiers 2D (économie de mémoire, gain de vitesse dans l’exploration du fichier 3D). Conception des phases Phase 1 : Apprentissage du format VRML VRML est un langage de modélisation de scène 3d principalement destiné à être exploité sur le Web. Pour modéliser une scène, on fabrique des objets, on les positionne dans la scène, on ajoute éventuellement des sources de lumière... Pour modéliser des objets en 3d, on les décrit au moyen de formes de bases ou par des méthodes plus complexes, on leur applique des matériaux, des textures ... Comme VRML est destiné au Web, il y a en plus des analogies avec HTML, comme la possibilité d'ajouter des ancres (href en HTML) : en cliquant sur un objet, on appelle alors un document qui peut être une page Web ... La version 1.0 de VRML permet de décrire des scènes 3d statiques. Avec VRML 2.0 la description de scènes animées devient possible. Cependant cela ne nous intéresse pas dans notre cas, car nous ne voulons pas créer d’animations mais juste observer une scène 3D créée. Je vais donc expliquer la syntaxe que j’ai apprise grâce à des livres et tutoriaux. • La première ligne d'un fichier VRML 1.0 doit toujours être la suivante: #VRML V1.0 ascii. • Pour écrire une ligne de commentaire, il faut la commencer par #. 22 • • Un fichier VRML est syntaxiquement composé de nœuds. Un nœud est un mot clé suivit d'un champ entre accolades { ... }. Si le champ peut être vide, les accolades doivent toujours être présentes. Par convention, les repères spatiaux sont orthonormés directs, et l'utilisateur fait face au plan (X,Y). Donc par défaut, on a l'axe X vers la droite, l'axe Y vers le haut, et l'axe Z vers soi. • En VRML il existe différentes primitives de bases (objets 3D). Dans la version 1 on peut trouver : Cube, Sphère, Cylinder, Cône, mais pour nous cela n’est pas intéressant car nous créerons nous même nos objets par extrusion (Phase 4). Pour créer une de ces primitives, il faut taper le mot clé puis ouvrir des accolades, écrire les paramètres de création et refermer les accolades. Ex : Cube { width float height float depth float }. • Après avoir crée un objet, il est possible de le manipuler grâce à certains nœuds comme : Rotation, Translation, Scale… La syntaxe est la même que pour créer un objet. Mot clé { paramètres }. Ex : Translation { translation 0 0 0 }. • Cependant quand une scène contient plusieurs objets comment appliquer une manipulation à un seul d’entre eux ? Pour cela il faut utiliser le nœud « separator ». Separator { Translation { translation -2 0 0 } Rotation { rotation 0 0 1 0.8 } Scale { scaleFactor 1 2 1 } Rotation { rotation 0 0 1 -0.8 } Cube { width 2 } } Separator { Translation { translation 2 0 0 } Rotation { rotation 1 0 0 0.8 } Scale { scaleFactor 1 0.5 1 } Rotation { rotation 1 0 0 0.8 } Cone { height 2 } } En effet, dans nos scènes 3D nous aurons des centaines d’objets, ainsi il sera possible de déterminer l’apparence de chacun. • Enfin, le dernier nœud qui pourrait nous intéresser est le nœud « Material ». Celui ci permet d’appliquer une couleur, une texture, de la réflexion et d’autres paramètres à un objet. Grâce à ce nœud, nous pourrons définir différents types d’objets, grâce à leur couleur et peut être des textures. Material { ambientColor 0.2 0.2 0.2 diffuseColor 0.8 0.8 0.8 specularColor 0 0 0 emissiveColor 0 0 0 shininess 0.2 transparency 0 } 23 En VRML il existe beaucoup d’autres nœuds, permettant de créer des scènes complexes mais nous ne les voyons pas car nous n’en aurons pas besoin pour le but que nous nous sommes fixé. Phase 2 :Analyse préliminaire Avant de commencer la recherche des contours dans une image, il faut définir ce qu’on entend par contours. Dans une image il n’y a pas uniquement de beaux polygones fermés qui ne se chevauchent pas. Il y a aussi des pixels isolés ou des lignes de pixels formant parfois des figures complexes à analyser (exemple ci dessous). Comme dans la réalité, l’existence de tels bâtiments est peu probable, une analyse a montrée qu’il était plus judicieux de prendre les pixels, non comme des points mais comme des cubes. On obtient ainsi des formes plus réalistes que de simples faces. Ainsi pour les polygones fermés on a toujours des polygones fermés, mais pour les autres cas, voilà ce qui en résulte : A partir de cette constatation, nous pouvons maintenant regarder comment s’effectue le passage en 3D. Phase 3 :Technique de passage du 2D en3D. Comment peut-on, à partir d’une image 2D, créer une image 3D ? Plusieurs techniques sont imaginables mais je vais expliquer le principe des deux méthodes que j’ai utilisées. La première est la plus simple et la plus rapide à mettre 24 en œuvre mais elle est la plus « gourmande » en mémoire et temps de calcul. Elle ne servira qu’à savoir si la création d’un fichier VRML à partir de Visual C++ est efficace. La seconde méthode est beaucoup plus complexe, mais elle réduit considérablement la taille des fichiers 3D. Ainsi la navigation dans de grandes villes en 3D sera envisageable. Je la mettrai en place une fois que la création d’un fichier VRML depuis VC++ aura été testée. Cependant pour chacune de ces méthodes, le principe de création d’un objet 3D sera le même. Nous allons donc l’étudier dans un premier temps. Le principe de l’extrusion de faces : Une image 2D peut être assimilée à un ensemble de polygones (voir figure ci dessous). En effet elle est constituée de groupes de pixels de même niveau de gris (les polygones). Il faut donc trouver ces faces. Pourquoi avons nous besoin de polygones ? Comme nous l’avons vu le format VRML permet de créer des scènes 3D avec des objets prédéfinis et paramétrables. Cependant, plusieurs autres techniques permettent de créer ses propres objets. Nous allons donc utiliser l’une d’entre elles : l’extrusion. Pour cette technique, nous avons besoin de faces définies par des points dans un espace 2D. Cet justement ce que l’on a dans une image ! Qu’est ce que l’extrusion ? C’est en fait un procédé qui permet de passer d’une surface 2D en un objet 3D. La surface de départ subit une translation par un vecteur de dimension 3. La surface de départ n’est pas effacée et sert de base à l’objet 3D. La surface d’arrivée quant à elle sert de couvercle (voir exemple ci dessous) En VRML nous ferons simplement une extrusion sur l’axe des Y de tous les polygones détectés. 25 Exemple d’extrusion d’un objet : Comment sait-on de quelle hauteur on va extruder les faces ? L’une des conditions de la réalisation de ce projet, était qu’on possédait uniquement des images en NIVEAUX DE GRIS, c’est-à-dire qu’il n’y a pas de couleur mais seulement différentes teintes de gris. Comme nous travaillons avec des images codées sur 8 bits, il y a donc 2^8 soit 256 niveaux de gris. Ainsi il va nous être très facile de savoir la hauteur de l’extrusion d’une face. Celle ci sera en fait proportionnelle au niveau de gris de la face ! Voilà un petit exemple : Le principe est là, passons maintenant à la mise en œuvre. Phase 4 : Première méthode de conversion 2D-3D Je pense que cette technique est la plus simple que l’on puisse envisager. Elle consiste à assimiler chaque pixel de l’image à un polygone (un cube). C’est pour cela que cette technique est très coûteuse en mémoire. En effet pour une image de base (256 * 256 pixels soit environ 65500 pixels) qui ne sera pas la taille maximum, il y aura dans le fichier 3D 65500*2 triangles = 131000 triangles pour les bases des objets 3D fois (4 * 2), pour les quatre cotés de chaque cube, soit 1 048 000 triangles au plus ! Ce nombre déborde les capacités des cartes graphiques actuelles. 26 Cependant grâce à cette méthode nous sommes sûr de ne pas perdre de détails. Nous nous en servons donc, pour de petites images, pour tester et ajuster la sauvegarde du fichier VRML depuis VC++ décrite ci dessous : Sauvegarde du fichier VRML depuis VC++ : Pour constituer le fichier 3D final, il faut passer par 3 étapes. Mais avant tout, au début du programme nous ouvrons le fichier 3D en mode écriture-texte. La première étape consiste à écrire l’entête (vu précédemment). La deuxième étape consiste à écrire un nœud VRML que je n’ai pas mentionné avant, le nœud Viewpoint. Il permet de placer une « caméra » qui sera le point de vue de départ lors de l’exploration. Enfin la troisième étape inscrit dans le fichier VRML les points permettant de décrire les polygones que l’on trouve dans un nœud « Shape ». Phase 5 : Deuxième méthode de conversion, avec simplifications de l’image Cette méthode est plus complexe que la première mais permet de décrire une même scène avec beaucoup moins de données. On gagne ainsi de la mémoire et de la rapidité dans l’exploration de la scène 3D. Cette méthode repose sur la simplification de l’image 2D de départ. Comme je l’ai dit précédemment, une image peut être assimilée à un ensemble de polygones. Le but de la simplification la plus importante est de trouver ces polygones dans l’image. Ainsi nous n’extruderons plus chaque pixel mais seulement la base de chaque polygones codée par quelques pixels. Ex : Extrusion d’un objet avec la première et la deuxième méthode ; Comment trouver les polygones ? Dans un premier temps il faut trouver les contours des polygones. Le reste n’est d’aucune utilité car toutes les informations nécessaires à la création de l’objet 3D (hauteur, forme du polygone) se trouvent sur les contours. Pour cela j’ai utilisé une méthode qui permet de savoir combien de voisins de même couleur a un pixel donné, c’est à dire de savoir si il est à l’intérieur du polygone ou non. De plus elle permet de connaître leur disposition dans l’espace. Ces deux informations sont retournées codées sous forme d’un entier. 27 Pour plus de clarté, j’ai créé deux fonctions, l’une qui teste les voisins horizontaux et verticaux, l’autre les voisins en diagonale. On peut ainsi combiner les deux pour savoir si un pixel est totalement entouré par des pixels de même couleur. Voisins horizontaux et verticaux. Voisins en diagonale. La fonction 1 retourne 3, on sait alors que le pixel testé est dans un coin haut gauche. La fonction 2 retourne 12. Donc, pour chaque pixel de l’image, on teste s’il est entouré de voisins de même couleur que lui. Si c’est le cas, on le supprime de l’image. On obtient donc à la fin de ce premier traitement une image contenant juste les contours des polygones désirés. Cette méthode est efficace pour toutes les images possibles. Dans le cas où un pixel est isolé, celui ci ne sera alors pas effacé. Donc dans les phases suivantes il sera considéré comme un polygone . Dans un second temps, après avoir décelé tous les pixels de contour, il faut scanner une deuxième fois l’image (de gauche à droite et du haut vers le bas) pour les associer à un polygone. Dès que l’on tombe sur un pixel non blanc (sol = blanc), on le sauvegarde dans une liste. A partir de là on cherche les pixels suivants du même polygone. Pour sauver le contour en VRML, il faut rentrer des points définissant une surface dans un certain ordre (sens des aiguilles d’une montre). J’ai donc instauré une règle de parcours des pixels qui est la suivante : • On teste le voisinage du pixel sur lequel on se trouve. 28 • Si des voisins ont été trouvés, on va sur le premier pixel indiqué par l’ordre suivant : haut, droite, bas, gauche. Cependant on ne peut pas aller dans le sens inverse duquel on vient. • Au fur et à mesure que l’on teste les pixels on les sauvegarde dans un tableau. On répète cette opération jusqu’à ce que la boucle soit bouclée. • Ensuite nous envoyons le tableau de pixels (qui contient les coordonnées de chaque pixel du contour) à une fonction qui le traite pour sauvegarder le polygone trouvé dans le fichier VRML. • Cette fonction extrait du tableau de pixels, ceux dont on se sert pour créer la face à extruder en VRML. Ces pixels, si on observe bien (l’image ci dessus par exemple) sont ceux qui sont dans un coin. C’est là qu’il y a un changement de direction. En donnant ces points au VRML dans le bon ordre, il créera automatiquement les segments reliant chaque point à son successeur, donc on obtiendra bien une surface licite. • Cependant rappelons nous de l’analyse préliminaire pour trouver les contours. Ceux ci ne sont pas définis par les pixels mais par leurs bords. Nous ne rentrons donc pas directement leurs coordonnées. Il faut interpréter les quelques cas envisageables. Exemple du coin haut gauche ci dessous : 29 • Il ne reste plus qu’à indiquer la hauteur de l’extrusion de cette face. Celle ci est fonction de la couleur du polygone. Cette technique est efficace, mais laisse apparaître quelques petits problèmes, par exemple lorsque l’on a des segments de droites formants des embranchements mais aucune boucle. C’est pourquoi dans une seconde analyse, et avec l’aide de Xavier Marsault j’ai modifié l’algorithme de parcours des contours qui maintenant fonctionne correctement. - Amélioration de la deuxième méthode - Recherche des contours : C’est cette phase qui a été changée. Nous l’avons vu dans certains cas le précédent algorithme se bloquait, par exemple dans les lignes d’épaisseur de 1 pixel qui forment des embranchements. Maintenant avec la nouvelle méthode ces cas sont corrigés car l’algorithme sait revenir d’où il vient Le parcours des contours a donc été modifié. Nous utilisons, pour nous déplacer, la notation de Freeman, presque similaire à la méthode que j’ai utilisée en premier. DIRECTION DE FREEMAN La technique qui suit constitue une variante de celle de PAVLIDIS (1982). A chaque fois que l’on se déplace on sauvegarde la direction D de laquelle on vient. Le déplacement change et de : haut, droite, bas, gauche, devient D+2, D, D-2, D-4. C’est à dire que si on arrive sur un pixel avec la direction 0, on test alors en premier le voisin 2 puis le 0 le 6 et le 4. La condition d’arrêt étant de retomber sur le pixel de départ. Dans les cas où l’on a une ligne de pixels, on repart en arrière sur les pixels déjà testés mais comme nous prenons les contours en considérant un pixel comme un cube, on traite le coté opposé du contour que l’on vient de tester. A partir de là, la suite de l’algorithme (sauvegarde des polygones dans le fichier 3D..) ne change pas. Nous rencontrons seulement quelques cas en plus à analyser en ce qui concerne la création de contours à partir des lignes de un pixel de largeur. Des essais sur plusieurs exemples ont montré l’efficacité de ce nouvel algorithme. Fin de la partie 2. 30 C -Réalisation Structure des programmes Le programme de conversion est assez simple. Il est en fait constitué d’un unique fichier c. Celui ci est composé des fonctions suivantes : - voisinage4() qui renvoie le nombre et la disposition des voisins verticaux et horizontaux d’un pixel d’une certaine couleur. - voisinage8() qui est la même fonction que la précédente mais pour les voisins en diagonales. - SaveFace(), qui sauvegarde dans le fichier VRML une face trouvée. - La fonction Main(), dans laquelle est initialisé le fichier VRML et dans laquelle se déroule l’algorithme de détection des contours. On a donc dans l’ordre : 1. initialisation du fichier VRML(écriture de l’entête) 2. tracé des contours de l’image. 3. parcours de l’image : - détection d’un polygone - sauvegarde du polygone 4. tant que l’on ne se trouve pas à la fin de l’image. Problèmes rencontrés L’analyse de l’image n’est pas un domaine facile à contrôler. J’ai pu le constater à plusieurs reprises dans l’analyse et dans la programmation de cette phase. En effet, bien qu’on pourrait penser le contraire (par exemple on peut se dire qu’un pixel est négligeable parmis tous les autres), c’est un domaine dans lequel il est nécessaire d’être précis. Il ne faut rien négliger. Le premier problème a donc été de trouver une technique permettant d’obtenir les contours. La première méthode que j’ai utilisée, assez complexe, permettait de sauvegarder dans un tableau de faces chaque face que je rencontrais. Je faisais donc simultanément recherche des contours et sauvegarde de la face trouvée. Cette méthode fonctionnait bien mais nécessitait beaucoup de mémoire et était assez longue. J’ai donc, après une analyse secondaire, opté pour une nouvelle méthode. Celle-ci sépare la détection des contours et la sauvegarde du polygone. (méthode expliquée plus haut). Pour cela, j’ai du analyser les nombreux schémas représentant les différents cas possibles de contours que l’on pouvait trouver. 31 Cependant un nouveau problème se posait lors de la sauvegarde des polygones. Comme je l’ai expliqué, il y a des cas de contours très difficiles à analyser, en particulier les lignes d’épaisseur de 1 pixel qui ne se referment pas (ex ci dessous). Dans ce cas, comme on assimile un pixel à un cube(1*1), il faut créer les contours de cette ligne, ce qui nous donnera par exemple un mur d’épaisseur de 1 unité. Pour des pixels isolés ou des lignes droites cela reste aisé mais quand on a des multiples croisements par exemple, cela devient vite complexe. Une analyse secondaire a donc permis de trouver un algorithme prenant en compte ces cas. Celui ci fonctionne maintenant sans problèmes, même s’il est un peu plus complexe que le premier. Fin de la partie 2. 32 IV- Conclusion Mon stage, ayant pour but la réalisation d’outils pour la conception de modèles urbains virtuels, s’est déroulé d’une manière très convenable. En effet l’équipe, attachante, était là pour me conseiller en cas de besoin. Ainsi j’ai pu me rendre compte, tout au long des 10 semaines, des différentes étapes nécessaires à la mise en œuvre d’un projet. L’analyse y tient une part importante ; cependant les méthodes apprises au cours de l’IUT ne m’ont apporté que peu d’aide. Je pense que ces méthodes sont beaucoup trop générales et ne peuvent pas convenir tout le temps du fait que l’informatique se répand dans une multitude de domaines. En ce qui concerne la technique pure, je n’ai rencontré aucun problème. Je me rends compte que l’enseignement que j’ai reçu m’a beaucoup aidé mais je pense que le véritable moteur à la réalisation d’un projet est la motivation. Au final, je remets donc à l’équipe du laboratoire deux programmes qui fonctionnent, et qui, pour l’instant, lui conviennent. En ce qui concerne l’intégration dans le laboratoire, celle-ci c’est très bien passée peut-être du fait de la taille du laboratoire. L’équipe de chercheurs étant très amicale, il n’y a eu aucun problème. Cependant un laboratoire de recherche n’est pas une entreprise, et donc le travail a effectuer ne se réalise pas de la même manière ni dans les mêmes conditions. Un stage dans une vraie entreprise serait donc une bonne expérience. 33 V- Bibliographie • VRML 2 Source Book. Andréa L. Ames, David Nadeau, John Moreland John Wiley & Sons, Inc ( Livre en anglais ) • Sébastien Marlier: Tutorial VRML 2, http://www.? • Exemples VRML: http://www.multimania.com/grandm • Informations sur Qt : http://trolltech.com/qt/ 34 Je tiens à remercier sincèrement : Toute l’équipe du laboratoire ARIA En particulier mon maître de stage, Xavier Marsault pour son aide et sa patience ainsi que Hervé Lequay pour m’avoir proposé ce stage. Mr Baskurt, Mr Alain Fournier pour ses conseils avisés tout au long de l’année. Mon camarade Valère Forel pour ses renseignements. 35 VII- Annexes ANNEXE 1 Qt Designer, permet de créer l’aspect graphique de l’ébauche de l’interface. 36 ANNEXE 2 L’interface après plusieurs essais. 37