web-dev-qa-db-de.com

Berechnen einer LookAt-Matrix

Ich schreibe gerade eine 3D-Engine und bin auf den in der DirectX-Dokumentation beschriebenen LookAt-Algorithmus gestoßen:

zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)

 xaxis.x           yaxis.x           zaxis.x          0
 xaxis.y           yaxis.y           zaxis.y          0
 xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  l

Jetzt verstehe ich, wie es auf der Rotationsseite funktioniert, aber was ich nicht ganz verstehe, ist, warum die Übersetzungskomponente der Matrix diese Punktprodukte ist. Ein wenig genauer betrachtet scheint es, als würde die Kameraposition um einen kleinen Betrag angepasst, basierend auf einer Projektion der neuen Basisvektoren auf die Position des Auges/der Kamera.

Die Frage ist, warum muss es das tun? Was leistet es?

32
Daemin

Ich erstelle eine Look-at-Matrix, indem ich, wie Sie es hier getan haben, eine 3x3-Rotationsmatrix erstellt und diese dann zu einem 4x4 mit Nullen und der einzelnen 1 in der rechten unteren Ecke erweitert. Dann erstelle ich eine 4x4-Translationsmatrix mit den negativen Augenpunktkoordinaten (keine Punktprodukte) und multipliziere die beiden Matrizen miteinander. Meine Vermutung ist, dass diese Multiplikation das Äquivalent der Punktprodukte in der unteren Zeile Ihres Beispiels ergibt, aber ich müsste es auf Papier ausarbeiten, um sicherzugehen.

Die 3D-Drehung transformiert Ihre Achsen. Daher können Sie den Augenpunkt nicht direkt verwenden, ohne ihn auch in dieses neue Koordinatensystem umzuwandeln. Das erreichen die Matrixmultiplikationen - oder in diesem Fall die 3-Punkt-Produktwerte -.

16
Judge Maygarden

Beachten Sie das angegebene Beispiel ist eine linkshändige Reihenmatrix .

Die Operation ist also: Zuerst in den Ursprung übersetzen (durch -Auge) bewegen, dann drehen, so dass der Vektor von Auge nach At mit + z ausgerichtet ist :

Grundsätzlich erhalten Sie dasselbe Ergebnis, wenn Sie die Rotationsmatrix mit einer Übersetzung -Auge vormultiplizieren:

 [1 0 0 0] [xaxis.x yaxis.x zaxis.x 0] 
 [0 1 0 0] * [xaxis.y yaxis.y zaxis.y 0] 
 [0 0 1 0] [xaxis.z yaxis.z zaxis.z 0] 
 [-Eye.x -eye.y -eye.z 1] [0 0 0 1] 

 [xaxis.x yaxis.x zaxis.x 0] 
 = [xaxis.y yaxis.y zaxis.y 0] 
 [xaxis.z yaxis.z zaxis.z 0] 
 [dot (xaxis, -eye) dot (yaxis, -eye) dot (zaxis, -eye) 1] 

Zusätzliche Bemerkungen:

Beachten Sie, dass eine Betrachtungstransformation (absichtlich) invertiert ist: Sie multiplizieren jeden Scheitelpunkt mit dieser Matrix, um die Welt zu "verschieben", sodass der Teil, den Sie sehen möchten, im kanonischen Ansichtsvolumen endet.

Beachten Sie auch, dass die Rotationsmatrix (nennen Sie sie R) der LookAt-Matrix eine invertierte Änderung der Basis Matrix, in der die Zeilen von R sind die neuen Basisvektoren in Bezug auf die alten Basisvektoren (daher sind die Variablennamen xaxis.x, .. xaxis die neue x-Achse, nachdem der Basiswechsel erfolgt). Wegen der Inversion werden die Zeilen und Spalten jedoch transponiert.

46
bobobobo

Diese Übersetzungskomponente hilft Ihnen, indem Sie eine orthonormale Basis mit Ihrem "Auge" am Ursprung und alles andere in Bezug auf diesen Ursprung (Ihr "Auge") und die drei Achsen ausdrücken.

Das Konzept ist nicht so sehr, dass die Matrix die Kameraposition justiert. Vielmehr versucht es, die Mathematik zu vereinfachen: Wenn Sie ein Bild von allem, was Sie von Ihrer "Augenposition" aus sehen können, rendern möchten, ist es am einfachsten, vorzugeben, dass Ihr Auge das Zentrum des Universums ist. 

Die kurze Antwort ist also, dass dies die Mathematik viel einfacher macht. 

Beantworten Sie die Frage im Kommentar: Der Grund, aus dem Sie nicht einfach die "Augenposition" subtrahieren, hat mit der Reihenfolge der Operationen zu tun. Stellen Sie sich das so vor: Sobald Sie sich in dem neuen Referenzrahmen befinden (d. H. Die durch xax, yaxis und zaxis dargestellte Kopfposition), möchten Sie nun Entfernungen als neuen (gedrehten) Referenzrahmen ausdrücken. Aus diesem Grund verwenden Sie das Punktprodukt der neuen Achsen mit der Augenposition: Dies entspricht der Entfernung, die die Objekte verschieben müssen, verwendet jedoch das neue Koordinatensystem.

3
Bob Cross

Nur ein paar allgemeine Informationen:

Die Lookat-Matrix ist eine Matrix, die etwas positioniert/dreht, um auf einen Punkt im Raum zu zeigen (von einem anderen Punkt im Raum aus).

Die Methode nimmt eine gewünschte "Mitte" der Kameraansicht, einen "Aufwärtsvektor", der die Richtung "nach oben" für die Kamera darstellt (Aufwärts ist fast immer (0,1,0), muss aber nicht sein ) und einen "Augenvektor", der die Position der Kamera ist.

Dies wird hauptsächlich für die Kamera verwendet, kann aber auch für andere Techniken wie Schatten, Scheinwerfer usw. verwendet werden.

Ehrlich gesagt bin ich nicht ganz sicher, warum die Übersetzungskomponente so eingestellt wird wie in dieser Methode. In gluLookAt (von OpenGL) wird die Übersetzungskomponente auf 0,0,0 gesetzt, da die Kamera immer als 0,0,0 betrachtet wird.

3
TM.

Ein Punktprodukt projiziert einfach einen Punkt auf eine Achse, um die x-, y- oder z-Komponente des Auges zu erhalten. Sie bewegen die Kamera rückwärts, so dass der Blick auf (0, 0, 0) von (10, 0, 0) und von (100000, 0, 0) unterschiedliche Auswirkungen hätte.

2
Eugene Yokota

Eine Transformations-4x4-Matrix enthält zwei bis drei Komponenten: 1. Rotationsmatrix 2. hinzuzufügende Übersetzung . 3. Maßstab (viele Maschinen verwenden dies nicht direkt in der Matrix).

Die Kombination von ihnen würde einen Punkt vom Raum A in den Raum B transformieren, daher handelt es sich um eine Transformationsmatrix M_ab

Jetzt befindet sich der Ort der Kamera im Raum A und ist daher nicht die gültige Transformation für Raum B, daher müssen Sie diesen Ort mit der Rotationstransformation multiplizieren.

Die einzige offene Frage bleibt, warum die Punkte?. Nun, wenn Sie die 3 Punkte auf ein Blatt Papier schreiben, würden Sie feststellen, dass 3 Punkte mit X, Y und Z genau wie die Multiplikation mit einer Rotationsmatrix sind.

Ein Beispiel für diese vierte Zeile/Spalte wäre der Nullpunkt - (0,0,0) im Weltraum. Es ist nicht der Nullpunkt im Kameraraum, und Sie müssen daher wissen, was die Repräsentation im Kameraraum ist, da Rotation und Skalierung den Wert Null haben!

prost

1
Adi

Die Lookat-Matrix führt diese beiden Schritte aus:

  1. Übersetzen Sie Ihr Modell in den Origin,
  2. Drehen Sie es entsprechend der durch den Aufwärtsvektor festgelegten Ausrichtung und der Ausrichtung
    Richtung.

Das Punktprodukt bedeutet einfach, dass Sie zuerst eine Übersetzung vornehmen und dann drehen. Anstatt zwei Matrizen zu multiplizieren, multipliziert das Punktprodukt nur eine Zeile mit einer Spalte.

1
Kalle

Es ist notwendig, den Augenpunkt in den Achsenraum zu legen, nicht in den Weltraum. Wenn Sie einen Vektor mit einem Koordinateneinheitenvektor der Koordinateneinheit (x, y, z) versehen, erhalten Sie die Koordinaten des Auges im Raum diesem. Sie transformieren den Ort, indem Sie die drei Übersetzungen an der letzten Stelle anwenden, in diesem Fall die letzte Zeile. Wenn Sie das Auge mit einem Negativ nach hinten bewegen, entspricht dies dem Bewegen des restlichen Bereichs nach vorne. So wie Sie sich in einem Aufzug nach oben bewegen, fühlt sich der Rest der Welt unter Ihnen heraus.

Die Verwendung einer Linkshänder-Matrix mit Übersetzung als letzter Zeile anstelle der letzten Spalte ist ein religiöser Unterschied, der mit der Antwort absolut nichts zu tun hat. Es ist jedoch ein Dogma, das unbedingt vermieden werden sollte. Es empfiehlt sich, beim Zeichnen von Baumskizzen globale-zu-lokale (vorwärtskinematische) Transformationen in einer natürlichen Lesereihenfolge von links nach rechts zu verketten. Die Verwendung von Linkshändermatrizen zwingt Sie, diese von rechts nach links zu schreiben. 

0
DragonLord