Majeure "Informatique 1"
Enseignement d'Approfondissement "Géométrie et Synthèse d'Images"

Interpolation de formes tridimensionnelles


Projet réalisé par Pierre-Alexandre Pont et Mathieu Brédif (promo 2000)


Description du projet

Le but du projet est de réaliser l'interpolation de deux formes polyhèdrales tridimensionnelles données. Ces fichiers doivent être lisibles par Geomview. Le programme que nous avons réalisé est en fait totalement interfacé avec Geomview. Il s'utilise comme un module externe.

Un tel "morphing" de formes tridimensionnelles peut par exemple servir à réaliser des effets spéciaux pour des films, ou être une fonctionnalité d'un logiciel de modélisation 3D. C'est en effet, une fois qu'on a modélisé des objets tridimensionnels, une façon simple de réaliser des animations.

Le principe de la technique utilisée est exposé dans l'article [1]. L'article [2] présente des améliorations qui rendent l'algorithme à la fois plus rapide et plus robuste.

Plus de détails...

Algorithmes utilisés

Le principal problème est de trouver une géométrie (points/arêtes/faces) commune aux deux objets, c'est-à-dire les contenant toutes les deux modulo une projection sur la sphère unité. Pour s'assurer que l'affichage de l'interpolation ne poserait pas de problèmes, nous avons également choisi de faire en sorte que cette géométrie soit une triangulation (ce problème est seulement évoqué dans les articles cités en référence). Les étapes de l'algorithme utilisé sont les suivantes (elles suivent pour l'essentiel l'article [2]):
  • lire les deux fichiers décrivant les objets
  • calculer toutes les intersections entre les demi-plans contenant les arêtes des deux objets, attribuer à chaque arête de l'objet 0 la liste triée de ses intersections et déterminer sur quelle face de l'objet 1 se projette chaque point de l'objet 0
  • à partir des résultats de l'étape précédente, attribuer à chaque arête de l'objet 1 la liste triée de ses intersections et déterminer sur quelle face de l'objet 0 se projette chaque point de l'objet 1 (grâce à un tri effectué seulement à partir des informations topologiques)
  • retrianguler la géométrie de l'objet 0 afin de créer une géométrie commune aux deux objets
  • calculer pour chaque point de la géométrie commune (les points des deux géométries et les points d'intersection trouvés) les coordonnées initiales et finales
  • interpoler ces coordonnées et afficher la transformation de l'objet 0 en l'objet 1
  • Plus de détails...

    Résultats obtenus

    Les objets à interpoler doivent respecter les critères suivants :

  • être homéomorphes à la sphères unités
  • être étoilés en 0
  • être triangulés (pas de face à plus de trois sommets)
  • Voici deux exemples élémentaires où le programme fonctionne parfaitement :

  • transformation d'un tétraèdre en un autre tétraèdre résultat de son homothétie par l'origine
  •  

  • transformation d'un cube en octaèdre
  • L'interfaçage avec Geomview permet de voir l'animation directement dans la fenêtre "Camera".

    Problèmes rencontrés et solutions apportées

    Les deux phases qui nous ont posé le plus de problèmes ont été :

  • la programmation de la triangulation finale (ce point n'était pas du tout traité dans les articles) (plus de détails sur la triangulation)
  • le déboguage qui ne pouvait se faire au fur et à mesure de l'avancement de l'écriture du programme.
  • D'ailleurs le déboguage n'est pas totalement terminé puisque le programme reconnaît encore imparfaitement les cas particuliers. Ces cas particuliers, qui font boucler ou échouer le programme, sont principalement un point qui se projette sur l'arête de l'autre objet ou deux arêtes qui sont sur un unique plan contenant aussi l'origine. Pour essayer d'empêcher cela, nous effectuons une "petite" rotation aléatoire sur un des objets avant de démarrer l'algorithme.

    Améliorations à apporter

    En plus bien sûr du déboguage finl du programme, voilà quelques améliorations que nous aimerions lui apporter :

  • comme suggéré dans l'énoncé, reconnaître les éléments de la géométrie des objets permettant de détecter leur similitude afin de pouvoir effectuer une éventuelle rotation simplifiant l'interpolation à effectuer
  • remplacer l'interpolation linéaire par une interpolation courbe telle que le chemin suivi par un point lors de l'interpolation soit tangent à ses deux extrémités aux normales des deux objets en ce point
  • réfléchir à une méthode de réduction d'un objet non étoilé à un objet étoilé

    Références

    [1] Kent J., Parent R. et Carlson W., "Establishing correspondences by topological merging : a new approach to 3-D shape transformation", Graphics Interface '91, pp. 271-277 [2] Kent J., Parent R. et Carlson W., "Shape transformation for polyhedral objects", Computer Graphics Vol. 26, No. 2, July 1992, pp. 47-54



    Retour à la liste des projets réalisés

     

    Quelques compléments :

     

    Description du programme

    Le programme se présente sous la forme de trois fichiers .c (3dmorph.c, basic.c, fichiers.c) et de deux fichiers .h (basic.h, fichiers.h). Le module basic.h contient les définitions de types et les fonctions basiques de gestion de ces types telles que la création de nouvelles listes. Le module fichiers.h contient toutes les fonctions servant à la gestion des fichiers et plus particulièrement à l'interfaçage du programme avec Geomview.

    Utilisation du programme

    Le programme peut être utilisé comme un module externe de Geomview ou directement en ligne de commandes :

  • module externe de Geomview : il faut que le répertoire où se situe le programme contienne un fichier .geomview contenant la ligne : (e-module define "3DMorph" ".\3dmorph"). Il suffit alors de lancer Geomview, de charger deux fichiers et de cliquer sur 3DMorph
  • ligne de commande : il faut indiquer en paramètre les deux fichiers au format .geom à lire. Le programme écrit un fichier "3dmorph.geom" correspondant à l'étape intermédiaire de l'interpolation.
  • Quelques détails sur les algorithmes

  • Les articles cités en référence recommandent de projeter les deux géométries sur la sphère de rayon 1 pour effectuer les calculs d'intersection des arêtes. Nous avons décidé de ne pas effectuer cette projection et de mener les calculs comme si on raisonnait sur les classes d'équivalence contenant les points situés sur un même rayon issu de l'origine. Ainsi la détermination de l'existence ou non d'une intersection entre deux arêtes se fait non  pas en considérant la projection de ces arêtes sur la sphère unité mais en considérant les demi-plans contenant ces arêtes et l'origine : l'intersection, si elle existe, n'est pas un point mais un rayon issu de l'origine.
  • Conformément à l'article [2], la détermination de toutes les intersections ne se fait pas en considérant tous les couples d'arêtes (méthode envisagée par l'article [1]) mais par un parcours des arêtes de la géométrie de l'objet 0. Cela permet de réduire la complexité de l'algorithme de morphing.
  • Le tri des intersections sur les arêtes de l'objet 1 se fait également grâce à un parcours des arêtes de la géométrie de l'objet 1, ce qui permet de trouver dans le même temps les faces de l'objet 0 sur lesquels les points de l'objet 1 se projettent.
  • L'algorithme de triangulation

    Qualifions de "noyau" dans un certain triangle t un point, une arête ou un triangle entièrement contenu dans t. A un point d'intersection sur le bord de t on fait correspondre un point noyau si l'arête de 0 qui forme ce point avec un côté de t a un une extrémité qui est un noyau de t. Si une intersection n'a pas de point associé qui soit un noyau de t, c'est donc que son arête coupe t de part en part.

    Chaque triangle de l'objet 1 se divise en "cellules" dont les sommets sont de l'objet 1 ou des points d'intersection; on découpe chaque triangle dès que l'on trouve une arête qui le coupe de part en part. Dans une cellule données, qui n'a donc plus d'arête la scindant en deux, soit aucun point du bord n'a de point associé qui soit noyau de t et donc la cellule est un polygone, soit il existe des points du noyau à l'intérieur de cette cellule. Il suffit alors de recopier tels quels les triangles de l'objet 0 qui sont noyaux de t, et de triangulariser les polygones entourant ce noyau.

    ....

     

    Nous contacter

    Mathieu Brédif - Pierre-Alexandre Pont