Java: Intro OpenGL

 

Les couches 3D java

 
On peut prendre la mise en oeuvre distribuée chez sun: https://jogl.dev.java.net/. Sa caractéristique est d'être une encapsulation directe des primitives de la librairie standard C (http://opengl.org). Ainsi, ce que vous avez pu apprendre et développer avec openGL en C est très facilement (normalement) portable en java.

Sur le web

  • http://www.cse.unsw.edu.au/~cs3421/jogl/
  • http://www.stud.ntnu.no/~johanno/appletviewer.jsp?task=tutorials.
  • http://www.nondot.org/~kungfoomaster/ 

Comment installer et tester jogl

D'abord l'environnement

  • On installe un JDK
  • On doit d'abord installer au moins JDK 1.4.2 (chez Oracle)
  • On installe ce qui concerne JOGL
  • On prend jogl.jar et on le place dans le répertoire réservé aux extensions dans l'arborescence java.
  • Si JDK est installe sous le répertoire $JAVA, alors c'est dans $JAVA/jre/e/lib/ext. Si on n'a pas les droits d'écriture, alors, on le place n'importe oû et on modifie la variable d'environnement CLASSPATH.
Ensuite, il faut les classes et les librairies spécifiques au système. On prend :
  • jogl-natives-linux.jar pour linux
  • jogl-natives-win32.jar pour windows 
On place ces archives toujours au même endroit et on décompresse l'archive:
% jar xvf jogl-natives-linux.jar
 
 
Sous linux, on doit avoir libjogl.so et libjogl_cg.so (sous windows on a les dll équivalentes).
 
Pour finir, on prend jogl-demos.jar, jogl-demos-util.jar et jogl-demos-data.jar, on les place toujours au même endroit (dans $JAVA/jre/e/lib/ext) et c'est bon!?!
 
Voici le listing de mon répertoire $JAVA/jre/e/lib/ext (sous linux) après tout ça:
 
/opt/j2sdk1.4.2_04/jre/lib/ext# ls -l
total 7964
-rw-rw-r--  1 root root    8896 2004-02-24 16:33 dnsns.jar
-rw-r--r--  1 root root 4156782 2005-01-08 00:01 jogl-demos-data.jar
-rw-r--r--  1 root root  142043 2005-01-08 00:01 jogl-demos.jar
-rw-r--r--  1 root root  134438 2005-01-08 00:01 jogl-demos-util.jar
-rw-r--r--  1 root root  650257 2005-01-07 23:49 jogl.jar
-rw-r--r--  1 root root  287661 2005-01-07 23:58 jogl-natives-linux.jar
-rw-rw-r--  1 root root   53247 2004-02-24 16:42 ldapsec.jar
-rw-r--r--  1 root root  182108 2005-01-07 23:59 libjogl_cg.so
-rw-r--r--  1 root root 1597362 2005-01-07 23:59 libjogl.so
-rw-r--r--  1 root root  769335 2004-10-29 20:37 localedata.jar
drwxr-xr-x  2 root root    4096 2005-01-07 23:59 META-INF
-r--r--r--  1 root root  111374 2004-02-24 16:23 sunjce_provider.jar
/opt/j2sdk1.4.2_04/jre/lib/ext#  
 
 
On exécute quelques démos
Essayez les deux tests suivants:
 
% java demos.gears.Gears
% java demos.infiniteShadowVolumes.InfiniteShadowVolumes
 
 
 
Programme de test
Compilez ce programme avec javac comme d'habitude et testez le.
 
/**  
 * This is a short demo illustrating the basic structure  
 * of a JOGL application. It corresponds to the first
 * attempt example from Hill
 */  
 
import java.awt.*;
import java.awt.event.*;
import net.java.games.jogl.*;
 
public class FirstAttempt extends Frame implements GLEventListener{
     
    final Animator animator;
 
    public FirstAttempt() {
GLCapabilities caps = new GLCapabilities();
 
GLCanvas canvas =
   GLDrawableFactory.getFactory().createGLCanvas(caps);
 
 
canvas.addGLEventListener(this);
 
add("Center", canvas);
setSize(400,300);
animator = new Animator(canvas);
show();
animator.start();
 
addWindowListener( new WindowAdapter() {
public void windowClosed(WindowEvent e){
   animator.stop();
   System.exit(0);
}
public void windowClosing(WindowEvent e) {
   windowClosed(e);
}
   });
    }
     
     
    public static void main( String args[]) {
FirstAttempt frame = new FirstAttempt();
    }
 
    /* The functions below are required because we are a GLEventListener.
       We could also have put them in another class and put that class in the
       addGLEventListener method above.
    */
 
    /**  
     * Executed exactly once to initialize the  
     * associated GLDrawable
     */  
 
    public void init(GLDrawable drawable) {
 
GL gl = drawable.getGL();
GLU glu = drawable.getGLU();
/**  
* Set the background colour when the GLDrawable  
* is cleared  
*/  
gl.glClearColor( 1.0f, 1.0f, 1.0f, 1.0f ); //white
 
/** Set the drawing colour to black */
gl.glColor3f( 0.0f, 0.0f, 0.0f );
gl.glPointSize(4.0f); //a 'dot' is 4 by 4 pixels
    }
     
     
    /**  
     * Executed if the associated GLDrawable is resized
     */  
    public void reshape(GLDrawable drawable, int x, int y, int width, int height) {
GL gl = drawable.getGL();
GLU glu = drawable.getGLU();
gl.glViewport( 0, 0, width, height );
gl.glMatrixMode( GL.GL_PROJECTION );  
gl.glLoadIdentity();
//gl.glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
//gl.glMatrixMode (GL.GL_MODELVIEW);
glu.gluOrtho2D( 0.0, 400.0, 0.0, 300.0);
 
    }
 
    /** This method handles the painting of the GLDrawable */
     
    public void display(GLDrawable drawable) {
GL gl = drawable.getGL();
GLU glu = drawable.getGLU();
/** Clear the colour buffer */
gl.glClear( GL.GL_COLOR_BUFFER_BIT );
/** Draw some dots */  
gl.glBegin( GL.GL_POINTS );  
gl.glVertex2i( 100,50 );  
gl.glVertex2i( 100,130 );  
gl.glVertex2i( 150,130 );  
gl.glEnd();  
 
//gl.glColor3f (1.0f, 0.0f, 0.0f);
 
gl.glColor3f( 0.7f, 0.4f, 0.15f );
gl.glBegin (GL.GL_LINES);
gl.glVertex2i (50, 200);
gl.glVertex2i (75, 250);
gl.glVertex2i (60, 200);
gl.glVertex2i (85, 250);
gl.glEnd();
 
gl.glColor3f( 0.3f, 0.4f, 0.1f );
gl.glBegin (GL.GL_POLYGON);
gl.glVertex2i (300, 50);
gl.glVertex2i (350, 60);
gl.glVertex2i (375, 100);
gl.glVertex2i (325, 115);
gl.glVertex2i (300, 75);
gl.glEnd();
 
 
gl.glColor3f( 0.1f, 0.4f, 0.9f );
gl.glBegin (GL.GL_LINES);
gl.glVertex2i (100, 50);
gl.glVertex2i (100, 100);
gl.glVertex2i (120, 75);
gl.glVertex2i (125, 50);
gl.glVertex2i (125, 100);
gl.glVertex2i (145, 75);
gl.glEnd();
 
 
    }
 
    /** This method handles things if display depth changes */
    public void displayChanged(GLDrawable drawable,
      boolean modeChanged,
      boolean deviceChanged){
    }
}
 
 
 
jogl.jar
jogl-natives-linux.jar
jogl-natives-win32.jar
jogl-demos.jar
jogl-demos-util.jar
jogl-demos-data.jar
Gears.java