Ce programme présente une animation 3D (un cube qui tourne) dans un bouton Swing. Pour cela, j'utilise la librairie JOGL 2.0 RC2 (disponible à
http://jogamp.org), que j'ai configuré depuis Eclipse.
Source / Exemple :
Extraits des sources : la classe TheEventLister
package com.gmail.bernabe.laurent.jogl.jogl_in_button;
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;
public class TheEventListener implements GLEventListener {
/*
- Appelée à chaque fois que la scène doit être dessinée :
- et comme c'est l'Animator qui s'en charge => appelée ultra régulièrement.
- /
@Override
public void display(GLAutoDrawable drawable) {
GL2 gl =
drawable.getGL().getGL2();
/*
- Attention !!!
- L'instance de l'utilitaire GLU , en JOGL, est simplement
- construite en appellant son constructeur.
- /
GLU glu = new GLU();
/*
- Efface l'écran
- => GL_COLOR_BUFFER_BIT : le tamon des couleurs (donc directement responsable du rendu de la scène)
- => GL_DEPTH_BUFFER_BIT : le tampon des profondeurs (presque indispensable !!! => Pour que l'effet 3D
- soit bien géré en toutes circonstances).
- /
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
/*
- On remet toutes les modifications de la matrice courante (MODELVIEW => modele-vueà à zero
- /
gl.glLoadIdentity();
/*
- Paramètre "la caméra"
- Ici on veut la mettre en (0,0,2)
- la pointer vers (0,0,0) et avoir le vecteur (0,1,0) en tant que vecteur de direction haute.
-
- A l'attention des débutants OpenGL !!! C'est une excellente pratique que de :
- => Appeller glLoadIdentity() avant de paramètrer la camera
- => Toujours paramétrer la caméra avant de placer vos objets.
- /
/*
- Et une autre astuce : vérifier glPushMatrix() et glPopMatrix()
- si vous voulez placer des objets relativement par rapport à d'autres (cad en sauvegardant la
- caméra et en la restaurant après avoir placés lesdits objets relatifs).
-
- Mais le livre OpenGL Red Book (Aie !!! En anglais) explique cela
- mieux que moi.
- /
glu.gluLookAt(
0, 0, 2,
0, 0, 0,
0, 1, 0);
/*
- Tourne autour de l'axe y.
- Remarquez que, comme nous appellons glLoadIdentity()
- et que nous incrémentons yRotation à chaque appel de cette méthode,
- => vous aurez l'impression que les objets suivants tournent
- (A moins que vous n'appeliez glPushMatrix() / glPopMatrix() et placez
- ces objets de manière relative.)
- /
gl.glRotatef(yRotation, 0.0f, 1.0f, 0.0f);
/*
- Tourne autour de l'axe X.
- /
gl.glRotatef(xRotation, 1.0f, 0.0f, 0.0f);
/*
Cube.draw(gl);
/*
- Petit algorithme pour
- changer régulièrement d'axe de rotation
- /
if ( ! rotationAroundX) {
yRotation += 0.3f;
if (yRotation >= 360.0f){
yRotation %= 360.0f;
rotationAroundX = true;
}
}
else {
xRotation += 0.3f;
if (xRotation >= 360.0f){
xRotation %= 360.0f;
rotationAroundX = false;
}
}
gl.glFlush();
}
@Override
public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glClearDepth(1.0);
gl.glDepthFunc(GL.GL_LESS);
gl.glCullFace(GL.GL_BACK);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}
/*
- Appelée à chaque fois que l'écran est redimenssionné
- /
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width,
int height) {
// Eviter toute division par zero !!!
if (height == 0)
height = 1;
/*
- Attention : largeur/hauteur et non pas hauteur/largeur !!!
- /
double screenRatio = (double) width / height;
GL2 gl = drawable.getGL().getGL2();
/*
- Attention !!!
- L'instance de l'utilitaire GLU , en JOGL, est simplement
- construite en appellant son constructeur.
- /
GLU glu = new GLU();
/* Paramètre la zone d'écran de la scène
- => Indépendante de la matrice courante
- (MODELVIEW/PROJECTION/...)
- /
gl.glViewport(x, y, width, height);
/*
- On bascule sur la matrice de PROJECTION
- => Necessaire pour définir le volume de vue !!!
- => ATTENTION : ne doit pas être fait dans une autre matrice !!!
- (Notamment GL_MODELVIEW ou GL_TEXTURE (enfin, je pense que
- GL_TEXTURE est un mode de matrice))
- /
gl.glMatrixMode(GL2.GL_PROJECTION);
/*
- Réinitialiser la matrice courante
- /
gl.glLoadIdentity();
/*
- Paramètre la perspective.
- Attention : doit être appelée sur la matrice GL_PROJECTION !!!
-
- Ici on veut un champ de vue de 60 degrés
- et le plan de clipping (d'élimination des volumes) proche situé à
- 0.1 unités de l'oeil
- et le plan de clipping loin situé à 2.5 unités de l'oeil.
- /
glu.gluPerspective(60, screenRatio, 0.1, 2.5);
/*
- On passe en matrice MODELVIEW pour les prochains rendus
- (appels à display() )
- /
gl.glMatrixMode(GL2.GL_MODELVIEW);
}
private float yRotation = 0.0f;
private float xRotation = 0.0f;
private boolean rotationAroundX = false;
@Override
public void dispose(GLAutoDrawable drawable) {
// TODO Auto-generated method stub
}
}
Conclusion :
Mon OS de développement : Xubuntu 11.04
Ce code est adapté d'une source jnlp déposée sur progx.org.