OpenGL - Die Beziehung zwischen Modell, Ansicht und Weltmatrix verstehen

8

Ich habe ein bisschen Probleme zu verstehen, wie diese Matrizen funktionieren und wie sie relativ zueinander eingerichtet werden, um ein ordnungsgemäßes System zum Laufen zu bringen.

Nach meinem Verständnis ist die Modellmatrix die Matrix eines Objekts, zum Beispiel eines Würfels oder einer Kugel. Viele davon werden in der Anwendung / im Spiel vorhanden sein.

Die Weltmatrix ist die Matrix, die den Ursprung der 3D-Welt definiert. Der Startpunkt.

Und die Ansichtsmatrix ist die "Kamera", mit der alles übersetzt wird, um sicherzustellen, dass Sie die Illusion einer tatsächlichen Kamera haben, wenn sich tatsächlich alles anstelle dieser Matrix bewegt?

Ich bin hier ein bisschen verloren. Ich hatte gehofft, jemand hier könnte mir helfen, das richtig zu verstehen.

Wird jede modelMatrix mit der Weltmatrix und der worldMatrix dann mit der viewMatrix übersetzt / multipliziert? Oder wird jede modelMatrix mit der viewMatrix und dann mit der worldMatrix übersetzt / multipliziert?

Wie hängen all diese Matrizen zusammen und wie baut man eine Welt mit mehreren Objekten und einer "Kamera" auf?

BEARBEITEN:

Vielen Dank für das Feedback. Ich habe ein bisschen gegoogelt und ich denke, ich verstehe es jetzt ein bisschen besser, aber wäre es möglich, einen Pseudo-Code-Rat zu bekommen?

projectionMatrix = Matrix;
makePerspective(45, width, height, 0.1, 1000.0, projectionMatrix);

modelMatrix = Matrix;
identity(modelMatrix);
translate(modelMatrix, [0.0, 0.0, -10.0]);  // move back 10 on z axis

viewMatrix = Matrix;
identity(viewMatrix);
// do some translation based on input with viewMatrix;

Multipliziere oder übersetze ich die viewMatrix mit der modelMatrix oder umgekehrt? und was dann? Ich habe derzeit eine Zeichenmethode so eingerichtet, dass nur 2 Matrizen zum Zeichnen von Argumenten benötigt werden.

Hier ist meine Zeichenmethode:

draw(matrix1 matrix2) {

            bindBuffer(ARRAY_BUFFER, cubeVertexPositionBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexPositionAttribute, cubeVertexPositionBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ARRAY_BUFFER, cubeVertexColorBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexColorAttribute, cubeVertexColorBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);

            setMatrixUniforms(shaderProgram, matrix1, matrix2);

            drawElements(TRIANGLES, cubeVertexIndexBuffer.numItems, UNSIGNED_SHORT, 0);


}

Was sollen diese Matrizen sein? Nochmals vielen Dank im Voraus Jungs.

Sam
quelle
1
Wissen Sie, was Matrix ist? Wissen Sie, wie man Matrizen / Vektoren multipliziert? Wissen Sie, welche Matrix darstellt (lineare / affine Transformationen)? Wenn Sie dies nicht tun, beginnen Sie besser zuerst mit etwas Mathematik.
Ivan Kuckir
Wahrscheinlich eine gute Idee, sich darauf zu konzentrieren. Haben Sie eine Idee, wonach Sie suchen sollen, oder gute Quellen, die Sie online kennen?
Sam
1
Arbeiten Sie sich bis zur linearen Algebra vor, suchen Sie dann nach grundlegendem 3D-Rendering und dann nach Tutorials. Die Intertubes sind voll von guten Quellen, aber Sie müssen es Schritt für Schritt machen, oder Sie verlieren sich, wie Sie bemerkt haben, total.
Patrick Hughes

Antworten:

19

Innerhalb einer 3D-gerenderten Szene gibt es normalerweise drei Hauptmatrizen, die verwendet werden, um ein Objekt aus seinem eigenen lokalen Raum (Objekt- / Modellraum) in einen homogenen Raum zu transformieren, der als Bildschirmraum bezeichnet wird.

Welt

  • Die Weltmatrix ist die erste, ist für jedes Objekt in Ihrer Welt einzigartig und für die Umwandlung der Eckpunkte eines Objekts aus seinem eigenen lokalen Raum in ein gemeinsames Koordinatensystem namens Weltraum verantwortlich.

Aussicht

  • Danach liefert die Ansichtsmatrix das Konzept einer mobilen Kamera, wenn sie tatsächlich der einzige konstante Bezugspunkt innerhalb der Welt ist. Die Ansichtsmatrix ist eine Transformation, die auf jedes Objekt in der Szene angewendet wird (aber nicht für jedes Objekt eindeutig ist) und die Illusion einer Kamera erzeugt. Die Ansichtsmatrix ist im Grunde die Umkehrung dessen, was als Weltmatrix für die Kamera angesehen werden könnte. Anstatt die Kamera selbst zu bewegen, liefert sie die entgegengesetzten Bewegungen zum Rest der Szene (die Illusion;)).

Projektion

  • Schließlich ist die Projektionsmatrix dafür verantwortlich, eine 3D-Welt in den homogenen Bildschirmbereich umzuwandeln, den Sie auf Ihrem Bildschirm sehen. Dies ist die Matrix, die zur Darstellung Ihres Ansichtsstumpfs verwendet wird und normalerweise als orthografische oder perspektivische Projektion dargestellt wird.

Auf der einfachsten Ebene muss jedes Ihrer Objekte eine eigene Weltmatrix enthalten, Ihre "Szene" oder der von Ihnen verwendete Kontext muss eine Ansichtsmatrix zur Darstellung einer Kamera und eine Projektionsmatrix zur Umwandlung von Weltkoordinaten in Bildschirmkoordinaten enthalten. All dies muss dann an den Vertex-Shader übergeben werden (wobei sich die Weltmatrix für jedes Objekt ändert, aber nicht unbedingt die Ansicht oder Projektion), um transformiert zu werden.

Evan
quelle
Ich habe meinen Beitrag aktualisiert. Könnten Sie vielleicht mit dem Pseudocode helfen, den ich aufgeschrieben habe, damit ich die Antwort besser verstehe?
Sam
Kann ich den genauen Text dieser Antwort übernehmen, ohne eine Urheberrechtsverletzung zu verursachen?
Arandomguy
1
Ja, Sie können es verwenden
Evan
Sollte die "Welt" -Matrix nicht als "Modell" -Matrix bezeichnet werden und die Kombination aus Modell und Ansicht, die "ModelView" -Matrix, die "Welt" -Matrix sein?
BAR
Die genaue Terminologie kann je nach verwendeter Codebasis variieren. Einige Rendering-Pipelines kombinieren bestimmte Matrizen, während andere sie geteilt lassen. Ich habe gesehen, dass einige Systeme die hier beschriebene Terminologie verwenden.
Evan
3

Eine gute Antwort finden Sie hier /programming/6461740/xna-worldmatrix-and-viewmatrix

Erstens gibt es keinen wirklichen Unterschied zwischen einer "Weltmatrix" und einer "Ansichtsmatrix" , sie sind beide Transformationsmatrizen und die Unterscheidung ist etwas willkürlich. Einige Systeme kombinieren sogar beide (OpenGL hat einfach eine "ModelView" -Matrix).

Traditionell wird die "Weltmatrix" verwendet, um einzelne Modelle vom "Modellraum" in den "Weltraum" zu verschieben. Dann wird die "Ansichtsmatrix" verwendet, um alle Modelle aus dem Weltraum in ihre relativen Positionen vor der Kamera zu bewegen (was praktisch "die Kamera bewegt"). Und schließlich konvertiert die "Projektionsmatrix" die 3D-Positionen in ihre 2D-Positionen auf dem Bildschirm (im Allgemeinen mit einer perspektivischen Projektion). Da es sich um Matrizen handelt, können sie zu einer einzigen Matrix multipliziert werden, die Punkte in einem einzigen Schritt transformieren kann.

Rusty Shackelford
quelle