# [LWJGL] Karusell, mehrere Objekte drehen sich um einen Mittelpunkt



## economix (5. Okt 2012)

Hallo an alle die sich die Mühe machen das zu lesen, natürlich auch Hallo an den Rest, aber der liest das ja nicht 

Ich beschäftige mich nun seit einigen Tagen mit der Lightweight Java Game Library und nachdem ich mich nun durch recht viele Tutorials gelesen und geklickt habe, glaube ich die grundsätze verstanden zu haben. Einige recht einfache Sachen funktionieren bereits und desshalb möchte ich mich nun an etwas schwierigeres herantrauen. Ich würde gerne eine Art Karusell aus mehreren "einfachen" Objekten (bisher dachte ich an Quadrate) "bauen". Das heißt die Quadrate drehen sich alle um einen gemeinsamen Mittelpunkt, doch leider habe ich keine Ahnung wie man so etwas programmiert. Zudem bräuchte ich eigentlich eine elliptische Bahn, denn die Quadrate die gerade "hinten" drehen sollten zu sehen sein (korrigiert mich bitte wenn ich hier falsch liege).

Ich arbeite mit Eclipse und der lwjgl-Version 2.8.4 auf Linux Ubuntu 12.04.

Mein bisheriges Quadrat sieht im Sourcecode so aus:

[JAVA=42]
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;

public class Quadrat {

    public void start() {
        try {
	    Display.setDisplayMode(new DisplayMode(1200,800));
	    Display.create();
	} catch (LWJGLException e) {
	    e.printStackTrace();
	    System.exit(0);
	}

	GL11.glMatrixMode(GL11.GL_PROJECTION);
	GL11.glLoadIdentity();
	GL11.glOrtho(0, 800, 0, 600, 1, -1);
	GL11.glMatrixMode(GL11.GL_MODELVIEW);

	while (!Display.isCloseRequested()) {
	       GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);	

	    // Farbe des Quadrats
	    GL11.glColor3f(0.0f,1.0f,0.0f);

	    // zeichne Quadrat
	    GL11.glBegin(GL11.GL_QUADS);
	        GL11.glVertex2f(50,50);
		GL11.glVertex2f(50+100,50);
		GL11.glVertex2f(50+100,50+100);
		GL11.glVertex2f(50,50+100);
	    GL11.glEnd();

	    Display.update();
	}

	Display.destroy();
    }

    public static void main(String[] argv) {
       Quadrat quadrat = new Quadrat();
       quadrat.start();
    }
}
[/code]

Ich weiß also nicht wie ich mehrere Objekte um einen Mittelpunkt kreisen lassen kann (evtl. elliptisch). Dabei bräuchte ich nun eure Hilfe.

Vielen Dank an alle die sich die Mühe machen das hier durchzulesen und einen noch größeren Dank an alle die auch antworten.

MfG
eco


----------



## BRoll (5. Okt 2012)

Versuchs doch mal mit Polarkoordinaten zu berechnen.
Unabhängig von LWJGL liegt ja bei dir eher das Problem, dass du nicht weißt
wie du die Rotation berechnen kannst. Und dafür eignen sich diese 
Herangehensweise.

Dh. ausgeschrieben berechnet man die Position einer Kreisbahn
mit einem vorgegebenen Winkel so:


```
int x=(int) (Math.cos(winkel)*radius);
int y=(int) (Math.sin(winkel)*radius);
```

Somit hast du die Position abhängig vom Winkel dargestellt,
und kannst nun schön immer den Winkel langsam erhöhen und
schon wird sich das Rechteck auf der Kreisbahn bewegt.

Damit es sich nicht um die linke obere Ecke des Bildschirms rotiert,
kannst du natürlich die Position zusätzlich verschieben,
zb. um   2*radius, dann würde die komplette Kreisbahn sichtbar angezeigt werden.
(Aber das ist ja logisch)

Wenn du jetzt zb. noch langsam den radius erhöhst wirst du sehen,
dass du eine Spirale erzeugt hast 

Um die Kreisbahn gut sichtbar zu machen kannst du ja ganz viele
Punkte darauf zeichnen lassen, zb. so:

```
for(int i=0; i<1000; i++)	
{
		    
		int x=(int) (Math.cos(w2-i)*r2);
		int y=(int) (Math.sin(w2-i)*r2);
   //Hier kannst du nun mit dem x und y und einer Verschiebung dein Rechteck,Kreis oder sonstwas zeichnen 
}
```
Damit wird die ganze Bahn schön sichtbar.

Ich hoffe ich konnte dir helfen


----------



## Marco13 (5. Okt 2012)

Eigentlich bietet LWJGL bzw. OpenGL in der verwendeten (und veralteten!) Version 1.1 schon die Methoden, die man dafür braucht. Die Quadrate müssen "scheinbar" immer nur in den Ursprung gezeichnet werden. Das ist dann "ihr" Ursprung, und WO genau der liegt, hängt von den vorher zusammenmultiplizierten Modelview-Matrizen ab. Es würde sich anbieten, sich ein paar Methoden oder ggf. sogar Klassen zu machen, die die "Objekte" (Quadrate) zeichnen oder repräsentieren. Im GROBEN Pseudocode müßte das zeichnen von n Kreisförmig angeordneten Objekten dann sowas sein wie

```
void drawObjects()
{
    for (int i=0; i<n; i++)
    {
        float angle = i * (360.0f / n);
        glPushMatrix();
        glRotateZ(angle);
        glTranslate(10,0,0);
        drawObject();
        glPopMatrix();
    }
}
```
Das ganze dann um die gemeinsame Achse rotieren zu lassen wäre schon mit

```
glPushMatrix();
        glRotateZ(currentAngle);
        drawObjects();
        glPopMatrix();
```
erledigt. (Jedenfalls kommt da nirgendwo ein "sin" oder "cos" drin vor  )


----------



## economix (7. Okt 2012)

Erstmal vielen Dank für die Antworten, es tut mir sehr leid, dass ich jetzt erst antworte, aber ich war das Wochenende über beschäftigt. 
Eure Tipps sehen vielversprechend aus, aber ich bin gerade zu geschafft um die jetzt auszuprobieren. Das mache ich dann morgen und werde mich danach wieder melden.
Danke nochmal an euch, die ihr geantwortet habt.

MfG
eco


----------



## economix (8. Okt 2012)

Sooo jetzt habe ich mal die Zeit gehabt mir eure Tipps in aller Ruhe durchzulesen und auszuprobieren.

BRoll Danke nochmal für die Antwort, aber ich denke, dass ich eher Marcos Variante benutzen werde, denn eigentlich hab eich gerade keine Lust auf sin(), bzw cos() 

So nun habe ich nochmal einige Fragen zu deinem Ansatz Marco:
Muss ich noch etwas zusätzlich importieren, denn ich habe eben mal zum Testen deine drawObjects Methode versucht laufen zu lassen und er gibt mir einige Dinge als undefined an.
Zweitens kommt es mir eher zweitrangig auf die Übersichtlichkeit an, und deswegen würde ich es bevorzugen mit nur einer Klasse zu arbeiten.
So wie ich dich verstanden habe, sollte ich zuerst meine "n" Objekte um den Ursprung zeichnen und sie dann alle zusammen drehen. Das heißt ich bräuchte eine Methode zeichne Objekte auf Kreisbahn, in der ich auf die Methode zeichne Objekte generell (also die die ich bereits im Anfangspost gepostet habe) zurückgreifen müsste, oder ? Dann zum Schluss noch drehen und gut ist.
Habe ich da jetzt was falsch bei verstanden?

Ach genau wenn ich schon dabei bin, wie genau mache ich es, dass sich das Karussel bei Klick auf die rechte Maustaste aufhört zu drehen?

Es sollte doch ungefähr so anfangen

```
if (Mouse.isButtonDown(0))
```
oder?

Danke jetzt schon an alle die antworten und sich dafür durch dieses Chaos gewühlt haben 

MfG
eco


----------



## Marco13 (8. Okt 2012)

Das war nur Pseudocode. Sowas wie
glRotateZ(angle);
wäre in echt eben
GL11.glRotate(angle, 0, 0, 1);

Man zeichnet die Objekte nicht in eine Kreisbahn. Man erstellt sich eine Methode
drawObject();
die das Objekt im Ursprung zeichnet - z.B. ein Einheitsquadrat von (0,0,0) bis (1,1,0)

WO dieses Quadrat dann tatsächlich erscheint, hängt davon ab, welche ModelView-Matrix gerade die aktuelle ist, wenn die Methode aufgerufen wird. Wenn man z.B. 

glPushMatrix();
glTranslatef(10,20,30);
drawObject();
glPopMatrix();

ausführt, wird das Quadrat von (10,20,30) bis (11,21,30) gezeichnet.


Mit der angedeuteten "drawObjects"-Methode würden "n" Objekte gezeichnet, die Kreisförmig angeordnet sind.


----------



## economix (8. Okt 2012)

das das nur Pseudocode war ist mir durchaus klar und ich habe das auch geändert beim Testen^^
Trotzdem trat/tritt bei mir bei glRotate ein Fehler auf und ich dachte, dass liegt vielleicht daran, dass ich irgendetwas notwendiges nicht importiert habe.

Danke für dieAufkärung, dass du meintest, dass man die Objekte in den Ursprung zeichnest.
Mein Problem ist wohl, dass ich doch noch nicht so weit bin wie ich dachte, denn aus irgendeinem Grund bekomme ich es nicht hin, dass zu "vercoden". Nehmen wir mal das Quadrat als Beispiel.
Ich schaffe es, das Teil in den Ursprung zu zeichnen, doch ich weiß nicht wie ich es darstellen soll, dass das Quadrat mehrmals auf einer Kreisbahn abgebildet wird. 
"welche ModelView-Matrix gerade die aktuelle ist" sagt mir irgendwie nichts.
Ich habe wohl einige OpenGL Tutorials ausgelassen weil ich möglichst schnell ein Erfolgserlebniss wollte.

MfG
eco


----------



## economix (8. Okt 2012)

So jetzt habe ich mal meinen Code entsprechend angepasst, so dass alles bis auf deine "drawObjects" Methode enthalten ist. Dementsprechend sollte er mir eigentlich mal ein Quadrat aufzeichnen und es dann verschieben , doch er will mir meine zweite Methode irgendwie nicht anerkennen, also die drawObject. Wahrscheinlich ist es ein echt lächerlicher Fehler, dementsprechend wäre es super wenn mich jemand darüber aufklären könnte.
Als n hab ich hier mal 1 eingesetzt.

Hier also mal der Code

[JAVA=1]import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;

public class Quadrat {

    public void start() {
        try {
	    Display.setDisplayMode(new DisplayMode(1200,800));
	    Display.create();
	} catch (LWJGLException e) {
	    e.printStackTrace();
	    System.exit(0);
	}

	GL11.glMatrixMode(GL11.GL_PROJECTION);
	GL11.glLoadIdentity();
	GL11.glOrtho(0, 800, 0, 600, 1, -1);
	GL11.glMatrixMode(GL11.GL_MODELVIEW);

	while (!Display.isCloseRequested()) {
	       GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);	

	  public void drawObject(){
	        GL11.glBegin(GL11.GL_QUADS);                      // Draw A Quad
	        GL11.glVertex3f(-1.0f, 1.0f, 0.0f);              // Top Left
	        GL11.glVertex3f( 1.0f, 1.0f, 0.0f);              // Top Right
	        GL11.glVertex3f( 1.0f,-1.0f, 0.0f);              // Bottom Right
	        GL11.glVertex3f(-1.0f,-1.0f, 0.0f);              // Bottom Left
	        GL11.glEnd();

	  }

	    for (int i=0; i<1; i++) //1 als n
	    {
	        float angle = i * (360.0f / 1); //1 als n
	        GL11.glPushMatrix();
	        GL11.glRotatef(angle,10,20,30) ;
	        GL11.glTranslatef(10,20,30);
	        //GL11.drawObject();

	        GL11.glPopMatrix();
	    }

	    Display.update();
	}


	Display.destroy();
    }

    public static void main(String[] argv) {
       Quadrat quadrat = new Quadrat();
       quadrat.start();
    }
}[/code]


----------



## Marco13 (8. Okt 2012)

Eigentlich war schon alles da...

```
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
 
public class Quadrat {
 
    public void start() 
    {
        try {
            Display.setDisplayMode(new DisplayMode(1200,800));
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
            System.exit(0);
        }

        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0, 800, 0, 600, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);

        while (!Display.isCloseRequested()) {
            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);   

            // Farbe des Quadrats
            GL11.glColor3f(0.0f,1.0f,0.0f);
            
            GL11.glPushMatrix();
            GL11.glTranslatef(400,300,0);
            drawObjects();
            GL11.glPopMatrix();
            

            Display.update();
        }

        Display.destroy();
    }
    
    void drawObjects()
    {
        int n = 10;
        for (int i=0; i<n; i++)
        {
            float angle = i * (360.0f / n);
            GL11.glPushMatrix();
            GL11.glRotatef(angle,0,0,1);
            GL11.glTranslatef(200,0,0);
            drawObject();
            GL11.glPopMatrix();
        }
    }    
    
    private void drawObject()
    {
        // zeichne Quadrat
        GL11.glBegin(GL11.GL_QUADS);
        GL11.glVertex2f(-50,-50);
        GL11.glVertex2f(50,-50);
        GL11.glVertex2f(50,50);
        GL11.glVertex2f(-50,50);
        GL11.glEnd();
    }
 
    public static void main(String[] argv) {
       Quadrat quadrat = new Quadrat();
       quadrat.start();
    }
}
```


----------



## economix (8. Okt 2012)

ääähh
jaaa
sagen wir ich war noch etwas verschlafen...
ja wie du sagst eigentlich war alles da....

Egal
Vielen, vielen Dank
Ich hätte dafür bestimmt ewig gebraucht, weil ich mich einfach zu dumm angestellt habe...
Nochmal Danke

MfG
eco


----------



## economix (8. Okt 2012)

Eine Frage hätte ich dann doch noch^^
Was müsste ich tun, damit die Quadrate nicht in verschieden Richtungen zeigen, sondern immer in der Ausgangslage stehen? Also ich will, dass die Seiten der Quadrate immer parallel sind. Wie komme ich dahin?
Danke an alle die darauf eine Antwort haben und sie mir auch mitteilen.

MfG
eco


----------



## BRoll (8. Okt 2012)

Naja mit "meiner" Methode, was im Prinzip nichts anderes
als eine einfache mathematische herangehensweise des Problems ist,
gehts ganz einfach.
Du musst einfach das Rechteck mit dem Mittelpunkt auf die Koordinate zeichnen.
Die Koordinate wird ja dann im Kreis bewegt mit der Cosinus und Sinus Funktion,
da ist ja keine Komponente usw die gedreht wird.
Und intern in der Berechnung der anderen Variante wird es natürlich auch auf
dieser Berechnungsweise basieren. 

Ist wirklich nicht schwer sich da was selber zu schreiben:

```
double winkel=0;
int radius=300;

void drehen()
{
winkel+=0.1;
int xpos=(int)(Math.cos(Math.toRadians(winkel))*r+200);
int ypos=(int)(Math.sin(Math.toRadians(winkel))*r+200);
//und jetzt einfach mit der Pos als Mittelpunkt zeichnen

}
```

mehr ists wirklich nicht


----------



## Marco13 (8. Okt 2012)

Man könnte auch einfach die Zeile
GL11.glRotatef(-angle,0,0,1);
direkt vor "drawObject" einfügen, aber es gibt viele Wege....


----------



## economix (9. Okt 2012)

Nun das war wirklich einfacher als gedacht 
Beide Methoden funktionieren einwandfrei, so gut, dass ich jetzt einfach 2 Versionen gemacht habe, einfach um mich daran zu erinnern wie wichtig sin und cos doch sind. Nocheinmal vielen Dank an euch beide. Alleine hätte ich wohl noch etwas länger auf dem Schlauch gestanden.

MfG 
eco


----------



## YumYum (9. Okt 2012)

Hey Leute,

ich habe diesen Thread gerade über die Googlesuche entdeckt und er passt sehr gut auf mein Problem.
Ich möchte gerne eine ähnliche Konstruktion wie der Threadersteller erstellen, doch bei mir sollen sich die Objekte in der Animation auch drehen. 
Ich will quasi die Klasse ausführen und die Dinger sollen sich direkt drehen. 
Dazu bräuchte ich doch eigentlich nur mit einem Rotate alles um die Z-Achse jagen oder nicht?
Doch wie bekomme ich diese Rotation dauerhaft oder auf Abruf (aka irgendeine Taste drücken und los gehts) hin?
Bei mir läuft das Ganze mit eingebunden Texturen ab, aber das sollte ja eigentlich keinen Unterschied machen. 

Ich fände es super nett wenn sich jemand finden würde, der mir hilft. Dummerweise komme ich erstmal nicht an meinen ursprünglichen Code, aber theoretisch müsste ich es auch einem Beispiel verstehen können. Evtl. teste ich es auch einfach am Code des Threaderstellers, wenn der nix dagegen hat.


----------



## Marco13 (9. Okt 2012)

Langsam klingt das ziemlich hausaufgabig. Du hast es geschafft, texturierte Objekte mit LWJGL anzuzeigen, aber schaffst es nicht, irgendwo einen Winkel hochzuzählen und glRotate(winkel,0,0,1) aufzurufen? ???:L


----------



## YumYum (9. Okt 2012)

Marco13 hat gesagt.:


> Langsam klingt das ziemlich hausaufgabig. Du hast es geschafft, texturierte Objekte mit LWJGL anzuzeigen, aber schaffst es nicht, irgendwo einen Winkel hochzuzählen und glRotate(winkel,0,0,1) aufzurufen? ???:L



Nun ich kann dir als Beruhigung sage, aus dem Hausaufgabenalter bin ich seit ungefähr 25 Jahren raus . Mein Problem ist ja auch nicht das vom Fragesteller, sondern vielmehr, dass ich nicht weiß wie ich in opengl eine dauerhafte Rotation einbaue. Ich habe mal versucht mir ein Casino zusammenzuprogrammieren und bin habe nun 3 "Rollen" die mit verschiedenen Texturen versehen sind.
Nun will ich dieses 3 Rollen rotieren lassen, bis sie auf Mausklick anhalten. Das war vor gut und gerne 5 Jahren. Jetzt bin ich mit meiner Familie im Urlaub und mein Jüngster ist krank und einer muss bei ihm bleiben. Da er die meiste Zeit schläft, ahbe ich mir gedacht ich könnte doch meine alten Projekte aufleben lassen. Pustekuchen... die Teile sind zum großen Teil nicht auf meinem Notebook. Bis zu den Rollen habe ich es jetzt -auch dank diesem Thread- geschafft. Doch die wollen und wollen sich nicht drehen. Mit Rotate drehen die sich halt schon, aber sie sind dann immer schon gedreht wenn ich play drücke. Das ist mein Problem. Sollte das nun die Grenzen dieses Threads sprengen tut es mir Leid und ich mache meinen eigenen auf. Ich dachte mir nun, da hier ein ähnliches Thema besprochen wurde, wäre es treffend hier zu posten.

PS.
Welche Schule unterrichtet denn OpenGl? Zu meiner Zeit gabs sowas noch nicht. Nur trockene Theorie.


----------



## Marco13 (9. Okt 2012)

Hätte eine Uni/FH-Hausaufgabe sein können.

Thematisch könnte es schon etwas von der ursprünglichen Frage abweichen. Falls ich das richtig verstanden habe, geht es jetzt NUR um die Start/Stop-Funktionalität für die Rotation?


----------



## YumYum (9. Okt 2012)

Da hast du schon Recht, es weicht da wirklich etwas ab, auf der anderen Seite ist es nur eine kurze Frage und ich fand es unnötig dafür einen eigenen Thread aufzumachen. 
Ja. Mein Ziel ist es eine Rotation auf Abruf zu starten, bzw. eigentlich sollte es so sein, dass es direkt von Anfang an rotiert und dann wenn ich die Eingabe vornehme anhält, wobei es ja nicht schlimm wäre wenn man die Rotation erst noch starten müsste.
Ich weiß nicht wie ich das implementieren kann, bzw. welche Befehle ich dazu benötige.


----------



## YumYum (9. Okt 2012)

Stop, alles zurück.
Ich habe es geschafft.
Entschuldigung für die unnötigen Posts, vielleicht kann ein Admin die löschen, so dass der Thread wieder nur das enthält was auch draufsteht.
Danke an Marco13, dass er sich die Zeit genommen hat


----------



## economix (10. Okt 2012)

Einen wunderschönen guten Morgen wünsche ich euch allen.
Nachdem ihr mir so toll dabei geholfen habt, meine Quadrate in einem Kreis anzuordnen, habe ich den Code jetzt noch etwas verfeinert und die Quadrate durch Texturen ersetzt. Jetzt komme ich zum letzten Schritt meines Karussels und brauche dann doch wieder Hilfe. Ich möchte die Kameraposition verändern. Momentan sieht man den Kreis mit den Objekten von oben, doch ich hätte gerne, dass die Kamera von vorne so darauf schaut, dass die Objekte die auf dem hinteren Teil der Kreisbahn verlaufen noch zu sehen sind, wenn auch kleiner. Ich hoffe ihr versteht was ich euch damit sagen will. Ich schaue von vorne auf ein Karussel und sehe dabei auf dem vorderen Teil der Kreisbahn Objekte und auch auf dem hinteren. Dadurch verzieht sich die Kreisbahn die man sieht eher zu einer Ellipse. Ich habe das Problem gegoogelt und dabei den Befehl glulookat gefunden, bei dem man die Position der Kamera, das Ziel der Kamera und noch etwas angeben muss, doch das ist eigentlich ja mehr als ich benötige. Ich will eigentlich einfach nur meine Kamera bewegen, während das Kameraziel gleichbleibt. 

Also hat jemand eine Idee wie man einfach nur die Kameraposition um einen bestimmten Winkel verändert oder mein Problem auf eine andere Weise lösen kann? Bei meiner Googlesuche war ich da mehr oder weniger ohne Erfolg.

Hier mal noch mein bisheriger Code, falls euch das hilft zu verstehen von was ich rede.

[JAVA=1]import java.io.IOException;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;

public class TextureKarussel {

	private Texture texture;

    long startzeit  = System.nanoTime();
    double T = 20000;

	public void start() {
		initGL(1200,800);
		init();

		while (true) {
			GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
//			render(700, 300);

        	double deltatime = System.nanoTime() - startzeit;
        	deltatime = deltatime /1e6; //ms
        	double w = 360/T;
        	double phi = w*deltatime;  //Winkel

			GL11.glPushMatrix();
        	drawObjects(phi);
        	GL11.glPopMatrix();
        	Display.update();

			//System.exit(0);



			Display.sync(100);

			if (Display.isCloseRequested()) {
				Display.destroy();

			}
		}
	}


	private void initGL(int width, int height) {
		try {
			Display.setDisplayMode(new DisplayMode(width,height));
			Display.create();
			Display.setVSyncEnabled(true);
		} catch (LWJGLException e) {
			e.printStackTrace();
			System.exit(0);
		}

		GL11.glEnable(GL11.GL_TEXTURE_2D);               

		GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);          

        	// enable alpha blending
        	GL11.glEnable(GL11.GL_BLEND);
        	GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

        	GL11.glViewport(0,0,width,height);
		GL11.glMatrixMode(GL11.GL_MODELVIEW);

		GL11.glMatrixMode(GL11.GL_PROJECTION);
		GL11.glLoadIdentity();
		GL11.glOrtho(0, width, height, 0, 1, -1);
		GL11.glMatrixMode(GL11.GL_MODELVIEW);
	}

	/**
	 * Initialise resources
	 */
	public void init() {

		try {
			// load texture from PNG file
			texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("/home/lukas/Arbeitsfläche/64x64.png"));

			System.out.println("Texture loaded: "+texture);
			System.out.println(">> Image width: "+texture.getImageWidth());
			System.out.println(">> Image height: "+texture.getImageHeight());
			System.out.println(">> Texture width: "+texture.getTextureWidth());
			System.out.println(">> Texture height: "+texture.getTextureHeight());
			System.out.println(">> Texture ID: "+texture.getTextureID());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * draw a quad with the image on it
	 */
	public void render(float xoffs, float yoffs ) {
		Color.white.bind();
		texture.bind(); // or GL11.glBind(texture.getTextureID());

			GL11.glBegin(GL11.GL_QUADS);
			GL11.glTexCoord2f(0,0);
			GL11.glVertex2f(xoffs,yoffs);
			GL11.glTexCoord2f(1,0);
			GL11.glVertex2f(xoffs+texture.getTextureWidth(),yoffs);
			GL11.glTexCoord2f(1,1);
			GL11.glVertex2f(xoffs+texture.getTextureWidth(),yoffs+texture.getTextureHeight());
			GL11.glTexCoord2f(0,1);
			GL11.glVertex2f(xoffs,yoffs+texture.getTextureHeight());

			GL11.glEnd();
	}



	   void drawObjects(double offs)
	    {
	        double n = 8;
	        for (double i=0; i<n; i++)
	        {
	        	double angle = offs + i * (360.0f / n);
	            GL11.glPushMatrix();
	            GL11.glRotated(angle,0,0,1);
	            GL11.glTranslated(200,0,0);
	            GL11.glRotated(-angle,0,0,1);
	            render(700, 300);
	            GL11.glPopMatrix();

	        }
	    }    

	/**
	 * Main Class
	 */
	public static void main(String[] argv) {
		TextureKarussel textureKarussel = new TextureKarussel();
		textureKarussel.start();
	}
}[/code]

Vielen Dank für eventuelle Antworten.

MfG
eco


----------



## Marco13 (10. Okt 2012)

Du musst noch den Projection-Matrix-Teil
GL11.glLoadIdentity();
GL11.glOrtho(0, width, height, 0, 1, -1);
zu glFrustum ? DGL Wiki ändern. 

Ansonsten war gluLookAt schon richtig. Ansonsten müßte man sich seine "Kamera-Matrix" selbst zusammenfrickeln, was eklig sein kann.


----------



## economix (10. Okt 2012)

Vielen Dank.
Habe deinen Vorschlag mal übernommen.
Meintest du so?
Ich frage so dumm, weil ich GLUT noch nicht in mein Eclipse gepackt habe und es deswegen noch nicht testen kann 
[JAVA=1]import java.io.IOException;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;

public class TextureKarussel {

	private Texture texture;

    long startzeit  = System.nanoTime();
    double T = 20000;

	public void start() {
		initGL(1200,800);
		init();

		while (true) {
			GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
//			render(700, 300);

        	double deltatime = System.nanoTime() - startzeit;
        	deltatime = deltatime /1e6; //ms
        	double w = 360/T;
        	double phi = w*deltatime;  //Winkel

			GL11.glPushMatrix();
        	drawObjects(phi);
        	GL11.glPopMatrix();
        	Display.update();

			//System.exit(0);



			Display.sync(100);

			if (Display.isCloseRequested()) {
				Display.destroy();

			}
		}
	}


	private void initGL(int width, int height) {
		try {
			Display.setDisplayMode(new DisplayMode(width,height));
			Display.create();
			Display.setVSyncEnabled(true);
		} catch (LWJGLException e) {
			e.printStackTrace();
			System.exit(0);
		}

		GL11.glEnable(GL11.GL_TEXTURE_2D);               

		GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		GL11.glLoadIdentity();
		GL11.gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

        	// enable alpha blending
        	GL11.glEnable(GL11.GL_BLEND);
        	GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

        	GL11.glViewport(0,0,width,height);
		GL11.glMatrixMode(GL11.GL_MODELVIEW);

		GL11.glMatrixMode(GL11.GL_PROJECTION);
		//GL11.glLoadIdentity();
		//GL11.glOrtho(0, width, height, 0, 1, -1);
		GL11.glFrustum(-100, 100, -100, 100, 50, 150);
		GL11.glMatrixMode(GL11.GL_MODELVIEW);
	}

	/**
	 * Initialise resources
	 */
	public void init() {

		try {
			// load texture from PNG file
			texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("/home/lukas/Arbeitsfläche/64x64.png"));

			System.out.println("Texture loaded: "+texture);
			System.out.println(">> Image width: "+texture.getImageWidth());
			System.out.println(">> Image height: "+texture.getImageHeight());
			System.out.println(">> Texture width: "+texture.getTextureWidth());
			System.out.println(">> Texture height: "+texture.getTextureHeight());
			System.out.println(">> Texture ID: "+texture.getTextureID());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * draw a quad with the image on it
	 */
	public void render(float xoffs, float yoffs ) {
		Color.white.bind();
		texture.bind(); // or GL11.glBind(texture.getTextureID());

			GL11.glBegin(GL11.GL_QUADS);
			GL11.glTexCoord2f(0,0);
			GL11.glVertex2f(xoffs,yoffs);
			GL11.glTexCoord2f(1,0);
			GL11.glVertex2f(xoffs+texture.getTextureWidth(),yoffs);
			GL11.glTexCoord2f(1,1);
			GL11.glVertex2f(xoffs+texture.getTextureWidth(),yoffs+texture.getTextureHeight());
			GL11.glTexCoord2f(0,1);
			GL11.glVertex2f(xoffs,yoffs+texture.getTextureHeight());

			GL11.glEnd();
	}



	   void drawObjects(double offs)
	    {
	        double n = 8;
	        for (double i=0; i<n; i++)
	        {
	        	double angle = offs + i * (360.0f / n);
	            GL11.glPushMatrix();
	            GL11.glRotated(angle,0,0,1);
	            GL11.glTranslated(200,0,0);
	            GL11.glRotated(-angle,0,0,1);
	            render(700, 300);
	            GL11.glPopMatrix();

	        }
	    }    

	/**
	 * Main Class
	 */
	public static void main(String[] argv) {
		TextureKarussel textureKarussel = new TextureKarussel();
		textureKarussel.start();
	}
}[/code]


----------



## economix (10. Okt 2012)

Oh mann ich bin hier total am verzweifeln, was zur Hölle muss ich denn machen, damit er mir den Befehl gluLookAt anerkennt?
Muss ich was importieren oder noch ne library dazupacken, die ich allerdings nicht finde, nzw, wenn ich welche finde, dann sind keine jars drin die dazufügen könnte.

Helft mir, bitte 

MfG
eco


----------



## Marco13 (10. Okt 2012)

import org.lwjgl.util.glu.GLU;
Und dann GLU.guLookAt... Ggf. noch die "Utilities JAR" von LWJGL hinzufügen.


----------



## economix (10. Okt 2012)

Ahh Danke!!!
Vielen vielen Dank.

Jetzt habe ich die Error Meldung raus, doch meine Ausgabe bleibt weiterhin leer.
Ich vermute das liegt am Frustrum. Es kann ja eigentlich nur am Frustrum oder am LookAt liegen, aber ich bin mir nicht so sicher. Hab ich alles in der richtigen Reihenfolge in meinem Code?

[JAVA=1]import java.io.IOException;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;

public class TextureKarussel {

	private Texture texture;

    long startzeit  = System.nanoTime();
    double T = 20000;

	public void start() {
		initGL(1200,800);
		init();

		while (true) {
			GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
//			render(700, 300);

        	double deltatime = System.nanoTime() - startzeit;
        	deltatime = deltatime /1e6; //ms
        	double w = 360/T;
        	double phi = w*deltatime;  //Winkel

			GL11.glPushMatrix();
        	drawObjects(phi);
        	GL11.glPopMatrix();
        	Display.update();

			//System.exit(0);



			Display.sync(100);

			if (Display.isCloseRequested()) {
				Display.destroy();

			}
		}
	}


	private void initGL(int width, int height) {
		try {
			Display.setDisplayMode(new DisplayMode(width,height));
			Display.create();
			Display.setVSyncEnabled(true);
		} catch (LWJGLException e) {
			e.printStackTrace();
			System.exit(0);
		}

		GL11.glEnable(GL11.GL_TEXTURE_2D);               

		GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

		GL11.glLoadIdentity();
		GLU.gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);

        	// enable alpha blending
        	GL11.glEnable(GL11.GL_BLEND);
        	GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

        	GL11.glViewport(0,0,width,height);
		GL11.glMatrixMode(GL11.GL_MODELVIEW);

		GL11.glMatrixMode(GL11.GL_PROJECTION);
		GL11.glLoadIdentity();
		//GL11.glOrtho(0, width, height, 0, 1, -1);
		GL11.glFrustum(0, width, 0, height, 150, 300);
		GL11.glMatrixMode(GL11.GL_MODELVIEW);
	}

	/**
	 * Initialise resources
	 */
	public void init() {

		try {
			// load texture from PNG file
			texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("/home/lukas/Arbeitsfläche/64x64.png"));

			System.out.println("Texture loaded: "+texture);
			System.out.println(">> Image width: "+texture.getImageWidth());
			System.out.println(">> Image height: "+texture.getImageHeight());
			System.out.println(">> Texture width: "+texture.getTextureWidth());
			System.out.println(">> Texture height: "+texture.getTextureHeight());
			System.out.println(">> Texture ID: "+texture.getTextureID());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * draw a quad with the image on it
	 */
	public void render(float xoffs, float yoffs ) {
		Color.white.bind();
		texture.bind(); // or GL11.glBind(texture.getTextureID());

			GL11.glBegin(GL11.GL_QUADS);
			GL11.glTexCoord2f(0,0);
			GL11.glVertex2f(xoffs,yoffs);
			GL11.glTexCoord2f(1,0);
			GL11.glVertex2f(xoffs+texture.getTextureWidth(),yoffs);
			GL11.glTexCoord2f(1,1);
			GL11.glVertex2f(xoffs+texture.getTextureWidth(),yoffs+texture.getTextureHeight());
			GL11.glTexCoord2f(0,1);
			GL11.glVertex2f(xoffs,yoffs+texture.getTextureHeight());

			GL11.glEnd();
	}



	   void drawObjects(double offs)
	    {
	        double n = 8;
	        for (double i=0; i<n; i++)
	        {
	        	double angle = offs + i * (360.0f / n);
	            GL11.glPushMatrix();
	            GL11.glRotated(angle,0,0,1);
	            GL11.glTranslated(200,0,0);
	            GL11.glRotated(-angle,0,0,1);
	            render(700, 300);
	            GL11.glPopMatrix();

	        }
	    }    

	/**
	 * Main Class
	 */
	public static void main(String[] argv) {
		TextureKarussel textureKarussel = new TextureKarussel();
		textureKarussel.start();
	}
}[/code]

Vermutungen, Lösungen oder Lösungsansätze?
Immer her damit!

Danke nochmal und schonmal!

MfG 
eco


----------



## Marco13 (10. Okt 2012)

Ja, da wird halt irgendwas irgendwo ins Nirvana gerendert, diese Offsets und die Frage, welches Koordinatensystem verwendet wird ist nicht ganz klar, wie auch immer...

```
package _test;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;
 
public class TextureKarussel {
 
    //private Texture texture;
    
    long startzeit  = System.nanoTime();
    double T = 20000;
    
    public void start() {
        initGL(1200,800);
        init();
        
        while (true) {
            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
//          render(700, 300);
            
            double deltatime = System.nanoTime() - startzeit;
            deltatime = deltatime /1e6; //ms
            double w = 360/T;
            double phi = w*deltatime;  //Winkel
            
            GL11.glPushMatrix();
            drawObjects(phi);
            GL11.glPopMatrix();
            Display.update();
            
            //System.exit(0);
 
            
            
            Display.sync(100);
 
            if (Display.isCloseRequested()) {
                Display.destroy();
 
            }
        }
    }
    
 
    private void initGL(int width, int height) {
        try {
            Display.setDisplayMode(new DisplayMode(width,height));
            Display.create();
            Display.setVSyncEnabled(true);
        } catch (LWJGLException e) {
            e.printStackTrace();
            System.exit(0);
        }
 
        GL11.glEnable(GL11.GL_TEXTURE_2D);               
        GL11.glViewport(0,0,width,height);
        GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        GL11.glLoadIdentity();
        GLU.gluLookAt(0, -100, -150, 0, 0, 0, 0, 1, 0);
        
        // enable alpha blending
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
            
 
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GLU.gluPerspective(45.0f, (float)width/height, 0.1f, 1000.0f);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
    }
    
    /**
     * Initialise resources
     */
    public void init() {
        
//        try {
//            // load texture from PNG file
//            texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("/home/lukas/Arbeitsfläche/64x64.png"));
//        
//            System.out.println("Texture loaded: "+texture);
//            System.out.println(">> Image width: "+texture.getImageWidth());
//            System.out.println(">> Image height: "+texture.getImageHeight());
//            System.out.println(">> Texture width: "+texture.getTextureWidth());
//            System.out.println(">> Texture height: "+texture.getTextureHeight());
//            System.out.println(">> Texture ID: "+texture.getTextureID());
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
    }
 
    /**
     * draw a quad with the image on it
     */
    public void render(float xoffs, float yoffs ) {
        //Color.white.bind();
        //texture.bind(); // or GL11.glBind(texture.getTextureID());
            
            GL11.glBegin(GL11.GL_QUADS);
            GL11.glTexCoord2f(0,0);
            GL11.glVertex2f(xoffs,yoffs);
            GL11.glTexCoord2f(10,0);
            GL11.glVertex2f(xoffs+10,yoffs);
            GL11.glTexCoord2f(1,1);
            GL11.glVertex2f(xoffs+10,yoffs+10);
            GL11.glTexCoord2f(0,1);
            GL11.glVertex2f(xoffs,yoffs+10);
            
            GL11.glEnd();
    }
    
    
    
       void drawObjects(double offs)
        {
            double n = 8;
            for (double i=0; i<n; i++)
            {
                double angle = offs + i * (360.0f / n);
                GL11.glPushMatrix();
                GL11.glRotated(angle,0,0,1);
                GL11.glTranslated(50,0,0);
                GL11.glRotated(-angle,0,0,1);
                render(-5,-5);
                GL11.glPopMatrix();
               
            }
        }    
        
    /**
     * Main Class
     */
    public static void main(String[] argv) {
        TextureKarussel textureKarussel = new TextureKarussel();
        textureKarussel.start();
    }
}
```


----------



## economix (10. Okt 2012)

Nach mehreren Kopf-Wand und Kopf-Tisch Duellen, komme ich nun dazu dir zu danken.
Danke
Wieder einmal
Vielen Dank
Würdest du mir nicht antworten, dann wäre mein Pc wohl nicht mehr am Leben.
Danke!


----------



## economix (11. Okt 2012)

An was könnte es liegen, dass das eingebundenen Bild auf einer Hälfte verzerrt wirkt.







Aber es sollte eigentlich so wirken






Code


```
import java.io.IOException;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;
 
public class TextureKarussel2 {
 
    public Texture texture;
    
    long startzeit  = System.nanoTime();
    double T = 20000;
    
    public void start() {
        initGL(1200,800);
        init();
        
        while (true) {
            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
//          render(700, 300);
            
            double deltatime = System.nanoTime() - startzeit;
            deltatime = deltatime /1e6; //ms
            double w = 360/T;
            double phi = w*deltatime;  //Winkel
            
            GL11.glPushMatrix();
            drawObjects(phi);
            GL11.glPopMatrix();
            Display.update();
            
            //System.exit(0);
 
            
            
            Display.sync(100);
 
            if (Display.isCloseRequested()) {
                Display.destroy();
 
            }
        }
    }
    
 
    private void initGL(int width, int height) {
        try {
            Display.setDisplayMode(new DisplayMode(width,height));
            Display.create();
            Display.setVSyncEnabled(true);
        } catch (LWJGLException e) {
            e.printStackTrace();
            System.exit(0);
        }
 
        GL11.glEnable(GL11.GL_TEXTURE_2D);               
        GL11.glViewport(0,0,width,height);
        GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        GL11.glLoadIdentity();
        GLU.gluLookAt(0, -100, -150, 0, 0, 0, 0, 1, 0);
        
        // enable alpha blending
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
            
 
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GLU.gluPerspective(45.0f, (float)width/height, 0.5f, 1000.0f);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
    }
    
    /**
     * Initialise resources
     */
    public void init() {		try {
		// load texture from PNG file
		texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("/home/lukas/Arbeitsfläche/128x128.png"));
	
		System.out.println("Texture loaded: "+texture);
		System.out.println(">> Image width: "+texture.getImageWidth());
		System.out.println(">> Image height: "+texture.getImageHeight());
		System.out.println(">> Texture width: "+texture.getTextureWidth());
		System.out.println(">> Texture height: "+texture.getTextureHeight());
		System.out.println(">> Texture ID: "+texture.getTextureID());
	} catch (IOException e) {
		e.printStackTrace();
	}
}
 
    /**
     * draw a quad with the image on it
     */
    public void render(float xoffs, float yoffs ) {
        Color.white.bind();
        texture.bind(); // or GL11.glBind(texture.getTextureID());
            
            GL11.glBegin(GL11.GL_QUADS);
            GL11.glTexCoord3f(0,0,0);
            GL11.glVertex3f(xoffs,yoffs,0);
            GL11.glTexCoord3f(10,0,0);
            GL11.glVertex3f(xoffs+10,yoffs,0);
            GL11.glTexCoord3f(1,1,0);
            GL11.glVertex3f(xoffs+10,yoffs+10,0);
            GL11.glTexCoord3f(0,1,0);
            GL11.glVertex3f(xoffs,yoffs+10,0);
            
            GL11.glEnd();
    }
    
    
    
       void drawObjects(double offs)
        {
            double n = 30;
            for (double i=0; i<n; i++)
            {
                double angle = offs + i * (360.0f / n);
                GL11.glPushMatrix();
               GL11.glRotated(angle,0,0,1);
                GL11.glTranslated(50,0,0);
                GL11.glRotated(-angle,0,0,1);
                render(-5,-5);
                GL11.glPopMatrix();
               
            }
        }    
        
    /**
     * Main Class
     */
    public static void main(String[] argv) {
        TextureKarussel2 textureKarussel2 = new TextureKarussel2();
        textureKarussel2.start();
    }
}
```

Habe jetzt mehrfach versucht andere Bildgörßen zu nehemn, bzw andere Parameter einzusetzen. Hilft alles nicht. Ist das einfach nicht zu verhindern, wenn man die Kamera bei gemappten Texturen dreht, oder ist es zu beheben und wenn ja wie?


----------



## Guest2 (11. Okt 2012)

Moin,

ohne alles gelesen zu haben, würde ich auf Zeile 107 tippen.

Viele Grüße,
Fancy


----------



## Marco13 (11. Okt 2012)

Nein Texturen in OpenGL werden grundsätzlich nur richtig dargestellt, wenn man mit der Kamera genau von vorne draufguckt. 

:joke:


GL11.glTexCoord3f(10,0,0); sollte vermutlich
GL11.glTexCoord3f(1,0,0); sein


EDIT: Grml...


----------



## economix (11. Okt 2012)

die 0 wars...
einfach mal einen ganzen Tag lang nichts anderes gemacht, als im netz nach gründen zu suchen und dann war einfach eine null zu viel...
Ich liebe es.

Danke euch beiden


----------

