[jogl] animation 3d dans un bouton

Description

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); /*
  • Voir la classe Cube
  • /
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.

Codes Sources

A voir également