[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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.