• Keine Ergebnisse gefunden

Verschieben, rotieren und skalieren – und die Reihenfolge

Kontakt und Updates

2.2 Einführung in die 3D-Grafik

2.2.2 Theorie der 3D-Grafik

2.2.4.4 Verschieben, rotieren und skalieren – und die Reihenfolge

Verschiedene Transformationen erfordern verschiedene Matrizen. Wir werden uns nun die wichtigsten davon ansehen und besprechen.

Die Translationsmatrix

Die Translationsmatrix verschiebt einen Vektor um einen bestimmten Verschiebungsvektor, den wir einfach einmal tr nennen wollen. Eines ist von vorneherein klar: In dieser Matrix darf nicht sehr viel stehen, denn wir beschränken uns beim Verschieben auf eine simple Vektorad-dition. Multiplikationen oder Divisionen sind hier gänzlich fehl am Platz. Gehen wir erst ein-mal von der Identitätsmatrix aus – diese muss man nur leicht verändern, um eine Verschie-bung hervorzurufen.

Wie man oben in der Transformationsgleichung sehen kann, fließt das Matrixelement M41 bei der x-Koordinate des Vektors nur durch einfache Addition ein (weil die vierte Spalte des Vektors eben 1 ist); Gleiches gilt für die y-Koordinate und M42 und die z-Koordinate und M43. Füllt man diese Matrixelemente aus, so wird eine Translation durchgeführt, und zwar um den Verschiebungsvektor

(

M41 M42 M43

)

. Die nächste Gleichung demonstriert die Verschiebung eines Vektors pr um den Verschiebungsvektor tr.

( ) ( )

Wie man sieht, funktioniert es. Diese Matrix führt außer einer Vektoraddition nichts aus. Da-mit haben wir unsere erste Transformationsmatrix hergeleitet.

Die Skalierungsmatrix

Einen Vektor zu skalieren bedeutet einfach nur, ihn mit einem bestimmten Faktor (> 1: Ver-größerung; < 1: Verkleinerung) zu multiplizieren. Das lässt sich mit einer Skalierungsmatrix

recht leicht bewerkstelligen. Wir gehen wieder von der Identitätsmatrix aus. Wichtig ist, dass die drei Achsen jeweils einzeln mit verschiedenen Faktoren skaliert werden können!

In der Transformationsgleichung sieht man, dass die x-Komponente des resultierenden Vek-tors unter anderem aus der x-Komponente des OriginalvekVek-tors multipliziert mit dem Matrix-element M11 besteht. Dieses Produkt ist Teil einer Summe mit vier Summanden, die wieder-um aus Produkten von den anderen Komponenten und den anderen Matrixelementen bestehen.

In der Identitätsmatrix steht in der ersten Spalte der ersten Zeile der Matrix eine 1 – die x-Komponente wird mit 1 multipliziert. Der Rest der Zeile ist mit Nullen gefüllt, so wird er-reicht, dass die resultierende x-Komponente nichts mit den y- oder z-Komponenten des Origi-nalvektors zu tun hat. Dies sollte ja auch für die Skalierung gelten, und so ist alles, was wir ändern müssen, das Matrixelement M11 für die x-Skalierung, M22 für die y- und M33 für die z-Skalierung. M44 muss 1 sein, damit w 1 bleibt (x, y und z des resultierenden Vektors wer-den durch w geteilt).

Die folgende Gleichung zeigt die allgemeine Skalierungsmatrix, welche einen Vektor pr mit dem Skalierungsvektor sr skaliert (dieser beinhaltet die Skalierung auf jeder Achse):

( ) ( )

Bei der Rotation ist die Sache schon ein wenig schwieriger. Hier kommen Sinus- und Kosi-nusfunktionen zum Einsatz. Man unterscheidet zwischen vier Rotationsmatrizen: drei einzelne Matrizen für die Rotation um die x-, y- oder z-Achse und eine für die Rotation um eine belie-bige Achse als Richtungsvektor. Alle Drehungen erfolgen um den Koordinatenursprung, der bei (0, 0, 0) liegt. Soll ein anderer Punkt als Drehpunkt verwendet werden, so muss zuvor eine Translation ausgeführt werden.

Um die ersten drei Matrizen zu generieren, muss man sich nur einmal die Gleichung zur Dre-hung eines Punktes um den Koordinatenursprung und um den Winkel α im zweidimensionalen Raum ansehen:

Dieses Verfahren kann im dreidimensionalen Raum genauso angewandt werden, zumindest wenn es um die Drehung um die x-, y- oder z-Achse geht, denn hier beeinflusst die Drehung ebenfalls immer nur zwei Koordinaten.

Die gezeigte Gleichung kann als Rotation um die z-Achse angesehen werden. Möchte man sie zur Rotation um die x- oder y-Achse umfunktionieren, so erfordert das nur das einfache Ver-tauschen der Variablennamen. Dementsprechend sehen die drei Rotationsmatrizen so aus:

1 0 0 0 cos 0 sin 0 cos sin 0 0

So können wir also einen Vektor um die x-, y- oder z-Achse drehen. Die vierte Matrix, die ei-nen Vektor um eine beliebige Achse dreht, ergibt sich aus den drei Grundrotationsmatrizen.

x

Abbildung 2.10 Rotation um die x-, y- und z-Achse

Vorsicht bei Richtungsvektoren!

Möchte man Transformationsmatrizen auf Richtungsvektoren, nicht auf Positionsvektoren, anwenden, so muss man einige Besonderheiten beachten. So kann ein Richtungsvektor zum Beispiel nicht verschoben werden, er hat ja gar keine echte Position, sondern eben nur eine Richtung und bei achsenabhängigem Skalieren werden die Winkel verändert. Translation exis-tiert also nicht. Stellen Sie sich außerdem folgende Situation vor: Auf einem Dreieck steht ein Richtungsvektor im rechten Winkel. Nun wird das Dreieck nur auf einer Achse skaliert – viel-leicht um den Faktor 2 auf der y-Achse. Jetzt die y-Komponente des Richtungsvektors eben-falls mit 2 zu multiplizieren wäre falsch, er würde nun nicht mehr senkrecht auf dem Dreieck stehen. Tatsächlich muss sie nämlich durch 2 geteilt werden!

Möchte man einen Richtungsvektor transformieren, so sollte man die so genannte transponier-te invertierte Transformationsmatrix verwenden. Man transponiert eine Matrix, indem man jedes Element m, n mit dem Element n, m vertauscht. Das genau zu begründen würde leider zu weit gehen, deshalb müssen Sie das einfach als gegeben annehmen.

Kombinieren von Transformationen

Wie würden Sie die folgende Aufgabe lösen? Eine Million Punkte sollen zuerst zehntausend Mal um jeweils 45° um die x-, dann um 25° um die y- und schließlich um 5° um die z-Achse gedreht werden. Anschließend sollen zwanzigtausend Verschiebungen um (10, –0.25, 1.5) und Skalierungen um 100.1% stattfinden. Das Ganze soll so schnell geschehen, dass es während eines 3D-Spiels in Echtzeit durchgeführt werden kann.

Wenn man eine sehr nützliche Eigenschaft von Matrizen benutzt, die es auch bei den reellen Zahlen gibt, ist die Sache relativ einfach:

Man generiert eine einzige Matrix, welche all die oben beschriebenen Operationen (Verschieben, Rotieren und Skalieren) durchführt. Das geschieht durch Multiplikation der Tausenden von einzel-nen Matrizen. Die daraus resultierende Transformationsmatrix vereint alle Operatioeinzel-nen in sich! So muss man am Ende den Vektor nur noch mit einer einzigen Matrix multiplizieren.

Mit anderen Worten: Eine einzige Matrix kann die Funktion beliebig vieler Matrizen vereinen!

Das erleichtert die 3D-Grafikprogrammierung enorm. Beim Zeichnen eines Objekts reicht es so völlig aus, nur eine einzige Matrix anzugeben, anstatt einzelne Angaben über Translation, Rotation und Skalierung machen zu müssen. Nur eine einzige Vektortransformation wird durchgeführt, und man muss sich dabei gar nicht darum kümmern, was diese zusammenge-setzte Matrix eigentlich tut.

In eine Gleichung geschrieben, in der ein Vektor vr durch mehrere Matrizen A bis Z transfor-miert wird, ist das leichter zu erkennen:

( )

( )

(

v Ar× ×B ×C

)

× × = ×... Z vr

(

A B C× × × ×... Z

)

All die Klammern sind unnötig, weil hier das Assoziativgesetz gilt. Die Klammern helfen je-doch, den Unterschied zu verstehen, der in der Mathematik nicht da ist, jedoch sehr wohl in der Programmierung. Der Term in der Klammer auf der rechten Seite kann nämlich vorbe-rechnet und dann gespeichert werden.

Die richtige Kombination

Bei der Multiplikation zweier Matrizen ist deren Reihenfolge nicht egal, weil das Kommuta-tivgesetz nicht gilt. Aber welche Auswirkungen hätte denn das Vertauschen von zwei Matri-zen, wenn man mit dem Produkt einen Vektor transformieren möchte? Am einfachsten lässt sich das an einem anschaulichen Beispiel nachvollziehen.

Betrachten wir die folgende Situation:

Ein Raumschiffmodell soll auf die Position (6, 0, 3) gebracht und um einen Winkel von 45°

um die y-Achse gedreht werden.

Hier sind erst einmal zwei Matrizen erforderlich: eine Translationsmatrix, welche die Ver-schiebung um den Vektor (6, 0, 3) hervorruft, und eine Rotationsmatrix, die das Raumschiff dreht. Diese Matrizen werden sie multipliziert, um die vereinende Transformationsmatrix zu erhalten. Doch welche Matrix steht bei der Multiplikation links und welche rechts?

ƒ 1. Möglichkeit: Translationsmatrix × Rotationsmatrix

Das Raumschiff wird zuerst um den Vektor (6, 0, 3) verschoben und dann um 45° um die y-Achse rotiert.

1: keine Transformation 2: Translation 3: Rotation

45°

Abbildung 2.11 Das ist wohl nicht das Ergebnis, was man sich erhoffen würde, denn das Raumschiff hat seine Position nach der Verschiebung noch einmal verändert. Warum? Weil Drehungen immer um den Ko-ordinatenursprung erfolgen!

ƒ 2. Möglichkeit: Rotationsmatrix × Translationsmatrix

1: keine Transformation 2: Rotation 3: Translation

Abbildung 2.12 Hier wird das Schiff zuerst gedreht und dann verschoben. Wie man sieht, ist das Ergebnis korrekt. Fazit: Erst drehen, dann verschieben – es sei denn, man möchte ein Objekt nicht um seinen Mit-telpunkt drehen. Bedenken Sie: Die Koordinaten der Punkte, aus denen ein 3D-Objekt besteht, sind alle relativ zum Objektmittelpunkt!

Doch nicht nur die Antwort auf die Frage „Erst verschieben oder erst rotieren?“ muss gut ü-berlegt sein – es kommt auch noch die Skalierung hinzu.

Die Skalierung muss an allererster Stelle durchgeführt werden. Stellen Sie sich vor, das Raumschiff sollte nun ausschließlich auf der x-Achse gestreckt (verbreitert) werden. Würde man die Skalierung nach der Rotation durchführen, so würde sich die Skalierungsachse ändern – plötzlich würde das Raumschiff höher oder länger werden anstatt breiter.