M2PRO - Images
Année 2009-2010
TP1 - OpenGL
et
Transformations
Partie 1 : échauffement en 2D
On souhaite afficher un "mini" système
solaire composé du soleil, de la terre et de la lune. La terre est
placée autour du soleil en fonction du jour de
l'année et son orientation dépend de l'heure de la
journée (entre 0 et 24h).
Dans un premier temps, on se contentera d'afficher
le soleil et la terre. De même, afin de simplifier la mise en
route,
on supposera que le soleil est au centre de l'univers ... c'est
à dire aux coordonnées (0, 0) dans le plan XY,
correspondant au centre de l'image. On se limitera pour l'instant
à un affichage 2d.
Q0. Comment dessiner un cercle ? (rappel: glBegin(); glVertex(); glEnd())
Q1: Comment décrire la position et
l'orientation de la terre par rapport au soleil ? comment construire la
transformation avec les commandes openGL ? (rappel : glScale(),
glTranslate(), glRotate())
Q2: Comment composer les différentes
transformations nécessaires ? quelle caméra utiliser ? comment la définir (ou la placer, etc...) ?
Q3: Ecrivez une fonction qui affiche la terre dont la position et l'orientation sont passées en
paramètres :
void terre_afficher(const float jour, const float heure);
remarque : les
étapes suivantes doivent clairement apparaître dans votre programme :
initialisation et création du contexte openGL
boucle d'affichage :
effacer le buffer de dessin (rappel: glClear())
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 (rappel: SDL_GL_SwapBuffers())
sortie
un peu de lecture :
openGL Programming Guide
openGL man pages
SDL Programming Guide
Partie 2 : il manque un D ?? (ou 2)
On souhaite maintenant choisir le point de vue
3d permettant d'observer la "scène".
Q1: Comment positionner la caméra dans la scène ?
Q2: Ou sont la terre et le soleil ?
Q3: Y-a-t-il d'autres problèmes ?
Q4: Modifiez votre programme afin de pouvoir
observer le système solaire depuis n'importe quel point de vue (gluLookAt()).
Question subsidiaire : qu'est ce qu'une caméra (réellement) ?
Q5: Comment déplacer interactivement la
caméra afin d'observer la scène ? Existe-t-il plusieurs
solutions ? Pourquoi ?
Partie 3 : affichage efficace
Décrivez le soleil et la terre comme un
ensemble de sommets indexés et utilisez glDrawElements() ou
glDrawArray() pour afficher la scène de maniere plus efficace.
(rappel: glVertexPointer() ...)
Annexes : sdlkit
téléchargez sdlkit pour créer et initialiser facilement une fenetre et un contexte openGL.
exemple d'utilisation :
#include "sdlkit.h"
/* fonction a modifier */
void display(void)
{
// afficher quelquechose
}
int main(void)
{
/* creation de la fenetre d'affichage de 600 par 600 + contexte openGL */
sdlkit_init(600, 600);
/* tant que la fenetre existe */
while(!sdlkit_stop())
{
/* traiter les evenements souris / clavier ...*/
sdlkit_events();
keyboard();
sdlkit_anime(); // patiente un peu, pour ne pas afficher trop vite ...
/* affichage : fonction a modifier */
display();
}
/* c'est fini ! */
sdlkit_quit();
return 0;
}
Si vous souhaitez manipuler votre animation au clavier, il suffit de modifer la fonction keyboard :
void keyboard(void)
{
SDLMod mod;
unsigned char *keys;
mod= SDL_GetModState();
keys= sdlkit_get_keys();
if(keys[SDLK_q] || keys[SDLK_ESCAPE])
/* permet de quitter le programme en appuyant sur ESC */
sdlkit_send_stop();
/* il suffit de tester une touche et d'agir en consequence */
if(keys[SDLK_LEFT])
/* aller a gauche ! */
}
La liste des symboles correspondants aux touches du clavier sont dans le SDL Programming Guide. L'état des touches "mortes" (shift, alt, ctrl, etc.) est donné par SDL_GetModState().