M2PRO - Images
Année 2009-2010

TP1 - OpenGL
et
Transformations



Partie 1 : échauffement en 2D

figure


    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().