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 créons un objet Animator en passant en paramètre le canvas que nous souhaitons mettre à jour.
- Tel un thread, nous exécutons l'instance d'Animator via sa méthode start().
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;
|
Résultat
En suivant ce tutoriel, nous aurons réussi à produire un cube de couleur en rotation, en OpenGL.
