Java Standard: OpenGL

Aus Wikibooks


Einleitung[Bearbeiten]

OpenGL
JOGL

Grundlegendes[Bearbeiten]

JOGL wird nicht mit den offiziellen Java SDK- oder JRE-Releases ausgeliefert. Aus diesem Grund muss JOGL manuell ins Java-System eingebunden werden.

Download der Jogl-Bibliothek[Bearbeiten]

Auf der JOGL-Website finden sich für verschiedene Betriebssysteme und Prozessoren vorkompilierte jogl-Bibliotheken. Zusätzlich stehen dort auch die API-Manuals, sowie die Quellcode-Dateien zum Download bereit.

Entpacken[Bearbeiten]

Entpacken der plattformabhängigen Datei, z.B.: unzip jogl-x.y.z-linux-i586.zip

Einbinden[Bearbeiten]

Um diese Bibliotheken nun in das Java-System einzubinden gibt es mehrere Möglichkeiten. Prinzipiell gilt:

  • Die Dateien jogl.jar und gluegen-rt.jar müssen in den CLASSPATH eingebunden werden.
  • Die nativen Bibliotheksdateien (libjogl_cg.so, libjogl.so, libjogl_awt.so ) müssen im java.library.path gefunden werden, sonst hagelt es bei der Programmausführung nur Laufzeitfehler.

Wie sie das bewerkstelligen, bleibt ihnen überlassen. In manchen Tutorials wird empfohlen, die Dateien in die entsprechenden Java-Unterverzeichnisse zu kopieren. Davon wird aber im aktuellen Jogl-User's Guide dringend abgeraten. Nachfolgend wird eine Kommandozeilen-Variante gezeigt:

  1. Die JOGL-Bibliotheksdateien werden in das Projektverzeichnis kopiert.
  2. Kompilierung im Projektverzeichnis: javac -classpath jogl.jar:gluegen-rt.jar JoglTest.java
  3. Programmstart im Projektverzeichnis: java -classpath jogl.jar:gluegen-rt.jar: -Djava.library.path=. JoglTest

Die nachfolgenden Beispiele basieren auf dem JOGL-Release-Candidate 1.1.0-rc3. Frühere JOGL-Versionen wiesen u.a. eine andere Packagestruktur auf.

Ein simples Programmbeispiel[Bearbeiten]

import javax.swing.*;
import javax.media.opengl.*;

public class JoglTest extends JFrame 
{
  GLCanvas canvas;	

  public JoglTest()
  {
    GLCapabilities cap = new GLCapabilities();
    //frueher: canvas = GLDrawableFactory.getFactory().createGLCanvas(cap);
    //jetzt:
    canvas = new GLCanvas(cap);

    canvas.addGLEventListener(new SceneView());
   
    getContentPane().add(canvas);
   
    setTitle("Simples Jogl-Beispiel");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(300,200);
    setVisible(true);    
  }
 
  class SceneView implements GLEventListener
  {
    public void init(GLAutoDrawable arg0) 
    {
      GL gl = arg0.getGL();
  
      gl.glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
  	  	  
      gl.glMatrixMode(GL.GL_PROJECTION);
      gl.glOrtho(-100, 100, -100, 100, -100, 100);
  
      gl.glMatrixMode(GL.GL_MODELVIEW);
    }

    public void display(GLAutoDrawable arg0) 
    {
      GL gl = arg0.getGL();
           
      gl.glClear(GL.GL_COLOR_BUFFER_BIT);
      gl.glColor3f(1.0f, 0.0f, 0.0f);
      gl.glRectf(-50.0f, -50.0f, 50.0f, 50.0f);  
    }

    public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) 
    {
    }

    public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) 
    {
    }
  }

  public static void main(String args[]) 
  {
    new JoglTest();   
  }
}

Ein einfaches 3D-Beispiel[Bearbeiten]

import javax.swing.*;
import javax.media.opengl.*;
import com.sun.opengl.util.GLUT;


public class JoglTest extends JFrame 
{
  GLCanvas canvas;      

  public JoglTest()
  {
    GLCapabilities cap = new GLCapabilities();
    
    canvas = new GLCanvas(cap);

    canvas.addGLEventListener(new SceneView());
   
    getContentPane().add(canvas);
   
    setTitle("Simples Jogl-Beispiel");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 400);
    setVisible(true);    
  }
 
  class SceneView implements GLEventListener
  {
    public void init(GLAutoDrawable arg0) 
    {
      GL gl = arg0.getGL();
      float l_position[] = {100.0f, 100.0f, 200.0f, 1.0f};
  
      gl.glEnable(GL.GL_LIGHTING);
      gl.glEnable(GL.GL_LIGHT0);
      gl.glEnable(GL.GL_COLOR_MATERIAL);
      gl.glEnable(GL.GL_DEPTH_TEST);
      gl.glEnable(GL.GL_NORMALIZE);
      gl.glEnable(GL.GL_POLYGON_SMOOTH);
      gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, l_position, 0);  
  
      gl.glClearColor(0.7f, 0.7f, 0.7f, 0.0f);
                  
      gl.glMatrixMode(GL.GL_PROJECTION);
      gl.glOrtho(-100, 100, -100, 100, -100, 100);
  
      gl.glMatrixMode(GL.GL_MODELVIEW);
      gl.glRotatef(35.0f, 1.0f, 0.0f, 0.0f);    // Rotation um die x-Achse
      gl.glRotatef(-25.0f, 0.0f, 1.0f, 0.0f);   // Rotation um die y-Achse
    }


    public void display(GLAutoDrawable arg0) 
    {
      GL gl = arg0.getGL();
      GLUT glut =  new GLUT();
           
      gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
      gl.glColor3f(0.2f, 1.0f, 0.3f);
      glut.glutSolidTeapot( 50.0 ) ;
    }


    public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) 
    {
    }


    public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) 
    {
    }
  }


  public static void main(String args[]) 
  {
    new JoglTest();   
  }
}

Weitere OpenGL-Bindings für Java[Bearbeiten]