Model-Transformation
Bisher haben wir unsere Geometrien meist um den Ursprung (0, 0, 0) herum aufgebaut. Bei einem Würfel lag beispielsweise sein Mittelpunkt am Ursprung. Die Positionen seiner Vertices haben wir in einem Vertex-Buffer gespeichert und direkt für die Darstellung verwendet.
Wir können diese bisherigen Vertex-Koordinaten nun als lokale Koordinaten betrachten. Sie beschreiben die Geometrie relativ zu ihrem eigenen Ursprung.
Möchten wir einen solchen Würfel an einer anderen Stelle unserer Szene platzieren, müssen wir dafür nicht die Koordinaten im Vertex-Buffer verändern. Stattdessen verwenden wir eine Model-Matrix.
Von lokalen Koordinaten zu Weltkoordinaten
Abschnitt betitelt „Von lokalen Koordinaten zu Weltkoordinaten“Stellen wir uns einen Würfel vor, dessen Mittelpunkt lokal bei (0, 0, 0) liegt. Eine seiner Ecken befindet sich bei (1, 1, 1).
Nun möchten wir den Würfel um drei Einheiten entlang der X-Achse verschieben.
Lokal In der Welt
Mittelpunkt: (0, 0, 0) (3, 0, 0)Eine Würfelecke: (1, 1, 1) (4, 1, 1)Die ursprünglichen Positionen nennen wir lokale Koordinaten. Die Positionen nach der Verschiebung nennen wir Weltkoordinaten, weil sie angeben, wo sich die Vertices innerhalb unserer gemeinsamen 3D-Szene befinden.
Die Model-Matrix übernimmt die Umrechnung zwischen diesen beiden Koordinatensystemen.
Die Model-Matrix in WGSL
Abschnitt betitelt „Die Model-Matrix in WGSL“Wie wir bereits bei den Vertex-Transformationen gesehen haben, können wir eine Verschiebung mit einer 4×4-Matrix berechnen.
Für unseren Würfel verwenden wir eine Matrix, die ihn um drei Einheiten entlang der X-Achse verschiebt:
let modelMatrix = 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(3.0, 0.0, 0.0, 1.0));Im Vertex-Shader erhalten wir die lokale Position wie gewohnt aus dem Vertex-Buffer über @location(0). Daraus berechnen wir die Weltposition:
let worldPosition = modelMatrix * vec4f(position, 1.0);Die Model-Matrix verändert dabei nicht die gespeicherten Vertex-Daten. Sie berechnet für jeden Vertex eine neue Position.
In einer WebGPU-Anwendung können wir die Model-Matrix über einen Uniform-Buffer an den Shader übergeben und verändern, ohne den Vertex-Buffer neu schreiben zu müssen.
Die Weltposition ist noch nicht die endgültige Position für @builtin(position). Dafür benötigen wir später zusätzlich die View- und Projektionsmatrix.
Mehrere Objekte mit derselben Geometrie
Abschnitt betitelt „Mehrere Objekte mit derselben Geometrie“Wir können nun beispielsweise zwei Würfel mit denselben Vertex-Daten darstellen.
Der erste Würfel erhält eine Model-Matrix, die ihn um drei Einheiten nach links verschiebt. Der zweite erhält eine Matrix, die ihn um drei Einheiten nach rechts verschiebt.
Ihre Mittelpunkte liegen damit in der Welt bei (-3, 0, 0) und (3, 0, 0), obwohl beide dieselben lokalen Vertex-Koordinaten verwenden.
Eine Model-Matrix kann neben Verschiebungen auch Drehungen und Skalierungen enthalten.
Der Vertex-Buffer beschreibt die Geometrie eines Objekts. Die Model-Matrix bestimmt, wie diese Geometrie in unserer 3D-Welt positioniert, gedreht und skaliert wird.