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.
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: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:
quelle
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:
oder
Dies ist, was ich in meinen Vertex-Shadern verwendet habe, wenn ich die Kameraposition nicht als Uniform berechnen und übergeben möchte.
quelle