[jogl] animation 3d dans un bouton

Soyez le premier à donner votre avis sur cette source.

Vue 6 140 fois - Téléchargée 568 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

Utilisateur anonyme
Bonjour

inesazzouz, Je rejoins entièrement loloof64. Il a fait l'effort de commenter l'intégralité de son code, on ne peut guère faire mieux. Si vous ne le comprenez pas, je vous recommande d'apprendre les bases d'OpenGL avec JOGL 2.0. Il vous manque plusieurs JARs dans votre classpath.

loloof64 a expliqué comment configurer JOGL dans Eclipse ici :
http://www.javafr.com/tutoriaux/INTEGRATION-LIBRAIRIE-JOGL-DANS-ECLIPSE_1278.aspx

Le code de loloof64 est parfaitement fonctionnel. Nous pouvons vous aider mais rien ne sert de prétendre que le problème vient de son code alors que vous avez juste "oublié" de configurer une dépendance vers une bibliothèque tierce. Cordialement.
Messages postés
342
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
6 novembre 2012

Ah oui, désolé pour la complexité du code : mais là il vous faudra vous tourner vers un tutoriel OpenGL : je ne peux pas tout expliquer du début à la fin. Il en existe plein sur le web.
Messages postés
342
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
6 novembre 2012

Bonjour, avez vous ajouté la dernière version de la librairie JOGL au Build Path de votre projet ?
L'ensemble de vos erreurs ne peut venir que de là, pas du code lui-même qui a déjà été testé et vérifié.

Je reste joignable par MP au cas où, histoire de ne pas trop remplir cette discussion.

Merci de votre compréhension.
bonjour;
j'ai utilisé le code sachant que l'outil est l'eclipse mais j'ai trouvé plusieurs problèmes même importjavax.media est soulignée en rouge .
de plus GLEventListener,GLAutoDrawable,GL2 GL sont aussi soulignés en rouge et j'arrive pas à les corriger.
SVP aidez moi car je trouve le code un peux compliqué
merci
Utilisateur anonyme
Merci, c'est mieux ainsi.
Afficher les 16 commentaires

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.