OpenGL

Animer un cube

Objectif

A l'état actuel, notre programme ne peut générer qu'un seul rendu. Il a besoin d'une "boucle de rendu" afin qu'il puisse générer plusieurs rendu d'une scène (en moyenne : 60 images par secondes). Après avoir mis en place la boucle de rendu, nous allons "animer" notre cube via une simple fonction de rotation.


L'objet Animator

Animator est une classe de JOGL. C'est un thread qui met à jour systématiquement le canvas (et donc le rendu de la scène). Son utilisation est très simple :

Nous venons juste d'implémenter une boucle de rendu. Ces deux lignes de codes doivent être écrites après la création du canvas.
Par ailleurs, il existe des classes alternatives à Animator qui permet d'avoir un meilleur contrôle sur l'objet. Par exemple: FPSAnimator permet de fixer un nombre d'images par seconde (par défaut: 60 fps).

L'objet Animator est un thread qui a besoin d'être arrêté, lorsque l'application se termine. Sa méthode stop() se charge de cette tâche.


Rotation du cube

Pour mettre en avant la forme cubique que nous avons générée, nous allons lui appliquer une rotation sur ses 3 axes.

Pour faciliter la tâche, nous allons déterminer l'angle de rotation du cube à partir du temps système:
float angle = (System.currentTimeMillis()/10)%360;

La fonction de JOGL à utiliser pour la rotation de la matrice est glRotatef()
. Il est important de savoir qu'il existe une différence de calcul sur la matrice du modèle (ou une différence dans la rotation d'un repère), selon la façon d'invoquer la méthode de rotation sur les axes: invoquer une fois la méthode de rotation sur les 3 axes, ou invoquer la méthode de rotation pour chaque axe. Si nous utilisons la dernière option, nous aurons le code suivante :

float angle = (System.currentTimeMillis()/10)%360;
gl.glRotatef(angle, 1.0f, 0.0f, 0.0f);
gl.glRotatef(angle, 0.0f, 1.0f, 0.0f);
gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);

Résultat

En suivant ce tutoriel, nous aurons réussi à produire un cube de couleur en rotation, en OpenGL.