# Bewegungen mit JOGL



## Aldimann (12. Jan 2010)

Hi  zusammen

bin grad irgendwie auf nen paar alte JOGL Sachen gestoßen und wollte mal wieder bissl was damit machen.

Momentan hab ich sowas wie nen Spielfeld mit ein paar Figuren, aber leider nicht mehr.

Kann mir jetzt jemand sagen, wie ich Bilder während der Laufzeit verändern kann? Also figuren umsetzen etc.

Oder halt nen Tutorial...

Vielen dank schonmal!


----------



## Evil-Devil (13. Jan 2010)

Genauso wie du ihre Position setzt. via glTranslate und den passenden neuen Positionsangaben. Oder direkt die passende Matrix manipulieren. Ich würde aber ersteres bevorzugen, dazu hat man schließlich die Funktion.


----------



## Aldimann (13. Jan 2010)

Muss ich dazu nicht die alte Position des Objektes löschen?

Hast du zufällig mal ein Codebeispiel, indem eine Figur oder so auf einen klick oder Tastendruck reagiert?


----------



## EgonOlsen (13. Jan 2010)

Aldimann hat gesagt.:


> Muss ich dazu nicht die alte Position des Objektes löschen?


Du solltest dir ganz allgemein vorher die Grundlagen von Transformationen in 3D losgelöst von Jogl oder OpenGL aneignen. Deine Frage weißt darauf hin, dass du das bisher nicht getan hast. Ohne das kommst du aber nicht weit.


----------



## Aldimann (13. Jan 2010)

Hätte evtl. auch im ersten Post erwähnen sollen:

Der Kenntnisstand auf dem kompletten Gebiet ist auf gut deutsch gleich null.

Java ist kein Thema, JOGL fällt mir ein wenig schwer aber mit ner menge Codebeispiele fusel ich mich schon zurrecht.

Und 3D Sachen noch nie was gemacht außer mal ein paar Maps mitm Editor gemodelt .

Also wo lese ich mich da am besten ein bzgl. 3D Transformationen?
Bevor ich jetzt das google anfange kann mir ja hier sicher einer einen Artikel empfehlen oder?


----------



## EgonOlsen (13. Jan 2010)

Ich hatte zu hause ein PDF, dass als Einsteig ganz nett ist. Ich gucke nachher mal, ob ich das noch finde...


----------



## Guest2 (13. Jan 2010)

Moin,

wie EgonOlsen schon schrieb, streng genommen hat "Bewegung" erstmal gar nichts mit JoGL zu tun. Soll heißen, JoGL bietet Dir auch keinerlei Hilfe bei der Erstellung einer "Bewegung".

Sprich, Du zeichnest mit JoGL eine Folge von voneinander unabhängigen Einzelbildern, wobei es an Dir liegt, die Veränderungen der Einzelbilder so vorzunehmen, das diese als Bewegung wahrgenommen werden.

Als quick and dirty (in JoGL1, da Du von "paar alte JOGL Sachen" schriebst):


```
package late.blub;

import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Point2D;

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;

import com.sun.opengl.util.Animator;


public class Move implements GLEventListener, KeyListener {

    private static final double  moveSpeed  = 0.1f;

    private final Point2D.Double position   = new Point2D.Double();
    private long                 lastUpdate = System.nanoTime();

    private GL                   gl;
    private GLU                  glu;


    @Override
    public void init(final GLAutoDrawable drawable) {

        gl = drawable.getGL();
        glu = new GLU();

    }


    private void updateWorld() {

        final double step = moveSpeed * -((lastUpdate - (lastUpdate = System.nanoTime())) / 10E7);

        synchronized (position) {

            if ((position.getX() - step) > -1)
                position.setLocation(position.getX() - step, position.getY());

        }

    }


    @Override
    public void display(final GLAutoDrawable drawable) {

        updateWorld();

        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();

        synchronized (position) {

            gl.glTranslated(position.getX(), position.getY(), -3.0f);

        }

        gl.glBegin(GL.GL_TRIANGLES);
        gl.glVertex3f(0.0f, 1.0f, 0.0f);
        gl.glVertex3f(-1.0f, -1.0f, 0.0f);
        gl.glVertex3f(1.0f, -1.0f, 0.0f);
        gl.glEnd();

    }


    @Override
    public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, int height) {

        if (height <= 0)
            height = 1;

        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(45.0f, (float) width / (float) height, 1.0, 1000.0);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();

    }


    @Override
    public void keyPressed(final KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_P) {

            synchronized (position) {

                position.setLocation(1.0, 0.0);

            }

        }

    }


    public static void main(final String[] args) {

        final Frame frame = new Frame();
        final GLCanvas canvas = new GLCanvas();
        final Animator animator = new Animator(canvas);
        final Move main = new Move();

        canvas.addGLEventListener(main);
        canvas.addKeyListener(main);

        frame.add(canvas);
        frame.setSize(900, 500);
        frame.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(final WindowEvent e) {

                new Thread(new Runnable() {
                    public void run() {

                        animator.stop();
                        System.exit(0);

                    }
                }).start();
            }
        });

        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        animator.start();

        canvas.requestFocusInWindow();
        
    }


    @Override public void displayChanged(final GLAutoDrawable drawable, final boolean modeChanged, final boolean deviceChanged) { }
    @Override public void keyReleased(final KeyEvent e) { }
    @Override public void keyTyped(final KeyEvent e) { }

}
```

Gruß,
Fancy


----------



## EgonOlsen (13. Jan 2010)

EgonOlsen hat gesagt.:


> Ich hatte zu hause ein PDF, dass als Einsteig ganz nett ist. Ich gucke nachher mal, ob ich das noch finde...


Hab's gefunden. Das ist relativ einfach gehalten und auf Schulniveau, aber ich finde, es fasst die wesentlichen Dinge für den Einstieg gut zusammen, ohne mit zu vielen Details zu verwirren.
Zu beachten bei all diesen Dingen ist, dass an den Schulen und Unis (zumindest im deutschsprachigen Raum) meist mit Zeilenmatrizen gearbeitet wird (wie z.B. Direct3D es auch macht), aber OpenGL mit Spaltenmatrizen arbeitet. Das kann zur Verwirrung führen, wenn man die Reihenfolge von Matrixmultiplikationen betrachtet. Die ändert sich nämlich dabei.

Download: http://www.jpct.net/download/misc/FBA.PDF


----------



## Aldimann (14. Jan 2010)

Vielen Dank ich für mir das ganze mal zu gemüte und dann schau ich weiter


----------



## Aldimann (19. Jan 2010)

So habe mir jetzt das PDF mit einigen Hilfestellungen etc. zu Teilen durchgearbeitet.

Zu Teilen bis jetzt deshalb nur weil Theorie ist zwar gut aber ohne Praxis leider nicht so hängen bleibt.

Deshalb jetzt die Frage wie bekomme ich es hin, dass ich Bilder an einander hänge etc.

In dem Quelltext von Guest2 sollte da ja schon einiges von drin stehen aber kann vielleich nochmal jemand die entscheidenden Code stellen aufzeigen oder nen Code mit Kommentaren?

Wäre sehr nett!


----------



## Aldimann (21. Jan 2010)

Keiner nen Quelltext dazu da?


----------



## Guest2 (21. Jan 2010)

Moin,



Aldimann hat gesagt.:


> Momentan hab ich sowas wie nen Spielfeld mit ein paar Figuren, aber leider nicht mehr.



Wie hast Du den Deine Figuren auf dem Spielfeld positioniert?

In meinem Beispiel oben ist der entsprechende Abschnitt einfach:


```
synchronized (position) { 

            gl.glTranslated(position.getX(), position.getY(), -3.0f);

}
```

Du musst lediglich die Position deiner Figuren für jedes Frame neu berechnen. Da steckt nix großes hinter. Im Beispiel oben wird einfach für jedes Frame das Dreieck um einen Zeitabhängigen Wert nach links verschoben.

Die Berechnung der neuen Position für das aktuelle Frame erfolgt hiermit:


```
final double step = moveSpeed * -((lastUpdate - (lastUpdate = System.nanoTime())) / 10E7);

synchronized (position) {

    if ((position.getX() - step) > -1)
        position.setLocation(position.getX() - step, position.getY());

}
```

Der Rest ist normaler JoGL Code.

Zeig doch mal den Code für dein Spielbrett mit Figuren als KSKB, dann kann man das ggf. einfacher zeigen.

Gruß,
Fancy


----------



## Aldimann (21. Jan 2010)

Danke!

Ich hab den Code ausm Tutorial hab damit bissl rumgespielt gehabt aber das hier bietet schon einen guten Ausgangspunkt find ich.

Btw. ist  net.java.games.jogl nicht noch ne alte Version? Hatte ich mal irgendwo gelesen.

Sind zwei Klassen die erste halt um das Fenster zu erzeugen.


```
import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import net.java.games.jogl.GLCanvas;
import net.java.games.jogl.GLCapabilities;
import net.java.games.jogl.GLDrawableFactory;


public class Beispielszene extends JFrame
{
    
    public Beispielszene(){
    	
    	GLCapabilities glcaps = new GLCapabilities();
    	GLCanvas canvas = GLDrawableFactory.getFactory().createGLCanvas(glcaps);
    	BeispielszeneView view = new BeispielszeneView();
    	canvas.addGLEventListener(view);
    	
    	setSize(500, 500);
    	setTitle("CAV-Projekt: JOGL - Beispielszene");
    	setResizable(false);
    	
    	getContentPane().add(canvas, BorderLayout.CENTER);
    	
    	addWindowListener(new WindowAdapter(){
    	
    		@Override
    		public void windowClosing(WindowEvent e) {
    			System.exit(0);
    			}
    	});
    	
    }
    
    public static void main(String[] args){
    	final Beispielszene app = new Beispielszene();
    	SwingUtilities.invokeLater(new Runnable(){

			@Override
			public void run() {
			
				app.setVisible(true);
			}
    		
    	});
    }
 }
```


```
import net.java.games.jogl.*;


public class BeispielszeneView implements GLEventListener
{

	@Override
	public void display(GLDrawable arg0) {

		GL gl = arg0.getGL();
		GLU glu = arg0.getGLU();
		
		gl.glClear(GL.GL_COLOR_BUFFER_BIT);
		
		gl.glLoadIdentity();
		
		glu.gluLookAt(0, 12, 15, 0, 0, 0, 0, 1, 0);
		
		gl.glTranslated(0, 1, 0);
		
		drawField(gl, glu);
		
		
		gl.glColor3f(1f, 0f, 0f);
		drawFigure(gl, glu, 1, 3);
		
		gl.glColor3f(1f, 1f, 0f);
		drawFigure(gl, glu, 0, 3);
		
		gl.glColor3f(0f, 0f, 1f);
		drawFigure(gl, glu, 1, 2);
		
		gl.glColor3f(1f, 0f, 1f);
		drawFigure(gl, glu, 0, 2);
	}

	private void drawFigure(GL gl, GLU glu, float x, float z) {
		gl.glPushMatrix();
		
		gl.glTranslated(x, 0, z);
		GLUquadric qobjc = glu.gluNewQuadric();
		
		glu.gluQuadricDrawStyle(qobjc, GLU.GLU_FILL);
		glu.gluQuadricNormals(qobjc, GLU.GLU_SMOOTH);
		glu.gluSphere(qobjc, 0.36f, 30, 30);
		
		gl.glRotated(90, 1, 0, 0);
		glu.gluQuadricDrawStyle(qobjc, GLU.GLU_FILL);
		glu.gluQuadricNormals(qobjc, GLU.GLU_SMOOTH);
		glu.gluCylinder(qobjc, 0.1, 0.4, 1.2, 30, 30);
		
		gl.glTranslated(0, 0, 1.2f);
		glu.gluQuadricDrawStyle(qobjc, GLU.GLU_FILL);
		glu.gluQuadricNormals(qobjc, GLU.GLU_SMOOTH);
		glu.gluCylinder(qobjc, 0.4, 0.4, 0.2, 30, 30);
		
		gl.glPopMatrix();
		
		
	}

	private void drawField(GL gl, GLU glu) {
		gl.glBegin(GL.GL_QUADS);
			gl.glVertex3f(-6.5f, -1.5f, -6.5f);
			gl.glVertex3f(-6.5f, -1.5f, 6.5f);
			gl.glVertex3f(6.5f, -1.5f, 6.5f);
			gl.glVertex3f(6.5f, -1.5f, -6.5f);
			
			gl.glEnd();
		
	}

	@Override
	public void displayChanged(GLDrawable arg0, boolean arg1, boolean arg2) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void init(GLDrawable arg0) {

		GL gl = arg0.getGL();
		GLU glu = arg0.getGLU();
		
		gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        setCamera(gl, glu);
        
        gl.glMatrixMode(GL.GL_MODELVIEW);
	}
	
	private void setCamera(GL gl, GLU glu){
		int w = 500, h = 500;
		
		gl.glViewport(0, 0, w, h);
		
		gl.glMatrixMode(GL.GL_PROJECTION);
		gl.glLoadIdentity();
		glu.gluPerspective(50.0, 1, 2.0, 40.0);
		
	}

	@Override
	public void reshape(GLDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
		// TODO Auto-generated method stub
		
	}

}
```


----------

