View-Transformation
Mit der Model-Matrix haben wir die Vertices unserer Geometrien in Weltkoordinaten umgerechnet. Wir wissen also, wo sich unsere Objekte innerhalb der 3D-Szene befinden.
Jetzt möchten wir festlegen, von wo aus wir diese Szene betrachten.
Dafür benötigen wir eine Kamera. Sie besitzt eine Position und eine Ausrichtung innerhalb unserer 3D-Welt.
Die View-Transformation berechnet die Positionen unserer Vertices relativ zu dieser Kamera. Aus den Weltkoordinaten entstehen dabei Kamerakoordinaten, auch View-Koordinaten genannt.
Die Welt aus Sicht der Kamera
Abschnitt betitelt „Die Welt aus Sicht der Kamera“Bisher haben wir unsere Positionen auf den Ursprung der 3D-Welt (0, 0, 0) bezogen.
Die Kamera kann sich aber an einer ganz anderen Stelle befinden. In ihrem eigenen Koordinatensystem liegt sie selbst immer am Ursprung.
Stellen wir uns eine Kamera vor, die sich in der Welt bei (0, 0, 5) befindet und entlang der negativen Z-Achse blickt.
Ein Punkt liegt am Weltursprung (0, 0, 0).
Aus Sicht der Kamera befindet sich dieser Punkt fünf Einheiten vor ihr:
Weltposition des Punktes: (0, 0, 0)Weltposition der Kamera: (0, 0, 5)
Position aus Kamerasicht: (0, 0, -5)Um diese Kamerakoordinaten zu erhalten, verschieben wir den Punkt um fünf Einheiten entlang der negativen Z-Achse.
Das bedeutet nicht, dass wir den Punkt tatsächlich in der Welt bewegen. Wir beschreiben lediglich seine Position in einem anderen Koordinatensystem.
Die View-Matrix
Abschnitt betitelt „Die View-Matrix“Diese Umrechnung übernimmt die View-Matrix.
Für unsere Kamera bei (0, 0, 5) sieht sie so aus:
| 1 0 0 0 || 0 1 0 0 || 0 0 1 -5 || 0 0 0 1 |Auffällig ist das Vorzeichen: Die Kamera steht bei z = 5, aber die View-Matrix verschiebt die Welt um -5.
Das liegt daran, dass wir die Positionen der Objekte relativ zur Kamera berechnen. Bewegt sich die Kamera nach vorne, verschiebt sich die Welt aus ihrer Sicht in die entgegengesetzte Richtung.
In WGSL können wir die View-Matrix folgendermaßen schreiben:
let viewMatrix = mat4x4f( vec4f(1.0, 0.0, 0.0, 0.0), vec4f(0.0, 1.0, 0.0, 0.0), vec4f(0.0, 0.0, 1.0, 0.0), vec4f(0.0, 0.0, -5.0, 1.0));Im Vertex-Shader wenden wir sie auf die bereits berechnete Weltposition an:
let worldPosition = modelMatrix * vec4f(position, 1.0);let viewPosition = viewMatrix * worldPosition;Damit durchläuft unser Vertex zwei Koordinatensystemwechsel:
Lokale Koordinaten | Model-Matrix | vWeltkoordinaten | View-Matrix | vKamerakoordinatenUnser Beispiel berücksichtigt zunächst nur eine Verschiebung der Kamera. Wenn wir die Kamera drehen, muss die View-Matrix auch ihre Ausrichtung berücksichtigen. Wie wir eine solche Matrix erstellen, behandeln wir später bei unserer virtuellen Kamera.
Die Model-Matrix bestimmt, wo sich ein Objekt in der Welt befindet. Die View-Matrix bestimmt, wo sich dieses Objekt aus Sicht der Kamera befindet.
Im nächsten Schritt benötigen wir noch die Projektionsmatrix, um die dreidimensionalen Kamerakoordinaten für die Darstellung auf dem Canvas vorzubereiten.