Umgekehrte Reihenfolge der Transformationen bei GLES1 und GLES2

usrr

Bekanntes Mitglied
Ich habe eine Anwendung die sowohl mit GLES1 und GLES2 rendern kann. Die entsprechenden Befehle wurden jeweils doppelt implementiert. Allerdings gibt es einen kleinen Unterschied, den ich mir nicht erklären kann:

GLES1:

Java:
gl.glTranslatef(...);
gl.glRotatef(...);
gl.glScalef(...);
gl.glTranslatef(...);

GLES2:

Java:
Matrix.translateM(projMatrix, ...);
Matrix.scaleM(...);
Matrix.rotateM(...);
Matrix.translateM(...);

Kann mir jemand sagen warum die Transformation in umgekehrter Reihnfolge notwenidig sind?


EDIT:

Evtl. liegt es an der Sichtweise. Bei GLES wird die Ansicht auf das Object transformiert, bei GLES2 aber das Object in den Sichtbereich.
 

Marco13

Top Contributor
Ich kenne die 'Matrix'-Klasse nicht (bzw. weiß nicht, wie die Methoden dort definiert sind). Vielleicht hängt es auch davon ab, ob du die GL_PROJECTION oder die GL_MODELVIEW Matrix veränderst (falls ich das richtig verstanden habe (und wenn ich nicht gerade an Koffeinmangel leide) KÖNNTE das den beobachteten Effekt erklären).

Jedenfalls muss man bedenken, dass bei normalen MODELVIEW-Operationen die Reihenfolge der "Ausführung" (bzw. Anwendung) der Operationen genau umgekehrt zu der ist, die im Quellcode steht, weil die Matrizen von rechts an die bestehende Matrix dranmultipliziert werden:
Java:
// Sieht aus wie "Erst rotieren, dann verschieben"
glRotate(...)
glTranslate(...)

// Ist aber
aktuelleMatrix = identity
aktuelleMatrix *= rotation;
aktuelleMatrix *= translation;

// Die Anwendung auf die Vertices ist damit
neuerVertex = rotation * translation * alterVertex
                 ^             ^
                 |             | Der Vertex wird erst transliert...
                 | ... und danach rotiert
 

usrr

Bekanntes Mitglied
Jetzt wollte ich gerade anfangen zu argumentieren und was muss ich feststellen? Im entgültigen Code ist die Reihenfolge bei GLES1 und GLES2 identisch. Koffeinmangel hatte wohl ich :)

Es sind übrigens in beiden Versionen Projektionsmatrizen. Meine ganze Verwirrung entstand, da ich aber an Modelview gedacht habe.


Edit: In meinem Eröffnungsbeitrag fehlen wichtige Informationen. Damit es einen Sinn ergibt, hier die Korrektur:


Projektionsmatrix:

Java:
gl.glTranslatef(Position);

// Reihenfolge egal
gl.glRotatef(...);
gl.glScalef(...);

gl.glTranslatef(Drehzentrum);

Modelviewmatrix:

Java:
gl.glTranslatef(-Drehzentrum);

// Reihenfolge egal
gl.glRotatef(...);
gl.glScalef(...);

gl.glTranslatef(-Position);
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben