Pour cela, se rendre sur le site officiel, notamment :
http://jogamp.org/deployment/jogamp-current/archive/
(Figure 1)
Allez dans le dossier jogamp-<votre_systeme>-<votre_architecture> (Figure 2) : sachant que si vous n’êtes pas en mesure de déterminer l’architecture de votre ordinateur, vous avez plutôt intérêt à opter pour du i586. En effet, les architectures i586 étant plus anciennes que les architectures amd64, elles n’en sont pas moins compatibles avec ces machines.
Téléchargez alors les archives gluegen-<votre_systeme>-<votre_architecture>.7z et jogl-<votre_systeme>-<votre_architecture>.7z : décompressez-les là où vous pourrez vous en souvenir.
Lancez le menu Windows->Preferences. Commencez à taper « User Libraries » dans le champ de texte destiné à filtrer la pléiade de menus disponibles, jusqu'à ce qu’il n’en reste qu’un seul. Choisissez-le alors. (Figure 3)
Créez une nouvelle librairie (bouton NEW) et nommez-la : mais surtout veillez à ce que le bouton « System library » ne soit pas coché. (Figure 4)
Votre nouvelle librairie apparaît donc, mais est encore vierge. (Figure 5)
Cliquez sur « Add Jars », alors :
Les jars apparaissent alors dans la nouvelle librairie. (Figure 6)
Créez un nouveau projet Java : File->New->Java Project. Il suffit alors de nommer le projet et de valider.
Ouvrez la vue « Package Explorer » si ce n’est déjà fait (Windows->Show View->Package Explorer). Vous pouvez alors apercevoir votre projet, avec des informations sur la JRE Java utilisée (JRE System Library). (Figure 7)
Sélectionnez le nœud « src » du projet, et créez un package à l’aide de la commande File->New->Package : nommez-le com.javafr.jogl_example. (Figures 8 et 9)
Nous allons y créer une nouvelle classe. Pour cela, sélectionnez le package et lancez la commande File->New class : on peut vérifier que le package choisi est le bon, ou le modifier. Ici en l’occurrence, c’est déjà le bon, car on l’a selectionné auparavant. Nommez la classe JOGL_Example, laissez-la en statut « public », et ne cochez rien d’autre que l’option « Inherited methods », avant de valider. (Figure 10)
Du code est alors généré pour nous. Remplacez-en le contenu par le contenu suivant :
package com.javafr.jogl_example; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.media.opengl.awt.GLCanvas; import com.jogamp.opengl.util.FPSAnimator; public class JOGL_Example extends Frame { public JOGL_Example(){ /* Attention, il semblerait qu'en dessous d'une certaine résolution (constaté sous XUbuntu 11.10), l'animation ne fonctionne plus. (On le voit bien d'ailleurs aussitot que l'on passe en "plein ecran" => l'animation fonctionne alors a nouveau).
setSize(300,300); setTitle("Jogl example"); setLocationRelativeTo(null); // centrer la fenetre GLCanvas glCanvas = new GLCanvas(); // definit quelle instance de classe donnera les "commandes OpenGL" glCanvas.addGLEventListener(new TheGLEventListener()); // surtout ne pas oublier d'ajouter le canvas !!! add(glCanvas); /*
final FPSAnimator animator = new FPSAnimator(glCanvas, 35); // Il faudra penser a arreter l'animateur !!! addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { animator.stop(); System.exit(0); } }); // Surtout ne pas oublier de demarrer l'animateur !!! animator.start(); } public static void main(String * args) { new JOGL_Example().setVisible(true); } private static final long serialVersionUID = 1L; }
Sélectionnez le même package et créez de la même manière (File->New Class, avec les mêmes options) une nouvelle classe GLCube. Remplacez-en le code :
package com.javafr.jogl_example; import javax.media.opengl.GL2; public class GLCube { public static void draw(GL2 gl){ final float DEMI_TAILLE_CUBE = 0.5f; // On s'apprete a dessiner des quadrilateres // Chaque groupe de 4 vertex definit 1 quadrilatere gl.glBegin(GL2.GL_QUADS); // les prochains vertex seront bleu gl.glColor3f(0f, 0f, 1f); // le quadrilatere de devant gl.glVertex3f(-DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); gl.glVertex3f(+DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); gl.glVertex3f(+DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); gl.glVertex3f(-DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); // les prochains vertex seront verts gl.glColor3f(0f, 1f, 0f); // le quadrilatere de derriere gl.glVertex3f(-DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); gl.glVertex3f(+DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); gl.glVertex3f(+DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); gl.glVertex3f(-DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); // les prochains vertex seront rouges gl.glColor3f(1f, 0f, 0f); // le quadrilatere de gauche gl.glVertex3f(-DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); gl.glVertex3f(-DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); gl.glVertex3f(-DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); gl.glVertex3f(-DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); // les prochains vertex seront oranges gl.glColor3f(1f, 0.5f, 0f); // le quadrilatere de droite gl.glVertex3f(+DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); gl.glVertex3f(+DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); gl.glVertex3f(+DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); gl.glVertex3f(+DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); // les prochains vertex seront blancs gl.glColor3f(1f, 1f, 1f); // le quadrilatere du haut gl.glVertex3f(-DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); gl.glVertex3f(-DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); gl.glVertex3f(+DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); gl.glVertex3f(+DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); // les prochains vertex seront jaunes gl.glColor3f(1f, 1f, 0f); // le quadrilatere de bas gl.glVertex3f(-DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); gl.glVertex3f(-DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); gl.glVertex3f(+DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE); gl.glVertex3f(+DEMI_TAILLE_CUBE, -DEMI_TAILLE_CUBE, +DEMI_TAILLE_CUBE); // On a fini gl.glEnd(); } }
De même, créer la dernière classe TheGLEventListener et remplacez le code par :
package com.javafr.jogl_example; import javax.media.opengl.GL2; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLEventListener; import javax.media.opengl.glu.GLU; public class TheGLEventListener implements GLEventListener { // Le "paint(Graphics)" d'OpenGL @Override public void display(GLAutoDrawable drawable) { // Nous, on va travailler en OpenGL 2 GL2 gl = drawable.getGL().getGL2(); // Efface la memoire des couleurs, et la memoire des profondeurs gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); // reinitialise tous les calculs de coordonnes de tous les objets (dont la camera) gl.glLoadIdentity(); // Fixe la camera en z = 5, regarde (0,0,0) et a pour // "vecteur haut" (l'axe y) l'axe (0,1,0), donc a le veritable axe y du repere glu.gluLookAt( 0f, 0f, 5f, 0f, 0f, 0f, 0f, 1f, 0f ); // Tourne de la valeur courante d'angle gl.glRotatef(currentAngle, 0f, 1f, 0f); GLCube.draw(gl); // Comme on a appele glLoadIdentity pour reinitialiser calculs, il faut penser // a mettre l'angle a jour ^^ currentAngle += 0.4f; } // le liberateur de ressources @Override public void dispose(GLAutoDrawable drawable) { // TODO Auto-generated method stub } // initialiseur @Override public void init(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); // Autorise les utilisations de profondeurs gl.glEnable(GL2.GL_DEPTH_TEST); } // le redimensionneur d'image OpenGL (est appele a chaque redimensionnement du composant OpenGL) @Override public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { GL2 gl = drawable.getGL().getGL2(); // On relie la zone du canvas a la "zone de travail d'OpenGL" gl.glViewport(x, y, width, height); // On passe en mode : definition de la projection gl.glMatrixMode(GL2.GL_PROJECTION); // Surtout, reinitialiser calculs pour ce mode // sinon les resultats seront cumules avec les precedents calculs gl.glLoadIdentity(); // Ici je choisis de definir une projection perspective (et non orthogonale) // pour etre plus realiste // demi-angle de vision en hauteur = 60 degres // les objets situes ENTIEREMENT entre z = zCamera + 0.1 et zCamera + 10 seront visibles // les autres seront tout simplement ignores glu.gluPerspective(60f, (float) width/height, 0.1f, 10f); // Surtout repasser en mode definition du dessin // pour les prochains appels a la methode display() gl.glMatrixMode(GL2.GL_MODELVIEW); } private GLU glu = new GLU(); private float currentAngle; }
Ne vous préoccupez pas des erreurs qui apparaissent.
Eclipse nous signale de nombreuses erreurs : les projets et fichiers concernés sont signalés d’une croix blanche sur fond rouge (en guise d’icône) dans le Package Explorer. On peut aussi les voir dans la vue Problems (Windows->Show View au besoin). (Figure 11)
En fait, elles disparaîtront dès que nous aurons paramétré le projet pour qu’il utilise la librairie JOGL. Sélectionnez le projet et lancez le menu File->Properties. Sélectionnez alors le menu « Java Build Path » (filtrer au besoin en tapant « Java Build Path » dans le champ texte).
On remarque alors, dans l’onglet Libraries, que seule la librairie standard est utilisée. (Figure 12) Cliquez sur « Add Library… » et sélectionnez l’option « User Libraries ». (Figure 13) Notre nouvelle librairie peut alors être séléctionnée, juste en cochant dessus et en validant la fenêtre. (Figures 14 et 15)
Validez les propriétés : les erreurs disparaissent alors et la nouvelle librairie fait partie intégrante du projet. (Figure 16)
Enfin, pour éxécuter le projet, lancez le menu Run->Run As->Java Application : choississez la classe JOGL_Example comme classe principale. (Figure 17) Un cube sur fond noir se met alors à tourner. (Figure 18)
Ce tutoriel est fini, j’espère avoir pu vous aider à configurer Eclipse pour JOGL. A l’heure où j’ai écrit ce tutoriel, la release candidate 6 de JOGL était encore en préparation, mais il ne devrait pas être difficile d’apdapter alors les instructions du tutoriel.
==Figures illustratives==
Figure
Figure
Figure 3
Figure
Figure 5
Figure
Figure
Figure
Figure
Figure
Figure
Figure
Figure
Figure
Figure
Figure
Figure
Figure