![]() |
|
DirectX
und Matrizen
|
 |
|
Autor/Einsender: |
|
Nico Schertler |
|
|
|
|
Eine Matrix in DirectX
ist meistens eine 4x4-Matrix mit float-Einträgen und kann als Tabelle
dargestellt werden:
|
|
Die Bezeichnungen sind bewusst entgegen der mathematischen Bezeichnung gewählt, da die Matrix
transponiert ist. Das heißt, Zeilen und Spalten sind vertauscht. Würde man sie wieder transponieren,
entsteht die eigentliche Matrix und die Bezeichnung entspricht der mathematischen.
|
Matrizen können eingesetzt werden, um Vektoren zu transformieren. Näheres dazu später. In der
Matrix oben sind drei Bereiche markiert:
- Der blaue Bereich
beschreibt lineare Transformationen, also im Wesentlichen Skalierungen, Rotationen und
Scherungen.
- Der grüne Bereich
beschreibt affine Transformationen, also Translationen.
- Der rote Bereich
beschreibt perspektivische Transformationen. Dieser Bereich spielt für World- und View-Matrizen
meist keine Rolle.
|
Um korrekt zu bleiben sei darauf hingewiesen, dass jede lineare Transformation auch eine affine
Transformation ist. Demzufolge beschreibt der grüne Bereich diejenigen affinen Kombinationen, die
nichtlinear sind.
|
Die Transformation eines Vektors mit einer Matrix geschieht eigentlich dadurch, dass die Matrix
zurücktransponiert und von links an den Vektor multipliziert wird. Der Vollständigkeit halber sei hier
auf die Definition der Matrix-Vektor-Multiplikation hingewiesen (ein Vektor kann als 1x3-Matrix
aufgefasst werden):
|
|
Betrachten wir das Ergebnis etwas genauer. Als erstes fällt auf, dass dem Vektor eine zusätzliche w-Komponente
hinzugefügt wurde. Bei Vektoren, die Positionen beschreiben, ist diese Komponente 1.
Sie wird für perspektivische Transformationen verwendet. Nach der Transformation wird der
gesamte Vektor mit dem Kehrwert seiner w-Komponente multipliziert („durch die w-Komponente
geteilt “) woraufhin diese wieder entfernt werden kann.
|
Weiterhin sehen wir, dass der Ergebnisvektor eine Summe aus Produkten ist. Die erste Komponente
ist die Summe der Komponenten mit jeweils der ersten Spalte usw. Dadurch, dass die w-Komponente
bei Koordinaten 1 ist, wird die Translation (vierte Zeile) einfach zum Vektor dazuaddiert.
|
|
Kombination von Transformationen |
|
|
Gruppierung von Objekten (Szenengraphen) |
|
Die richtige Kombination von Transformationen kann dazu verwendet werden, um einzelne Objekte
zu gruppieren. |
Betrachten wir folgende Gruppe:
- Wurzel
- Dreieck
- Transformation: T(-2,0,0)
Das Ganze soll im ursprünglichen Zustand also so aussehen:
|
|
Sinnvoll wäre hier die Interpretation der Transformationen von rechts nach links. Also auch die
Transformationen der lokalen Koordinatensysteme. Kommt man beim Absteigen in den Baum an
eine Transformation, muss diese links an die schon vorhandene Transformation angefügt werden,
damit hier die schon vorhandenen Transformationen auch auf das Koordinatensystem Einfluss
haben.
|
Somit würde sich für das Dreieck die Identitätsmatrix als Gesamttransformation ergeben (da dafür
keine anderen Transformationen definiert sind). Für das Quadrat würde sich insgesamt
Rz(45°) * T(-2,0,0) ergeben. Also in der Reihenfolge vom Blatt zur Wurzel.
|
Soll die gesamte Gruppe transformiert werden, muss diese Matrix rechts angefügt werden, da diese
Transformation auch die lokalen Systeme transformieren soll. Für diese Matrix kann natürlich auch
separat die Interpretation links nach rechts oder rechts nach links erfolgen.
|
Angenommen, die gesamte Gruppe soll um 2 Einheiten nach unten verschoben und danach dort an
dieser Stelle (also das Koordinatensystem wird mittransformiert) um 45° im Uhrzeigersinn rotiert
werden. Damit würde sich als Gruppentransformation ergeben: Rz(-45°) * T(0,-2,0). Dies ist
gleichzeitig auch die Gesamttransformation für das Dreieck. Die Gesamttransformation für das
Quadrat würde somit folgende sein: Rz(45°) * T(-2,0,0) * Rz(-45*) * T(0,-2,0) und es ergibt sich
folgendes Bild:
|
|
Das heißt, um die Gesamttransformation von einzelnen Objekten zu ermitteln, müssen alle
Einzeltransformationen von links nach rechts multipliziert werden beginnend mit der speziellsten für
das Objekt.
|
Die Transformation für das Quadrat soll hier noch einmal für beide Interpretationen dargestellt
werden:
|
Interpretation links nach rechts:
|
Interpretation rechts nach links:
|
|
|
|
Bei Fragen zu diesem Tutorial nutzen Sie bitte unser DirectX-Forum. |
|
|