So erhalten Sie eine Übersetzung aus der Ansichtsmatrix


11

Wie kann ich die Weltraumposition der Kamera aus ihrer Ansichtsmatrix abrufen? Die einzigen Antworten, die ich auf diese Frage gesehen habe, deuten darauf hin, dass sich die Übersetzung in der letzten Zeile / Spalte befindet, aber dies würde nicht funktionieren, da die Matrix [x (Punkt) rechts, y (Punkt) oben, z (Punkt) Look] enthält.

Antworten:


10

Kurze Antwort

Invertieren Sie zuerst die Ansichtsmatrix. Rufen Sie dann die Übersetzung aus der letzten Zeile / Spalte ab.

Lange Antwort

Eine Möglichkeit, den Inhalt einer Ansichtsmatrix abzuleiten, besteht darin, zunächst die Kamera als jedes andere Objekt auf der Welt zu betrachten und eine Weltmatrix dafür zu berechnen:

RightX  RightY  RightZ  0
UpX     UpY     UpZ     0
LookX   LookY   LookZ   0
PosX    PosY    PosZ    1

Eine Weltmatrix transformiert Koordinaten vom lokalen Raum zum Weltraum. In diesem Fall sind der lokale Raum der Kamera und der Betrachtungsraum ein und dasselbe, sodass wir auch sagen können, dass diese Matrix Koordinaten vom Sichtraum in den Weltraum transformiert.

Da wir eine Umwandlung in die entgegengesetzte Richtung benötigen , müssen wir die Matrix invertieren. Das Ergebnis ist die sogenannte Ansichtsmatrix, die Koordinaten vom Weltraum in den Ansichtsraum transformiert:

   RightX        UpX        LookX      0
   RightY        UpY        LookY      0
   RightZ        UpZ        LookZ      0
-(Pos*Right)  -(Pos*Up)  -(Pos*Look)  1      // * = dot product

Und das ist die Art von Matrix, die Sie haben. Um die Kameraposition wieder zu erhalten, müssen Sie sie zuerst invertieren und dann die Übersetzung aus der letzten Zeile (oder Spalte, je nach System) abrufen.


1
Warum zuerst die Matrix invertieren? Wenn Sie (hoffentlich) wissen, ob Sie sich in Zeilen- oder Spaltenmajor befinden, sollte die Position des Übersetzungsvektors offensichtlich sein.
3Dave

7

Zunächst einmal würde ich dringend empfehlen, die Position nur separat als Vektor zu speichern, da dies die Berechnung erheblich vereinfacht. Sowieso...

[x (dot) right, y (dot) up, z (dot) look]ist nicht die eigentliche Ansichtsmatrix. Die Matrix selbst hat die Form:

1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1

Dabei steht die obere linke 3x3-Matrix für Rotationen, Skalierung usw. Die gesamte Ausrichtung der Kamera erfolgt dort. Die verbleibende Zeile und Spalte werden für die Übersetzung und einige andere komplizierte Perspektiven verwendet, auf die ich im Moment nicht eingehen werde.

Wenn Sie die Matrix erhalten (vorausgesetzt, es handelt sich um eine 4x4-Matrix), wird die Übersetzung immer entweder in der letzten Zeile oder in der letzten Spalte gespeichert, je nachdem, ob Ihre Matrixklasse eine Zeilen- oder eine Spalten-Hauptreihenfolge aufweist.

Was Sie wahrscheinlich verwirrt, ist die Tatsache, dass Sie die Punktprodukte benötigen. Was passiert, ist die Vereinfachung der Matrixmathematik. In dieser Frage zum Stapelüberlauf finden Sie detailliertere Antworten: /programming/349050/calculating-a-lookat-matrix

Die Lösung finden Sie hier . Sie müssen die Umkehrung der Matrix nehmen und die Übersetzung davon erhalten:

Vector3 ViewTrans = Matrix.Invert(ViewMatrix).Translation;
Position = ViewTrans;

5

Andere Antworten hier erklären, wie man die Kameraposition aus der Kameramatrix invers erhält.

Wenn der 3x3-Teil der Kameramatrix wie üblich nur eine Drehung (keine Skalierung oder Scherung) aufweist, kann die Berechnung optimiert werden, indem die Kameramatrix-Translation mit der Transponierung der Kameradrehung multipliziert wird. Die Kameraposition ist dann der transformierte Übersetzungsvektor multipliziert mit -1. In GLSL ist dies:

vec3 cameraPosition = -transpose(mat3(worldToCameraMatrix)) * worldToCameraMatrix[3].xyz;

oder

vec3 cameraPosition = -worldToCameraMatrix[3].xyz * mat3(worldToCameraMatrix);

Dies ist, was ich in meinen Vertex-Shadern verwendet habe, wenn ich die Kameraposition nicht als Uniform berechnen und übergeben möchte.

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.