M1 - Images
2007-2008

TD 2 - Visualisation


objectifs : visualiser un objet ou une scène.


Quelques rappels sont disponibles en annexes.



Partie 1 : décrire un objet 3D


    Décrivez un cylindre paramétré, par exemple (rayon de la base, hauteur, nombre de tranches).


Partie 2 : visualiser un objet 3D


    Placez votre cylindre dans le monde, à l'origine par exemple, et écrivez une caméra manipulée à la souris, ou au clavier, permettant d'observer l'objet sous toutes les coutures.
    Quels sont les degrès de libertés utilisés dans ce cas ?

    Pour connaître la position de la souris : cf. SDL Programming Guide
    Pour placer facilement la caméra dans la scène : gluLookAt, cf. openGL man pages, section glu

Partie 3 : positionner plusieurs objets 3D


    Placez plusieurs cylindres dans le monde, et écrivez une caméra permettant de se déplacer dans la scène.
    Quels sont les degrès de libertés utilisés dans ce cas ?
    Quelles sont les solutions classiques à ce problème ?

    Utilisez la pile de matrices pour positionner facilement les différents éléments, cf. glPushMatrix / PopMatrix, cf. openGL man pages.

Partie 4 : visualiser un terrain et des arbres 'cylindriques'


    Créez une scène constituée d'un terrain représenté par une carte d'altitude et d'un ensemble d'arbres construit avec les cylindres de la partie 1.
    Vous pouvez utiliser l'image suivante comme carte d'altitude : le noir représente une altitude basse, le blanc, une altitude plus élevée.
    Pour charger l'image, utilisez SDL_LoadBMP, cf. SDL Programming Guide





    Vous devriez obtenir ceci :




    Pour la construction des arbres, le plus simple est d'utiliser des cylindres de plus en plus fin pour modéliser le tronc et les branches. Utilisez la pile de matrices pour positionner facilement les différents éléments. Vous pouvez vous inspirer d'un systeme de grammaire afin de générer une famille d'arbres.


Partie subsidiaire : génération de terrain automatique


    Une première solution est disponible dans l'archive terrain.tar.gz. Les explications correspondantes sont disponibles. Cette méthode est particulièrement limitée, vous pouvez parcourir "Real Time Procedural Terrain Generation" pour vous faire une idée de méthodes plus interressantes (ainsi que l'archive bibliographique associée).





Partie subsidiaire : n'afficher que ce qui est visible

    Un terrain représente beaucoup de géométrie à afficher, comment déterminer quelles parties sont visibles et lesquelles ne le sont pas ?
    (indication : un sommet est transformé par MODELVIEW et PROJECTION, quelles sont les propriétés de l'espace projectif de la caméra ?)


Partie subsidiaire : affichage efficace


    Décrire la géométrie à afficher avec des glVertex est simple et pratique, mais particulièrement long. Une méthode plus efficace consiste à construire un tableau pour chaque attribut des sommets de l'objet à afficher et à afficher le tableau en une seule fois, cf. Vertex Arrays dans openGL Programming Guide



Rappels :


    Les étapes suivantes doivent apparaître clairement dans vos programmes :

    initialisation et création du contexte openGL
    boucle d'affichage :
       effacer le buffer de rendu
       placer et orienter la camera
       fixer la projection (en fonction de la largeur et de la hauteur de la fenetre)
       placer, orienter et afficher chaque objet
       échanger les buffers de rendu et d'affichage
    sortie


    Quelques indications, étape par étape :

   Documentation des différentes fonctions openGL man pages.


    Manipulation des matrices :
    glMatrixMode(GL_MODELVIEW) / glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glTranslate()
    glRotate()

    pour gérer facilement une hiérarchie de repères :
    glPushMatrix()
    glPopMatrix()