2009-03-10 10 views
116

Ich bin neu bei OpenGL und bin ein wenig überfordert mit all den Zufallsfunktionen, die ich in meinem Code habe. Sie arbeiten und ich weiß, wann ich sie benutzen soll, aber ich weiß nicht, warum ich sie brauche oder was sie eigentlich tun.Was macht glLoadIdentity() in OpenGL?

Ich weiß, dass glLoadIdentity() die aktuelle Matrix durch die Identitätsmatrix ersetzt, aber was genau macht das? Wenn jedes Programm es erfordert, warum ist die Identitätsmatrix nicht standardmäßig, wenn nicht anders angegeben? Ich mag keine Funktionen in meinem Code, wenn ich nicht weiß, was sie tun. Ich sollte erwähnen, dass ich OpenGL ausschließlich für reiche 2D-Clients verwende, also entschuldige meine Ignoranz, wenn dies für 3D sehr offensichtlich ist.

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

Antwort

125

Die Identitätsmatrix im Hinblick auf die Projektions- und Modelview-Matrizen setzt die Matrix im Wesentlichen auf ihren Standardzustand zurück. Wie Sie hoffentlich wissen, sind glTranslate und glRotate immer relativ zum aktuellen Status der Matrix. Wenn Sie beispielsweise glTranslate aufrufen, übersetzen Sie aus der aktuellen "Position" der Matrix, nicht aus dem Ursprung. Aber wenn Sie am Ursprung neu beginnen möchten, dann rufen Sie glLoadIdentity(), und dann können Sie glTranslate aus der Matrix, die jetzt im Ursprung befindet, oder glRotate aus 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 ist korrekt, mathematisch, dass jede Matrix, die mit dieser Matrix multipliziert wird (oder eine Matrix, die so aussieht; diagonale, alle anderen 0), zu der ursprünglichen Matrix führt, aber ich glaube nicht, dass er erklärt hat, warum das wichtig ist.

Der Grund, warum dies wichtig ist, ist, weil OpenGL alle Positionen und Rotationen durch jede Matrix multipliziert; Wenn Sie zum Beispiel ein Polygon zeichnen (glBegin(GL_FACE), einige Punkte, glEnd()), wird es durch Multiplizieren mit der MODELVIEW in "world space" übersetzt und dann von 3D in 2D übersetzt, indem es mit der PROJECT-Matrix multipliziert wird gibt ihm die 2D-Punkte auf dem Bildschirm zusammen mit der Tiefe (vom Bildschirm "Kamera"), die zum Zeichnen von Pixeln verwendet wird. Wenn jedoch eine dieser Matrizen die Identitätsmatrix ist, werden die Punkte mit der Identitätsmatrix multipliziert und werden daher nicht verändert, so dass die Matrix keine Wirkung hat; es übersetzt die Punkte nicht, es dreht sie nicht, es lässt sie so wie sie sind.

Ich hoffe, dies verdeutlicht ein bisschen mehr!

+0

klar Beispiel mit mir vergossen :) – hqt

+1

Das bedeutet, OpenGL unterhält einen ‚Master‘ oder ‚Global‘ Matrix, und jede nachfolgende Matrix relativ angelegt, dass ‚Master‘ oder 'Globale' Matrix. Habe ich recht? – anonymous

38

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

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

So lädt eine Identitätsmatrix Ihre Matrix in den richtigen Zustand, bevor Sie weitere Matrizen in den Matrixstapel multiplizieren.

glMatrixMode(GL_PROJECTION): befasst sich mit den Matrizen, die durch perspektivische Transformation oder orthogonale Transformation verwendet werden.

glMatrixMode(GL_MODELVIEW): befasst sich mit Matrizen, die von der Model-View-Transformation verwendet werden. Das heißt, Ihr Objekt (aka Modell) in den Ansichtskoordinatenraum (oder Kameraraum) zu transformieren.

2

Die Identitätsmatrix wird verwendet, um eine Matrix auf einen normalen Standard zu initialisieren.

Eine wichtige Sache zu erkennen ist, dass Matrix-Multiplikationen in einem gewissen Sinne additiv sind. Wenn Sie zum Beispiel eine Matrix nehmen, die mit der Identitätsmatrix beginnt, multiplizieren Sie sie mal mit einer Rotationsmatrix, multiplizieren Sie sie dann mit einer Skalierungsmatrix und Sie erhalten eine Matrix, die rotiert und die Matrizen multipliziert, mit denen sie multipliziert wird.

5

Die Projektionsmatrix wird verwendet, um Ihr Anzeigevolumen zu erstellen. Stellen Sie sich eine Szene in der realen Welt vor. Du siehst nicht alles um dich herum, nur was deine Augen dir erlauben zu sehen. Wenn Sie zum Beispiel ein Fisch sind, sehen Sie die Dinge ein bisschen breiter. Wenn wir also sagen, dass wir die Projektionsmatrix einrichten, meinen wir, dass wir das einrichten, was wir von der Szene, die wir schaffen, sehen wollen. Ich meine, du kannst Objekte überall in deiner Welt zeichnen. Wenn sie nicht innerhalb des Ansichtsvolumens sind, sehen Sie nichts. Stellen Sie sich vor, dass Sie beim Erstellen des Ansichtsvolumens 6 Clipping-Ebenen erstellen, die Ihr Sichtfeld definieren.

Wie für die Modelview-Matrix wird es verwendet, um verschiedene Transformationen zu den Modellen (Objekten) in Ihrer Welt vorzunehmen. So müssen Sie Ihr Objekt nur einmal definieren und dann übersetzen oder drehen oder skalieren.

Sie würden die Projektionsmatrix verwenden, bevor Sie die Objekte in Ihrer Szene zeichnen, um die Ansichtslautstärke festzulegen. Dann zeichnen Sie Ihr Objekt und ändern die Modellansichtsmatrix entsprechend. Natürlich können Sie Ihre Matrix in der Mitte des Zeichnens Ihrer Modelle ändern, wenn Sie zum Beispiel eine Szene zeichnen und dann etwas Text zeichnen möchten (was mit einigen Methoden einfacher in der orthographischen Projektion funktioniert) und dann zurück zur Modellansichtsmatrix wechseln.

Wie für den Namen Modelview hat es mit der Dualität der Modellierung und Betrachtung Transformationen zu tun. Wenn Sie die Kamera 5 Einheiten zurückziehen oder das Objekt 5 Einheiten vorwärts bewegen, ist es im Wesentlichen dasselbe.

Hoffnung Ich habe etwas Licht