# jogl und eclipse



## stewag (22. Dezember 2006)

Hallo!

Ich möchte jogl für eclipse einrichten und brauche dazu Hilfe, denn es klappt bis jetzt einfach nicht. :-(

Vorhin habe Java (jdk 1.5.0_09) installiert. Das funktioniert. Denn wenn ich java -version ausführe wird es angezeigt.
Anschließend habe ich mit an die Anweisungen von zeja vom 17.10.06 gehalten.
D.h. ich habe mit Eclipse ein neues Projekt angelegt und darin einen Ordner lib eingerichtet. 
Dorthin habe ich die Dateien. jogl.jar, jogl_awt.dll, und jogl_cg.dll kopiert.
Anschließend habe ich die Datei jogl.jar in den Java Build Path von eclipse aufgenommen (Projekt-Properities-> Java Build Path -> Libraries -> Add Jars).

Danach habe ich versucht einen kleinen Quelltext einzugeben. Bei den ersten Zeilen tritt ein Fehler auf. Bei 
import. net.java.games.jogl.*; wird ein Fehler angezeigt. "net" wird nicht erkannt.

Ich frage mich, ob ich die richtige jogl.jar - Datei habe.
Im Package Explorer steht unter jogl.jar
com.sun.gluegen.runtime
com.sun.opengl.cg
com.sun.opengl.impl.error
etc.

Die Dateien jogl.jar, sowie die dll's stammen von jogl.dev.java.net und dort aus der Datei
jogl-1_0_0_windows-i586.

Oder habe ich etwas falsch verstanden und muss ich vorher noch opengl installieren.

Ich kenne mich mit den Werkzeugen (eclipse) nicht aus und brauche eine detailierte Auskunft (für einen echten Anfänger!). Dafür wäre ich sehr dankbar. Falls ich die falsche Datei habe, sagt mir doch bitte, wo ich die richtige finde.

Gruß von stewag


----------



## Thomas Darimont (22. Dezember 2006)

Hallo,

hier mal eine Anleitung für Eclipse 3.3M4 (für altere Eclipse Versionen sollte das weitestgehend passen):
1) Neues Projekt mit dem Name de.tutorials.training.jogl anlegen. (step 1) -> Finish
2) Im Projektverzeichnis zwei neue Folder anlegen:
lib
native
3) Aktuelle Jogl Distribution downloaden:
https://jogl.dev.java.net/#NIGHTLY
4) Alle im entsprechenden Zip enthaltenen jars nach /lib und alle dll's nach /native kopieren.
(Wenn mans entpackt muss man die Jars aus der im Zip enthaltenen Verzeichnisstruktur herauskopieren...)
Mit F5 workspace aktualisieren:
(Schaut dann so aus wie in step 2).
5) Unter lib die beiden jars selektieren -> Kontextmenü -> Build Path -> Add to Buildpath
(Step 3)
6) Project Properties -> (Kontextmenu des Projects...) -> Java Build Path -> Libraries -> step 4
7) bei gluegen-rt.jar -> native library location -> edit -> Workspace -> dort wählen wir unser native Verzeichnis aus. Das selbe machen wir dann auch noch fpr jogl.jar. Sollte dann so ausschauen wie in Step 5.

Fertig:
Nun können wir mal ein Demo aus der jogl-demo Distribution ausführen:

```
package demos.gears;

import java.awt.*;
import java.awt.event.*;

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

/**
 * Gears.java <BR>
 * author: Brian Paul (converted to Java by Ron Cemer and Sven Goethel) <P>
 *
 * This version is equal to Brian Paul's version 1.2 1999/10/21
 */

public class Gears implements GLEventListener, MouseListener, MouseMotionListener {
  public static void main(String[] args) {
    Frame frame = new Frame("Gear Demo");
    GLCanvas canvas = new GLCanvas();

    canvas.addGLEventListener(new Gears());
    frame.add(canvas);
    frame.setSize(300, 300);
    final Animator animator = new Animator(canvas);
    frame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
          // Run this on another thread than the AWT event queue to
          // make sure the call to Animator.stop() completes before
          // exiting
          new Thread(new Runnable() {
              public void run() {
                animator.stop();
                System.exit(0);
              }
            }).start();
        }
      });
    frame.show();
    animator.start();
  }

  private float view_rotx = 20.0f, view_roty = 30.0f, view_rotz = 0.0f;
  private int gear1, gear2, gear3;
  private float angle = 0.0f;

  private int prevMouseX, prevMouseY;
  private boolean mouseRButtonDown = false;

  public void init(GLAutoDrawable drawable) {
    // Use debug pipeline
    // drawable.setGL(new DebugGL(drawable.getGL()));

    GL gl = drawable.getGL();

    System.err.println("INIT GL IS: " + gl.getClass().getName());

    System.err.println("Chosen GLCapabilities: " + drawable.getChosenGLCapabilities());

    gl.setSwapInterval(1);

    float pos[] = { 5.0f, 5.0f, 10.0f, 0.0f };
    float red[] = { 0.8f, 0.1f, 0.0f, 1.0f };
    float green[] = { 0.0f, 0.8f, 0.2f, 1.0f };
    float blue[] = { 0.2f, 0.2f, 1.0f, 1.0f };

    gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, pos, 0);
    gl.glEnable(GL.GL_CULL_FACE);
    gl.glEnable(GL.GL_LIGHTING);
    gl.glEnable(GL.GL_LIGHT0);
    gl.glEnable(GL.GL_DEPTH_TEST);
            
    /* make the gears */
    gear1 = gl.glGenLists(1);
    gl.glNewList(gear1, GL.GL_COMPILE);
    gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, red, 0);
    gear(gl, 1.0f, 4.0f, 1.0f, 20, 0.7f);
    gl.glEndList();
            
    gear2 = gl.glGenLists(1);
    gl.glNewList(gear2, GL.GL_COMPILE);
    gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, green, 0);
    gear(gl, 0.5f, 2.0f, 2.0f, 10, 0.7f);
    gl.glEndList();
            
    gear3 = gl.glGenLists(1);
    gl.glNewList(gear3, GL.GL_COMPILE);
    gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, blue, 0);
    gear(gl, 1.3f, 2.0f, 0.5f, 10, 0.7f);
    gl.glEndList();
            
    gl.glEnable(GL.GL_NORMALIZE);
                
    drawable.addMouseListener(this);
    drawable.addMouseMotionListener(this);
  }
    
  public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
    GL gl = drawable.getGL();

    float h = (float)height / (float)width;
            
    gl.glMatrixMode(GL.GL_PROJECTION);

    System.err.println("GL_VENDOR: " + gl.glGetString(GL.GL_VENDOR));
    System.err.println("GL_RENDERER: " + gl.glGetString(GL.GL_RENDERER));
    System.err.println("GL_VERSION: " + gl.glGetString(GL.GL_VERSION));
    gl.glLoadIdentity();
    gl.glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f);
    gl.glMatrixMode(GL.GL_MODELVIEW);
    gl.glLoadIdentity();
    gl.glTranslatef(0.0f, 0.0f, -40.0f);
  }

  public void display(GLAutoDrawable drawable) {
    angle += 2.0f;

    GL gl = drawable.getGL();
    if ((drawable instanceof GLJPanel) &&
        !((GLJPanel) drawable).isOpaque() &&
        ((GLJPanel) drawable).shouldPreserveColorBufferIfTranslucent()) {
      gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
    } else {
      gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
    }
            
    gl.glPushMatrix();
    gl.glRotatef(view_rotx, 1.0f, 0.0f, 0.0f);
    gl.glRotatef(view_roty, 0.0f, 1.0f, 0.0f);
    gl.glRotatef(view_rotz, 0.0f, 0.0f, 1.0f);
            
    gl.glPushMatrix();
    gl.glTranslatef(-3.0f, -2.0f, 0.0f);
    gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);
    gl.glCallList(gear1);
    gl.glPopMatrix();
            
    gl.glPushMatrix();
    gl.glTranslatef(3.1f, -2.0f, 0.0f);
    gl.glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f);
    gl.glCallList(gear2);
    gl.glPopMatrix();
            
    gl.glPushMatrix();
    gl.glTranslatef(-3.1f, 4.2f, 0.0f);
    gl.glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f);
    gl.glCallList(gear3);
    gl.glPopMatrix();
            
    gl.glPopMatrix();
  }

  public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {}

  public static void gear(GL gl,
                          float inner_radius,
                          float outer_radius,
                          float width,
                          int teeth,
                          float tooth_depth)
  {
    int i;
    float r0, r1, r2;
    float angle, da;
    float u, v, len;

    r0 = inner_radius;
    r1 = outer_radius - tooth_depth / 2.0f;
    r2 = outer_radius + tooth_depth / 2.0f;
            
    da = 2.0f * (float) Math.PI / teeth / 4.0f;
            
    gl.glShadeModel(GL.GL_FLAT);

    gl.glNormal3f(0.0f, 0.0f, 1.0f);

    /* draw front face */
    gl.glBegin(GL.GL_QUAD_STRIP);
    for (i = 0; i <= teeth; i++)
      {
        angle = i * 2.0f * (float) Math.PI / teeth;
        gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
        gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
        if(i < teeth)
          {
            gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
            gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
          }
      }
    gl.glEnd();

    /* draw front sides of teeth */
    gl.glBegin(GL.GL_QUADS);
    for (i = 0; i < teeth; i++)
      {
        angle = i * 2.0f * (float) Math.PI / teeth;
        gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
        gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
        gl.glVertex3f(r2 * (float)Math.cos(angle + 2.0f * da), r2 * (float)Math.sin(angle + 2.0f * da), width * 0.5f);
        gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
      }
    gl.glEnd();
    
    /* draw back face */
    gl.glBegin(GL.GL_QUAD_STRIP);
    for (i = 0; i <= teeth; i++)
      {
        angle = i * 2.0f * (float) Math.PI / teeth;
        gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
        gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
        gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
        gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
      }
    gl.glEnd();
    
    /* draw back sides of teeth */
    gl.glBegin(GL.GL_QUADS);
    for (i = 0; i < teeth; i++)
      {
        angle = i * 2.0f * (float) Math.PI / teeth;
        gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
        gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
        gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
        gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
      }
    gl.glEnd();
    
    /* draw outward faces of teeth */
    gl.glBegin(GL.GL_QUAD_STRIP);
    for (i = 0; i < teeth; i++)
      {
        angle = i * 2.0f * (float) Math.PI / teeth;
        gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
        gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
        u = r2 * (float)Math.cos(angle + da) - r1 * (float)Math.cos(angle);
        v = r2 * (float)Math.sin(angle + da) - r1 * (float)Math.sin(angle);
        len = (float)Math.sqrt(u * u + v * v);
        u /= len;
        v /= len;
        gl.glNormal3f(v, -u, 0.0f);
        gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
        gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
        gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
        gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), width * 0.5f);
        gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
        u = r1 * (float)Math.cos(angle + 3 * da) - r2 * (float)Math.cos(angle + 2 * da);
        v = r1 * (float)Math.sin(angle + 3 * da) - r2 * (float)Math.sin(angle + 2 * da);
        gl.glNormal3f(v, -u, 0.0f);
        gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), width * 0.5f);
        gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
        gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
      }
    gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), width * 0.5f);
    gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), -width * 0.5f);
    gl.glEnd();
    
    gl.glShadeModel(GL.GL_SMOOTH);
    
    /* draw inside radius cylinder */
    gl.glBegin(GL.GL_QUAD_STRIP);
    for (i = 0; i <= teeth; i++)
      {
        angle = i * 2.0f * (float) Math.PI / teeth;
        gl.glNormal3f(-(float)Math.cos(angle), -(float)Math.sin(angle), 0.0f);
        gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
        gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
      }
    gl.glEnd();
  }

  // Methods required for the implementation of MouseListener
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}

  public void mousePressed(MouseEvent e) {
    prevMouseX = e.getX();
    prevMouseY = e.getY();
    if ((e.getModifiers() & e.BUTTON3_MASK) != 0) {
      mouseRButtonDown = true;
    }
  }
    
  public void mouseReleased(MouseEvent e) {
    if ((e.getModifiers() & e.BUTTON3_MASK) != 0) {
      mouseRButtonDown = false;
    }
  }
    
  public void mouseClicked(MouseEvent e) {}
    
  // Methods required for the implementation of MouseMotionListener
  public void mouseDragged(MouseEvent e) {
    int x = e.getX();
    int y = e.getY();
    Dimension size = e.getComponent().getSize();

    float thetaY = 360.0f * ( (float)(x-prevMouseX)/(float)size.width);
    float thetaX = 360.0f * ( (float)(prevMouseY-y)/(float)size.height);
    
    prevMouseX = x;
    prevMouseY = y;

    view_rotx += thetaX;
    view_roty += thetaY;
  }
    
  public void mouseMoved(MouseEvent e) {}
}
```

Schaut dann so aus wie in Step 6.
Lassen wir das Beispiel laufen sollte es ausschauen wie in Step 7 
Viel Spaß mit Jogl 

Gruß Tom


----------



## stewag (22. Dezember 2006)

Hallo Thomas,

ich bin Deiner Anleitung gefolgt und es hat funktioniert. Nachdem ich es vorher ein paar Stunden erfolglos versucht habe freut es mich besonders ).
Also herzlichen Dank für Deine Mühe! Stefan


----------



## le_cheff (14. Juni 2007)

Ich kann mich der Aussage meines Vorgängers nur anschliessen.


----------



## mollitz (28. November 2007)

auch bei mir tuts, vielen dank
aber kannst du bitte noch verraten wie ich das global einbinde, so dass ich nicht bei jedem projekt die libs und natives einbinden muss und keine projekteinsteluungsänderungen vornehmen sondern bloss noch mit import die klassen einbinden muss. hab dazu mit  nichts gefunden!

danke,

moritz


----------



## JohnnyRep (18. Oktober 2008)

Ich stehe noch ganz am Anfang meiner Jogl Karriere und scheitere gerade an der Einrichtung eines funktionierenden Projekts. Ich habe alles so gemacht wie in Thomas Darimont's Anleitung beschrieben.

Folgender Code funktioniert auch:

```
package test;

import javax.media.opengl.*;

public class JoglTest {
  public static void main (String args[]) {
    try {
      System.loadLibrary("gluegen-rt");
      System.out.println("Hello World! (The native libraries are installed.)");
      GLCapabilities caps = new GLCapabilities();
      System.out.println("Hello JOGL! (The jar appears to be available.)");
    } catch (Exception e) {
      System.out.println(e);
    }
  }
}
```

Wenn ich allerdings das GEARS-Beispiel von oben laufen lassen möchte bekomme ich folgende Meldung:


> Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/gluegen/runtime/DynamicLookupHelper
> at java.lang.ClassLoader.defineClass1(Native Method)
> at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
> at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
> ...



Ich sprich es wird scheinbar eine Klasse aus der "gluegen-rt"-library vermisst... Beispielcode eins sagt mir doch aber das alles okay ist!

Wäre echt super, wenn mir jemand einen Tipp geben könnte. Entweder übersehe ich etwas oder es sind irgendwelche Versionen inkompatibel ?!

Ach so ich benutze Eclipse 3.2 und die neuste stable release von jogl....


----------

