Das bekannte Programm zur optimalen Vorbereitung auf die theoretische Führerscheinprüfung
DirectX und Matrizen
Autor/Einsender:   Nico Schertler
Anregungen/Tipps an: Nico Schertler
Grundlegendes
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
Transformationen, die durch Matrizen beschrieben sind, können kombiniert werden, indem sie multipliziert werden. Dabei ist darauf zu achten, dass die Reihenfolge nicht beliebig ist (Matrizenmultiplikation ist nicht kommutativ). Im folgenden Beispiel wird durch T(v) eine Translation um v und durch Rz(x) eine Rotation um die Z-Achse um den Winkel x beschrieben.
Betrachten wir folgende Transformation M:
Diese Transformation kann auf zwei Arten interpretiert werden:
  1. Von links nach rechts
    Wenn wir die Transformationen von links nach rechts kombinieren, wird jede einzelne Transformation bezüglich des globalen Koordinatensystems ausgeführt.
  2. Von rechts nach links
    Wenn die Transformation entgegengesetzt kombiniert wird, wird das Koordinatensystem
    jeweils mittransformiert. Daher werden alle weiteren Transformationen in einem lokalen Koordinatensystem ausgeführt.

Das Ergebnis ist natürlich dasselbe. An der mathematischen Auswertung ändert sich nichts. Die folgenden Abbildungen sollen die beiden Interpretationen illustrieren:

Interpretation links nach rechts: Interpretation rechts nach links:
Alle Transformationen im globalen
Koordinatensystem. Die Rotation erfolgt
um den globalen Koordinatenursprung.
Jede Transformation transformiert auch das
lokale Koordinatensystem:
• Nach der ersten Translation liegt der
      lokale Koordinatenursprung bei (0,-2,0)
• Nach der Rotation ist das lokale      
Koordinatensystem gedreht
(x zeigt nach oben, y nach links)
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)
      • Transformation: Rz(45°)
        • Quadrat

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.


Zum Seitenanfang

Startseite | VB-/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | Gewinnspiele | VB-/VBA-Forum | DirectX-Forum | VB.Net | .Net-Forum | Foren-Archiv | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Sonntag, 5. Februar 2012