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 :
- initialisation et création du contexte openGL, cf. sdlkit_init(largeur, hauteur)
- effacer le buffer de rendu : glClear()
- placer et orienter un objet ou la camera : glRotate(), glTranslate()
- fixer la projection : gluOrtho2D, gluPerspective()
- afficher un objet : déclarer le type de primitive glBegin(), décrire les attributs de ses sommets : glColor(), glVertex(), etc.
- échanger les buffers de rendu et d'affichage : SDL_GL_SwapBuffers()
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()