OpenGL Object-Koordinaten ändern

  • Antworten:1
  • Bentwortet
Harry
  • Forum-Beiträge: 52

22.07.2011, 11:34:22 via Website

Hallo OpenGL-Spezialisten,

ich arbeite gerade an einer OpenGL-Anwendung, bei der ich Bilder im Kreis anordne, die nach vorne ausgerichtet sind.
Der Kreis ist 10° um die x-Achse geneigt. Der Kreis kann um die zentral gelegende y-Achse gedreht werden.

Der Code:
1// Neigung um -10° um die X-Achse
2 gl.glRotatef(KREIS_NEIGUNG, 1, 0, 0);
3 // Drehung abhängig von TouchEvent
4 gl.glRotatef(m_Modell.getRotation(), 0, 1, 0);
5
6 for (int i = 0; i < m_Modell.getAnzahlCovers() ; i++)
7 {
8 cover = m_Modell.getCover(i);
9 gl.glPushMatrix();
10
11 fX = cover.getX();
12 fY = 0;
13 fZ = cover.getZ();
14
15 // Cover gerade nach vorne ausrichten
16 // Cover zum Mittelpunkt verschieben
17 gl.glTranslatef(fX, fY, fZ);
18 // Cover um den Drehwinkel gegen die Rotation um die Y-Achse drehen
19 gl.glRotatef(-m_Modell.getRotation(), 0, 1, 0);
20 // Cover um -10° um die X-Achse neigen (Kompensierung der Kreis-Neigung)
21 gl.glRotatef(-KREIS_NEIGUNG, 1, 0, 0);
22 // Cover zurück an seine Position verschieben
23 gl.glTranslatef(-fX, -fY, -fZ);
24
25 // COVER ZEICHNEN
26 // Cover-Koordinaten laden
27 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_alCoverPunkte.get(i * 2));
28 // Cover-Farbe resetten
29 gl.glColor4f(0, 0, 0, 0);
30 // Textur binden
31 gl.glBindTexture(GL10.GL_TEXTURE_2D, cover.getClip().getCoverTexturId());
32 // Textur-Koordinaten laden
33 gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_fbTexturPunkte);
34 // zeichnen
35 gl.glDrawElements(GL10.GL_TRIANGLES, 2 * 3, GL10.GL_UNSIGNED_SHORT, m_sbIndices);
36
37 gl.glPopMatrix();
38 }


Problem:
Ich möchte nun alle Bilder zum vordersten Bild verschieben. Darum ändere ich die Koordinaten in den Cover objecten mit folgenden Formeln:
Xneu = Xalt + (Xziel - Xalt) * verschiebung; // verschiebung = der grad der verschiebung (0.0 (keine verschiebung) - 1.0 (ziel erreicht))
Y = 0; (ist immer 0)
Zneu = Zalt + (Zziel - Zalt) * verschiebung;

Dies funktioniert jedoch nur so halbwegs in einer Rotations-Position. In allen anderen Positionen fliegen die Bilder wild durch die Gegend.
Was mache ich falsch? Muss ich berücksichtigen, dass sich das OpenGL-Koordinatensystem mit verdreht und somit die Koordinaten eine ganz andere bedeutung haben?

Gruß Harry

— geändert am 26.07.2011, 08:43:30

Antworten
Harry
  • Forum-Beiträge: 52

03.08.2011, 10:24:15 via Website

Lösung:

Anstatt die Koordinaten im Objet zu ändern habe ich einfach in der Draw-Methode eine weitere Verschiebung hinzugefügt.

Bevor ich das Cover gerade nach vorne ausrichte, transferiere ich das Cover mit der oben angegebenen Formel.

1// -->NEU<--
2gl.glTranslatef((frontCover.getX() - fX) * fVerschiebung, 0, (frontCover.getZ() - fZ) * fVerschiebung);
3
4// Cover gerade nach vorne ausrichten
5// Cover zum Mittelpunkt verschieben
6gl.glTranslatef(fX, fY, fZ);
7// Cover um den Drehwinkel gegen die Rotation um die Y-Achse drehen
8gl.glRotatef(-m_Modell.getRotation(), 0, 1, 0);
9// Cover um -10° um die X-Achse neigen (Kompensierung der Kreis-Neigung)
10gl.glRotatef(-KREIS_NEIGUNG, 1, 0, 0);
11// Cover zurück an seine Position verschieben
12gl.glTranslatef(-fX, -fY, -fZ);

Dies muss als erstes geschehen, da OpenGL die Befehle in umgekehrter Reihenfolge ausführt.

Vielleicht hilft es dem einen oder anderen!
Gruß Harry

Antworten