[jogl] animation 3d dans un bouton

Soyez le premier à donner votre avis sur cette source.

Vue 5 865 fois - Téléchargée 538 fois

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

Ajouter un commentaire

Commentaires

cs_Julien39
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
248 -
Tu as récupéré une partie du code que tu utilises, tu aurais pu adapter les commentaires.

Même si la source n'est pas entièrement de toi, elle permet sur ce site de donner un exemple d'utilisation de cette librairie (qui n'est pas facile à appréhender)

Donc, c'est pas mal
cs_loloof64
Messages postés
350
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
6 novembre 2012
-
Salut, oui j'ai adapté le code de la source (version compilée du jnlp sur progx.org). Après j'ai hésité à mentionner l'origine car le site ne proposait pas les sources, mais une version compilée (ce que je regrettais vraiment).

Merci pour la note.

Et désolé pour l'auteur original. La prochaine fois je le contacte par email.

(PS je suis en train de rédiger un tutoriel pour codes-sources pour l'intégration de JOGL à Eclipse. Je voulais aussi rédiger le déploiement en Jar auto-éxécutable, mais il se trouve que pour cette dernière étape, moi-même je ne peux le rendre fonctionnel. Je ne m'en sors pas non plus en JNLP. Donc si quelqu'un peut m'aider ...)
cs_Julien39
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
248 -
Ce n'est pas grave de récupérer du code, tu ne vas pas le réinventer. Mais les commentaires en anglais c'est pas terrible...

Pour ton PS : pose la question sur le forum
cs_loloof64
Messages postés
350
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
6 novembre 2012
-
Merci
Oui c'est vrai pour le commentaires en anglais, je vais le reposter en les traduisant (c'est parce que c'est une pratique recommandée, mais le fait est que codes-sources est un site français, donc je vais l'adapter).

Je vais poser la question sur le forum pour l'exportation de prog java
Utilisateur anonyme -
Bonjour

Il y a plusieurs problèmes avec cette source :
- tu utilises une version obsolète de JOGL (ce qui peut induire les débutants en erreur sachant que la version actuelle est la version 2.0 RC2)
- tu postes un lien obsolète vers la bibliothèque JOGL (elle n'est plus gérée par Oracle & Sun Microsystems depuis environ novembre 2009 mais par la fondation JogAmp : http://jogamp.org)
- tu utilises GLJPanel & JFrame alors que ce n'est pas nécessaire pour un exemple si simple, GLCanvas & Frame auraient fait l'affaire avec de meilleures performances surtout sur les machines avec un mauvais support des pixel buffer objects et des PBuffers

Je te conseille vivement de t'inspirer de l'exemple que j'ai posté sur Wikipedia ainsi que des tutoriels officiels fournis par la fondation JogAmp et nos contributeurs. D'ailleurs, nous disposons déjà de tutoriels très complets en anglais pour la configuration d'Eclipse et de Netbeans avec JOGL, je te conseille de les lire pour éviter d'induire des gens en erreur en ne respectant pas les bonnes pratiques.

J'espère de tout coeur que tu prendras en compte mes suggestions car ce serait bête de faire perdre du temps à d'autres débutants en les orientant vers JOGL 1.1.1a qui n'est plus maintenu depuis un an et demi (JOGL 2.0 est la seule version maintenue).

Pour JNLP, c'est mon truc, inspire-toi de ce que j'ai fait pour mon first person shooter. Cordialement.

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.