Mini-projet OpenGL
(Module OpenGL, ESSI3 VIMM, M.Buffa)
lapinGL
[Retour]
Fonctionalités
 
Objets 3D (fichiers .obj)

Tous les objets 3d présents dans la scène sont lus dans des fichiers .obj, dont le nom est spécifié dans le fichier de description de scène (.dat).Ce fichier contient toutes les descriptions physiques de l'objet, c'est à dire son apparence. Il contient des informations sur les vertices, normales et faces, ainsi que la couleur, la réaction à la lumière et la texture d'un solide.

Le format s'inspire de celui de fichier utlisé par Wavefront, ce qui permet créer facilement des objets sous un modeleur 3D et de les exporter afinde les utiliser dans Rabbit Race. Rabbit Race reconnait 3 types de tags du fichier exporté de WaveFront. Il s'agit de "Vertex", "Normal" et "Face". Les tags "Material" et "Texture" ont été ajoutés afin de simplifier l'utlisation de ces concepts.

Voici un exemple de fichier .obj minimal, qui néamoins montre toutes les possibilités offertes à l'utlisateur :

        # Converted by WaveFront Export Plugin 0.1

        v     0.577350 -0.577350 -0.577350
        v     -0.577350 0.577350 -0.577350
        v     -0.577350 -0.577350 0.577350

        vn     0.577350 0.577350 0.577350
        vn     0.577350 0.577350 0.577350
        vn     0.577350 0.577350 0.577350

        f     2//1 1//2 3//3

        m     0.2 0.2 0.2     0.8 0.8 0.8     0.3 0.3 0.3     2     0 0 0

        t    planar     0.0 1.0 0.0     1.0 0.0 0.0     1.0 1.0     texture     2


Le tag 'v'
Chaque ligne débutant par un 'v' suivi de trois coordonées décrit un vertex de l'objet.

Le tag 'vn'
Chaque ligne débutant par un 'vn' suivi de trois coordonées décrit une normale associée à un sommet d'une face de l'objet.

Le tag 'f'
Chaque ligne débutant par un 'f' suivi de trois doublets de chiffres représente une face triangulaire de l'objet. Dans chaque doublet, le premier chiffre représente un numéro de vertex, et le deuxième un numéro de normale.

Ces trois tags proviennent de format d'objet WaveFront, et peuvent donc êtres générés automatiquement. Les deux suivants ont été ajoutés par nos soins et concernent la surface des objets.

Le tag 'm'
Définit le matériaux de l'objet, c'est à dire les différentes réactions d'un solide aux rayons lumineux. Le premier triplet définit les composantes RGB de la réflexion ambiante, le deuxième concerne le réflexion diffuse, la troisième le réflection spéculaire. Le nombre qui suit représente la taille du reflet (plus il est élevé, plus le reflet est petit). Le quatrième triplet représente enfin la lumière émise par le solide.

Le tag 't'
Définit la texture appliquée à l'objet. Le tag 't' est suivi du type de projection que l'on désire appliquer à l'objet. Il peut s'agir de 'planar' 'cylindrical' ou 'spérical'.

Dans le cas d'une projection planaire:
Le triplet qui suit définit le vecteur selon lequel la projection s'effectue. Le triplet suivant correspond à l'orientation de la texture lors de la projection. Le doublet qui suit représente le nombre de fois que la texture sera appliquée, horizontalement et verticalement.

Dans le cas d'un projection cylindrique:
Le premier triplet qui suit définit la direction du cylindre, et le second triplet la direction selon laquelle le bord droit de la texture va rejoindre le gauche. Le chiffre qui suit représente le nombre de fois que la texture sera apliquée selon la hauteur du cylindre.

Dans le cas d'un projection sphérique:
Le premier triplet définit l'axe nord - sud de la sphère, et le second a le même sens que dans le cas d'une projection cylindrique.

Enfin, la chaine de caractère définit le nomdu fichier targa (TGA) utilisé pour lire la texture suivi du nombre de résolutions différentes pour le mip-mapping. Dans le cas de l'exemple, les images utlisées pour texturer l'objet auront pour noms "texture0.tga" et "texture1.tga"

 

Scripts de mouvements (fichiers .dat)

Plutôt que de décrire les mouvements des acteurs en dur, dans le code du programme, nous avons créé un parser qui génère automatiquement de nouveaux objets à partir d'un ou plusieurs fichiers data (extension: .dat). Voici les spécification de ce format (il faut respecter l'ordre, les mots clés sont en minuscule)
    # mon fichier data
    # les commentaires avec '#' ne peuvent pas succéder à une ligne normale
    # les lignes blanches sont permises

    object <nom de l'objet> {
      # ici se trouvent les transformations qui décriront la position de l'objet dans le monde,
      # le calcul se fait par ordre d'arrivée (optionel)

      T 0 2 1
      # T signifie translation
      # les 3 chiffres représentent un vecteur <x,y,z>

      R 45 0 0
      # R signifie rotation
      # les angles selon les axes x, y et z (dans l'ordre de calcul) sont exprimés en degré

      S 2 2 2
      # S signifie l'échelle
      # ne pas laisser une valeur à 0

      # on peut composer T,R,S dans n'importe quel ordre et même en rajouter
      T -1 0 0

      # solid est obligatoire, il détermine la forme de l'objet
      solid <nom du fichier .obj sans l'extension>

      # timescale indique la durée des mouvements en millisecondes (optionel)
      timescale 1000

      # motion décrit un mouvement qui sera appelé par un évenement du même nom dans
      # l'exécution du programme. Les deux premiers chiffres indiquent la position de l'horloge sachant
      # qu'un mouvement ne dure que de 0 à 1. Pour changer la durée voir "timescale".
      # (optionel)
      motion <label de mouvement>
      T 0.0 1.0     0 0 0     0 2 0
      R 0.0 0.5     0 0 0     180 0 0
      R 0.5 1.0     180 0 0     0 0 360

      # on peut composer les transformations à volonté. Pour T,R et S il faut deux
      # vecteurs pour le départ et l'arrivée

      # premier fils :
      object {
        T 0 3 0
        # sa position est celle par rapport au père
        solid <fichier objet>
        # ...les options sont les mêmes que l'objet père

      }

      # second fils :
      object {
        T 1 0 0
        S 1 1 2
        solid <fichier objet>
      }
    }
    <EOF>


Détails sur les transformations

La rotation ne permet pas de choisir un ordre parmi les axes. C'est pourquoi pour faire une rotation en y puis en x, mieux vaut faire un rotate 0 angle1 0 puis rotate angle2 0 0

Il n'y a aucune limitation au niveau du nombre de transformations

Détails sur la hiérarchie

Placer un objet dans un autre, rend celui-ci fils de ce dernier. C'est à dire que le centre de son repère est la position de l'objet qui le contient.

Il faut donc se rappeler que les transformations statiques ou les mouvements agissent sur les fils aussi bien que pour le père.

Détails sur les mouvements

Pour les mouvements une petite explication s'impose. Le programme, dès qu'il intercepera un évenement déclanché par la souris ou le clavier, va consulter tous les objets un par un afin de voir si ceux-ci doivent opérer un mouvement du même type que l'évenement, c'est à dire du même label.

Si un évenment "saut" est reçu, et qu'un des objets contient un motion "saut", alors le mouvement est lancé, et cela pendant timescale millisecondes.

Une translation entre 0.0 et 0.5 s'opèrera donc pendant la première moitié du parcours. Et si d'autres mouvements simples, type rotation ou scale, la suivent sur n'importe quelle période, alors ils seront composés à la suite, par ordre d'arrivée.

Les mouvements de bases T, R et S, sont interpolés linéairement. Il est prévu d'ajouter des mouvements plus complexes, dépendant de fonctions mathématiques (x^2, cos, exp...). On peut même envisager de mettre autant de point de controle que l'on veut et de décrire ainsi des courbes "spline".
 
[Retour]