Was macht glLoadIdentity () in OpenGL?


132

Ich bin neu in OpenGL und ein wenig überwältigt von all den zufälligen Funktionen, die ich in meinem Code habe. Sie funktionieren und ich weiß, wann ich sie verwenden soll, aber ich weiß nicht, warum ich sie brauche oder was sie tatsächlich tun.

Ich weiß, dass glLoadIdentity()die aktuelle Matrix durch die Identitätsmatrix ersetzt wird, aber was genau macht das? Wenn jedes Programm dies erfordert, warum wird die Identitätsmatrix nicht standardmäßig verwendet, sofern nicht anders angegeben? Ich möchte keine Funktionen in meinem Code haben, es sei denn, ich weiß, was sie tun. Ich sollte beachten, dass ich OpenGL ausschließlich für Rich-2D-Clients verwende. Entschuldigen Sie meine Unwissenheit, wenn dies für 3D sehr offensichtlich ist.

Auch ein wenig verwirrt über glMatrixMode(GL_PROJECTION)VS glMatrixMode(GL_MODELVIEW).

Antworten:


139

Die Identitätsmatrix setzt die Matrix in Bezug auf die Projektions- und Modellansichtsmatrizen im Wesentlichen auf ihren Standardzustand zurück.

Wie Sie hoffentlich wissen glTranslateund glRotateimmer relativ zum aktuellen Status der Matrix sind. Wenn Sie beispielsweise anrufen glTranslate, übersetzen Sie von der aktuellen 'Position' der Matrix, nicht vom Ursprung. Wenn Sie jedoch am Ursprung neu beginnen möchten, rufen Sie an glLoadIdentity()und können dann glTranslatevon der Matrix aus, die sich jetzt am Ursprung befindet, oder glRotatevon der Matrix, die jetzt in der Standardrichtung ausgerichtet ist.

Ich denke, Boons Antwort, dass es das Äquivalent von 1 ist, ist nicht genau richtig. Die Matrix sieht tatsächlich so aus:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

Das ist die Identitätsmatrix. Boon hat mathematisch gesehen Recht, dass jede mit dieser Matrix multiplizierte Matrix (oder eine Matrix, die so aussieht; diagonale, alle anderen Nullen) zur ursprünglichen Matrix führt, aber ich glaube nicht, dass er erklärt hat, warum dies wichtig ist.

Der Grund, warum dies wichtig ist, liegt darin, dass OpenGL alle Positionen und Rotationen durch jede Matrix multipliziert. Wenn Sie beispielsweise ein Polygon ( glBegin(GL_FACE), einige Punkte glEnd()) zeichnen , übersetzt es es in den "Weltraum", indem es mit der MODELVIEW multipliziert wird, und übersetzt es dann von 3D in 2D, indem es mit der PROJECT-Matrix multipliziert wird Die 2D-Punkte auf dem Bildschirm sowie die Tiefe (von der Bildschirmkamera), mit der Pixel gezeichnet werden. Wenn jedoch eine dieser Matrizen die Identitätsmatrix ist, werden die Punkte mit der Identitätsmatrix multipliziert und daher nicht geändert, sodass die Matrix keine Auswirkung hat. es übersetzt die Punkte nicht, es dreht sie nicht, es lässt sie wie sie sind.

Ich hoffe das klärt ein bisschen mehr!


1
Das heißt, OpenGL verwaltet eine "Master" - oder "Global" -Matrix, und jede nachfolgende Matrix wird relativ zu dieser "Master" - oder "Global" -Matrix angewendet. Habe ich recht?
user366312

41

Die Identitätsmatrix entspricht 1 für die Zahl. Wie Sie wissen, ist jede Zahl, die mit 1 multipliziert wird, selbst (e.g. A x 1 = A),

Das gleiche gilt für die Matrix ( MatrixA x IdentityMatrix = MatrixA).

Das Laden einer Identitätsmatrix ist also eine Möglichkeit, Ihre Matrix in den richtigen Zustand zu bringen, bevor Sie weitere Matrizen in den Matrixstapel multiplizieren.

glMatrixMode(GL_PROJECTION) : befasst sich mit den Matrizen, die von der Perspektiventransformation oder der orthogonalen Transformation verwendet werden.

glMatrixMode(GL_MODELVIEW): befasst sich mit Matrizen, die von der Modellansichtstransformation verwendet werden. Das heißt, Sie transformieren Ihr Objekt (auch als Modell bezeichnet) in den Ansichtskoordinatenraum (oder Kameraraum).


6

Die Projektionsmatrix wird verwendet, um Ihr Anzeigevolumen zu erstellen. Stellen Sie sich eine Szene in der realen Welt vor. Du siehst nicht wirklich alles um dich herum, nur was deine Augen dir erlauben zu sehen. Wenn Sie zum Beispiel ein Fisch sind, sehen Sie die Dinge etwas breiter. Wenn wir also sagen, dass wir die Projektionsmatrix einrichten, meinen wir, dass wir das einrichten, was wir von der von uns erstellten Szene sehen möchten. Ich meine, Sie können überall in Ihrer Welt Objekte zeichnen. Wenn sie sich nicht im Ansichtsvolumen befinden, wird nichts angezeigt. Stellen Sie sich beim Erstellen des Ansichtsvolumens vor, Sie erstellen 6 Schnittebenen, die Ihr Sichtfeld definieren.

Die Modellansichtsmatrix wird verwendet, um verschiedene Transformationen an den Modellen (Objekten) in Ihrer Welt vorzunehmen. So müssen Sie Ihr Objekt nur einmal definieren und es dann übersetzen oder drehen oder skalieren.

Sie würden die Projektionsmatrix verwenden, bevor Sie die Objekte in Ihrer Szene zeichnen, um das Ansichtsvolumen einzustellen. Dann zeichnen Sie Ihr Objekt und ändern die Modellansichtsmatrix entsprechend. Natürlich können Sie Ihre Matrix während des Zeichnens Ihrer Modelle ändern, wenn Sie beispielsweise eine Szene zeichnen und dann Text zeichnen möchten (was mit einigen Methoden bei der orthografischen Projektion einfacher funktioniert) und dann wieder zur Modellansichtsmatrix wechseln möchten.

Der Name modelview hat mit der Dualität von Modellierungs- und Betrachtungstransformationen zu tun. Wenn Sie die Kamera 5 Einheiten zurückziehen oder das Objekt 5 Einheiten vorwärts bewegen, ist dies im Wesentlichen dasselbe.

Hoffe, ich habe etwas Licht ins Dunkel gebracht


2

Die Identitätsmatrix wird verwendet, um eine Matrix auf einen vernünftigen Standardwert zu "initialisieren".

Eine wichtige Sache zu erkennen ist, dass Matrixmultiplikationen in gewissem Sinne additiv sind. Wenn Sie beispielsweise eine Matrix nehmen, die mit der Identitätsmatrix beginnt, diese mit einer Rotationsmatrix multiplizieren und dann mit einer Skalierungsmatrix multiplizieren, erhalten Sie eine Matrix, die die Matrizen, mit denen sie multipliziert wird, dreht und skaliert.


0

Um noch einmal zusammenzufassen, was andere gesagt haben, die Identitätsmatrix ist eine Matrix, bei der das Ergebnis, wenn Sie einen Vektor / eine Matrix damit multiplizieren, derselbe Vektor / dieselbe Matrix ist. Es ist das Äquivalent der Zahl 1 mit Multiplikation oder der Zahl 0 mit Addition.

glLoadIdentity () ist eine veraltete Funktion, und Sie werden aufgefordert, Ihre eigenen Matrizen zu verwalten.


-1

glLoadIdentity() Die Funktion stellt sicher, dass die Matrix jedes Mal, wenn wir in den Projektionsmodus wechseln, auf die Identitätsmatrix zurückgesetzt wird, sodass die neuen Anzeigeparameter nicht mit den vorherigen kombiniert werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.