Grundlegende Frage zu OpenGL
-
Hoi,
Seit einigen Tagen beschäftige ich mich mit OpenGL
und ComputerGrafik im Allgemeinen.Nun habe ich eine Frage bezüglich OpenGL.
Wie verwaltet OpenGL die Transformationsmatrizen?Also ich meine folgendes:
Am Anfang ist der Fiktive Zeichenkopf im Ursprung des globalen Koordinatensystems.
Wenn ich diesen um 10 Längeneinheiten in Richtung der positiven Z AChse verschieben will, übergebe ich mittels der Funktion glTranslated(10,0,0,1),
OpenGL die Matrix1,0,0,0 0,1,0,0 0,0,1,10 0,0,0,1Nun ist meine Frage, wie verhält sich OpenGL, wenn ich eine 2te Matrix übergebe.
Wir die erste Matrix überarbeitet, oder werden die Matrizen einfach auf einem Stack gelegt und die Punkte dann mit jeder einzelnd multipliziert.
Zum Schluss habe ich noch eine andere Frage.
Ich habe einiege Funktion geschrieben, mit denen Man einen OrtsVector global rotieren kann.
vRotateEntityX(double dValue) vRotateEntityY(double dValue) vRotateEntitZ(double dValue)Wenn man nun davon ausgeht, dass dieser OrtsVector der Ursprung eines lokalen
Koordinatensystem ist , kann man diese mit den 3 Funktionen lokal rotieren???Hoffe auf baldige Antwort
mfg

-
Usel_Wusel schrieb:
Wenn ich diesen um 10 Längeneinheiten in Richtung der positiven Z AChse verschieben will, übergebe ich mittels der Funktion glTranslated(10,0,0,1),
OpenGL die Matrix1,0,0,0 0,1,0,0 0,0,1,10 0,0,0,1Nun ist meine Frage, wie verhält sich OpenGL, wenn ich eine 2te Matrix übergebe.
Wir die erste Matrix überarbeitet, oder werden die Matrizen einfach auf einem Stack gelegt und die Punkte dann mit jeder einzelnd multipliziert.
Wenn du eine Matrix per Hand zusammenstellst musst du die selbst mit der gewünschten Zielmatrix multiplizieren.
Ansonsten modifizieren die Funktionen wie glTranslatef oder glRotatef die aktuelle Matrix von selbst. Wenn du explizit eine Matrix wie zb. Modelview oder Projection vor der Verwendung speichern möchtest kannst du den Matrixstack zur Hilfe nehmen (jede hat ihren eigenen, glPopMatrix(), glPushMatrix()) vorher musst du aber mit glMatrixMode angeben welche Matrix du verwenden möchtest.
-
Das heißt, wenn man glPushMatrix und glPopMatrix nicht benutzt, multipliziert OpenGL alle Vertex Daten mit nur einer Matrix??
´Warum steht dann in einigen Dokus, dass der ModeViewMatrix Stapel eine Mindesthöhe von 32 haben muss???
-
Usel_Wusel schrieb:
Das heißt, wenn man glPushMatrix und glPopMatrix nicht benutzt, multipliziert OpenGL alle Vertex Daten mit nur einer Matrix??
´Warum steht dann in einigen Dokus, dass der ModeViewMatrix Stapel eine Mindesthöhe von 32 haben muss???
Naja der Nutzen des Matrixstacks erschließt sich darin wenn man z.B. nur ein Objekt in einer Szene ändern möchte oder wenn man "jedem" Objekt in der Szene seine eigene Transformation geben möchte.
Vielleicht ein doofes Beispiel du möchtest 2 Würfel entgegengesetzt rotieren lassen dann packst du jeden Würfel in seine eigene glPushMatrix() und glPopMatrix() Umgebung, damit jeder seine "eigene" Modelviewmatrix hat.
-
TheTester schrieb:
du möchtest 2 Würfel entgegengesetzt rotieren lassen dann packst du jeden Würfel in seine eigene glPushMatrix() und glPopMatrix() Umgebung, damit jeder seine "eigene" Modelviewmatrix hat.
Wie sieht es da mit der Performance aus? Kann man das so machen oder sollte man es eher vermeiden?
-
Dies ist gerade wegen der Performance so implementiert worden.
Ein Push/Pop auf einen Stack kostet vergleichsweise nichts, da dabei keine Daten neu berechnet oder auf die GK geschoben werden müssen.
-
Also quasi für jedes Objekt, dass man zeichnen will:
Matrix pushen
An Position translaten
Drehen
Matrix poppen?
-
Damit hättest du dann nicht soviel gewonnen.
Beispiel Mensch rendern ..
2 Arme, 2 Beine, 1 Kopf, ein Torso ... net hübsch, aber tuts ..erst Push, dann
TranslateXXY den ganzen menschen nach XYZ verschieben, dann
drawTorso ...
dann
Push
Rotate alpha
draw Rechter arm
Pop
push
Rotate beta
draw Linker arm
Pop
push TranslateXY
drawHead
push
translate Teta
draw Nose
pop
push
translate Omega
draw Mouth
pop
...
..
..
.Imho so, i hoffe es ist etwas klar geworden, i weiss, es war net übersichtlich ...