JOGL 2D Objekte drehen rotate

turbojunge

Mitglied
Hi,

ich verwende JOGL um ein 2D Spiel mit OpenGl zu programmieren.

Nun möchte ich ein einfaches 2D Dreieck um 45° drehen.
Sobald ich jedoch die rotate Methode verwende wird mir mein Dreieck nicht mehr angezeigt.

Ich verwende den Orthomode in OpenGl fpr die 2D Darstellung.

Mein Code sieht folgendermaßen aus:

Java:
        gl.glMatrixMode(GL.GL_PROJECTION);  // Select Projection
        gl.glPushMatrix();      // Push The Matrix
        gl.glLoadIdentity();      // Reset The Matrix
        gl.glOrtho(0, 624, 442, 0, -1, 1);  // Select Ortho Mode (640x480)
        gl.glMatrixMode(GL.GL_MODELVIEW);  // Select Modelview Matrix
        gl.glPushMatrix();      // Push The Matrix
        gl.glLoadIdentity(); 

                                gl.glRotated(75, 0, 0, 1);

				gl.glBegin(GL.GL_TRIANGLES);
				gl.glColor3f(galaxy.getFleets().get(i).getColor().getRed(), galaxy
						.getFleets().get(i).getColor().getGreen(), galaxy
						.getFleets().get(i).getColor().getBlue());
				gl.glVertex2d(galaxy.getFleets().get(i).getStartX(), galaxy
						.getFleets().get(i).getStartY());
				gl.glVertex2d(galaxy.getFleets().get(i).getStartX() - 5, galaxy
						.getFleets().get(i).getStartY() - 20);
				gl.glVertex2d(galaxy.getFleets().get(i).getStartX() - 20, galaxy
						.getFleets().get(i).getStartY() - 5);
				gl.glEnd();


Wo liegt denn hier mein Fehler ?

Vielen Dank schon mal für eute Tipps!!
 
Setze mal statt der 75 dort 1,2,3... ein und schau, was passiert. Vermtulich drehst du um den falschen Punkt

BTW:
Java:
                gl.glColor3f(galaxy.getFleets().get(i).getColor().getRed(), galaxy
                        .getFleets().get(i).getColor().getGreen(), galaxy
                        .getFleets().get(i).getColor().getBlue());
                gl.glVertex2d(galaxy.getFleets().get(i).getStartX(), galaxy
                        .getFleets().get(i).getStartY());
                gl.glVertex2d(galaxy.getFleets().get(i).getStartX() - 5, galaxy
                        .getFleets().get(i).getStartY() - 20);
                gl.glVertex2d(galaxy.getFleets().get(i).getStartX() - 20, galaxy
                        .getFleets().get(i).getStartY() - 5);
->
Java:
Fleet fleet = galaxy.getFleets().get(i);
+ 4 vieeel kürzere Zeilen
 
Danke für den tip, da habe ich wohl lieber mit Copy-paste gearbeitet statt mit einer neuen Refernez.

Leider haben auch die Werte 1,2,3... nichts gebracht.

Ich habe mittlerweile auch folgende Funktion zusätzlich verwendet:

Java:
gl.glTranslatef(galaxy.getFleets().get(i).getStartX(), galaxy.getFleets().get(i).getStartY(), 0);
gl.glRotated(15, 0, 0, 1);

Nun werden meine Dreiecke richtig gedreht, wenn ich sie jedoch danach Zeichne, werden sie nicht an ihre gewünschte Position gezeichnet sondern nach unten verschoben, ca. 50 Pixel.

BTW: Meine x,y Werte gebe ich auch in Pixeln an und nicht nicht im Bereich von -1,1

Habt ihr eine idee, warum meine Dreiecke nach der Rotation so verschoben gezeichnet werden ?
 
Hmja, wie gesagt: Du muss klar machen, um welchen Punkt gedreht werden soll. Stell' dir vor, es wird um einen Punkt gedreht, der weit außerhalb des sichtbaren Bereiches liegt: Dann bewirkt selbst eine Drehung von 1° schon eine riesige Bewegung des Schiffes. Um in bezug auf die Position (x,y) zu drehen (hier also getStartX()/getStartY()) braucht man üblicherweise eine Abfolge von
glTranslatef(x,y,0);
gl.glRotated(15, 0, 0, 1);
glTranslatef(-x,-y,0);

Das bewirkt bildlich gesprochen, dass die Flotte kurz in den Ursprung verschoben wird (um den man mit glRotate ja dreht), dann die Drehung durchgeführt wird, und man die Flotte dann wieder zurückverschiebt.
 
Danke für deine Antwort, genau darin lag mein Problem 🙂

Ich musste jedoch nachdem Zeichnen meiner Dreiecke noch die

Code:
glLoadIdentity()
Methode aufrufen, damit die Drehung sich nicht auf meiner weitern Objekte auswirkt.

Aber jetzt läuft alles, vielen Dank!
 

Zurück
Oben