Malen mit Zahlen, Teil 2 – Transformationen und Matrizen

Auch dieser Teil ist wieder gemeinsam für Rasterung/Schattierung und Raytracing.

Um Objekte im Raum zu platzieren, müssen wir die Koordinaten ihrer Eckpunkte angeben. Für ein kompliziertes Objekt aus vielen Punkten, das irgendwie im Raum verdreht ist, kann das kompliziert werden. Meistens ist es einfacher, die Punkte des Objekts in einer »Standardlage« anzugeben. Von dort aus können wir es in die gewünschte Lage »transformieren«.

Inhaltsverzeichnis

Lineare Transformationen

Transformationen bilden Punkte A auf anderen Punkte A' ab, sind also Funktionen von der Ebene in die Ebene (bzw. vom Raum in den Raum). Der Punkt A' heißt das Bild von A.

Lineare Transformationen haben zusätzlich zwei schöne Eigenschaften, die wir uns anhand der »Drehung 90° um den Ursprung (gegen den Uhrzeigersinn)« ansehen wollen (s. Abb. 1). Statt Drehung sagt man oft auch Rotation.

Abb. 1: Die Drehung eines Punktes 90° um den Ursprung (gegen den Uhrzeigersinn).

Gezeigt ist sie nur für den Punkt A(2|3), der auf den Punkt A'(-3|2) abgebildet wird. Für beliebige Punkte P gilt dabei

(P_x|P_y)\overset{\mathcal{D}}{\longmapsto}(P'_x|P'_y)=(-P_y|P_x)\,,

wie man leicht überprüfen kann. Dabei bedeutet \overset{\mathcal{D}}{\longmapsto} die Durchführung unserer Drehung \mathcal{D}.

Statt der Punkte werden normalerweise ihre Ortsvektoren \boldsymbol{a}=\overrightarrow{OA} bzw. \boldsymbol{a}'=\overrightarrow{OA'} verwendet. Für mich ist ein Punkt synonym zu seinem Ortsvektor, weil sich eigentlich nur die Schreibweise ändert:

\displaystyle A(A_x|A_y)\longrightarrow\boldsymbol{a}=\begin{pmatrix}a_x\\a_y\end{pmatrix}=\begin{pmatrix}A_x\\A_y\end{pmatrix}\,.

Abb. 2 zeigt die Drehung 90° um den Ursprung noch einmal für die entsprechenden (Orts)vektoren.

Abb. 2: Die Drehung eines Vektors 90° um den Ursprung.

Wenn wir statt dem Vektor a den doppelt so langen Vektor 2\boldsymbol{a} drehen, ist der gedrehte Vektor (2\boldsymbol{a})' einfach 2\boldsymbol{a}' (s. Abb. 3). Es ist also egal, ob wir den Vektor vorher mit einer Zahl multiplizieren und dann drehen, oder ob wir zuerst drehen und dann mit dieser Zahl multiplizieren.

Abb. 3: Die Multiplikation eines Vektors mit einer Zahl und die Drehung um 90° sind miteinander vertauschbar.

Wie Abb. 4 an einem Beispiel zeigt, ist es auch egal, ob wir zwei Vektoren zuerst addieren und dann ihre Summe 90° drehen, oder ob wir zuerst beide drehen und dann addieren. Damit Abb. 4 nicht zu überladen ist, habe ich die Vektoren \boldsymbol{b} und \boldsymbol{b}' nur parallel verschoben gezeichnet. Verschiebt man sie zurück in den Ursprung, sind sie zueinander 90° gedreht.

Abb. 4: Auch die Addition von Vektoren und die Drehung um 90° sind miteinander vertauschbar.

Insgesamt können wir das folgendermaßen schreiben:

\displaystyle\begin{aligned}(\lambda\cdot\boldsymbol{a})'&=\lambda\cdot\boldsymbol{a}'\,\\(\boldsymbol{a}+\boldsymbol{b})'&=\boldsymbol{a}'+\boldsymbol{b}'\end{aligned}

wobei \lambda eine beliebige reelle Zahl ist. Transformationen mit diesen Eigenschaften nennt man linear.

Lineare Transformationen bilden gerade Linien wieder auf gerade Linien ab, und parallele Linien bleiben parallel. (Daher reicht es in der Computergraphik, wieder nur die Endpunkte der Linien zu transformieren.) Wenn wir möchten, dass auch Längen und Winkel erhalten bleiben, müssen wir uns auf orthogonale Transformationen beschränken (die auch linear sind). Unsere perspektivische Projektion ist übrigens nicht-linear.

Lineare Abbildungen

Die beiden Eigenschaften oben kommen in der Mathematik immer wieder vor. Generell nennt man eine Abbildung f mit den Eigenschaften

\displaystyle\begin{aligned}f(\lambda\cdot a)&=\lambda\cdot f(a)\\f(a+b)&=f(a)+f(b)\end{aligned}

eine lineare Abbildung. Das Schöne daran ist, dass diese Abbildungen/Transformationen die Struktur von Addition und Multiplikation mit einer Zahl erhalten.

Die Linearität von Abbildungen ist daher eine Verallgemeinerung des Distributivgesetzes.

Unter den reellen Funktionen gibt es genau eine Abbildung, die das erfüllt: die lineare Funktion

f(x)=k\cdot x\,,

die jeden Wert x mit derselben Konstante k multipliziert. Es gilt nämlich

f(\lambda\cdot a)=k\cdot(\lambda\cdot a)=\lambda\cdot(k\cdot a)=\lambda\cdot f(a)

und

f(a+b)=k\cdot(a+b)=k\cdot a+k\cdot b=f(a)+f(b)

für alle reelle Zahlen a und b.

Matrizen

Da stellt sich natürlich die Frage, ob wir unsere lineare Transformation, die Punkte/Vektoren in der Ebene um 90° dreht, auch irgendwie als »Multiplikation«

\boldsymbol{a}'=\mathsf{D}\cdot\boldsymbol{a}

mit irgendeinem Objekt \mathsf{D} schreiben können. Aber was ist dieses \mathsf{D} genau und welche Rechenregeln gelten dafür?

Schreiben wir die Sache etwas ausführlicher auf:

\displaystyle\begin{pmatrix}a_x'\\a_y'\end{pmatrix}=\begin{pmatrix}-a_y\\\phantom{-}a_x\end{pmatrix}=\begin{pmatrix}0\cdot a_x+(-1)\cdot a_y\\1\cdot a_x + \phantom{(-}0\phantom{)}\cdot a_y\end{pmatrix}\,.

In jeder Zeile werden dabei die x– und y-Komponenten von a mit Zahlen multipliziert und dann addiert. Diese Zahlen können wir in folgendem Schema notieren:

\displaystyle\begin{pmatrix}a_x'\\a_y'\end{pmatrix}=\underbrace{\begin{pmatrix}0&-1\\1&\phantom{-}0\end{pmatrix}}_{\displaystyle\mathsf{D}}\cdot\begin{pmatrix}a_x\\a_y\end{pmatrix}\,.

Dabei nennen wir

\displaystyle\mathsf{D}=(d_{ij})=\begin{pmatrix}0&-1\\1&\phantom{-}0\end{pmatrix}

eine (quadratische) Matrix mit 2 Zeilen und 2 Spalten bzw. eine (2\times2)-Matrix. Die d_{ij} sind die Elemente der Matrix \mathsf{D}. Der 1. Index i zählt die Zeile, der 2. Index j zählt die Spalte.

Zur Multiplikation mit einem Vektor vereinbaren wir folgendes: Für die x-Komponente des Ergebnisses werden die Werte in der 1. Zeile der Matrix mit den Komponenten von a multipliziert und dann addiert; für die y-Komponente des Ergebnisses nehmen wir die 2. Zeile.

Matrizen und lineare Abbildungen

Für eine beliebige (2\times2)-Matrix

\displaystyle\mathsf{M}=(m_{ij})=\begin{pmatrix}m_{11}&m_{12}\\m_{21}&m_{22}\end{pmatrix}

sieht das dann so aus:

\begin{aligned}\displaystyle\mathsf{M}\cdot\boldsymbol{a}&=\begin{pmatrix}m_{11}&m_{12}\\m_{21}&m_{22}\end{pmatrix}\cdot\begin{pmatrix}a_x\\a_y\end{pmatrix}\\&=\begin{pmatrix}m_{11}\cdot a_x+m_{12}\cdot a_y\\m_{21}\cdot a_x+m_{22}\cdot a_y\end{pmatrix}\end{aligned}

Wie man leicht nachrechnet, ist diese Matrix-Vektor-Multiplikation tatsächlich linear:

\displaystyle\begin{aligned}\mathsf{M}\cdot(\lambda\cdot\boldsymbol{a})&=\lambda\cdot(\mathsf{M}\cdot\boldsymbol{a})\\\mathsf{M}\cdot(\boldsymbol{a}+\boldsymbol{b})&=\mathsf{M}\cdot\boldsymbol{a}+\mathsf{M}\cdot\boldsymbol{b}\,.\end{aligned}

Im allgemeinen Fall muss eine Matrix nicht gleich viele Zeilen wie Spalten haben. Damit wir sie sinnvoll mit einem Vektor multiplizieren können, muss ihre Spaltenanzahl aber gleich der Anzahl der Vektor-Komponenten sein. Der Ergebnisvektor hat dann genauso viele Komponenten wie die Matrix Zeilen.

Interpretation der Spalten einer Matrix

Jeder Ortsvektor a lässt sich auch als die Summe (Linearkombination)

\displaystyle\boldsymbol{a}=\begin{pmatrix}a_x\\a_y\end{pmatrix}=a_x\cdot\begin{pmatrix}1\\0\end{pmatrix}+a_y\cdot\begin{pmatrix}0\\1\end{pmatrix}

schreiben. Dabei ist \begin{pmatrix}1\\0\end{pmatrix} der Einheitsvektor in x-Richtung und \begin{pmatrix}0\\1\end{pmatrix} der Einheitsvektor in y-Richtung. Diese Vektoren bilden die Standardbasis der Ebene, weil jeder Vektor eindeutig als Linearkombination davon geschrieben werden kann.

Für die Multiplikation mit der Matrix \mathsf{M} gilt dann wegen der Linearität

\displaystyle\begin{aligned}\mathsf{M}\cdot\boldsymbol{a}&=\mathsf{M}\cdot\left[a_x\cdot\begin{pmatrix}1\\0\end{pmatrix}+a_y\cdot\begin{pmatrix}0\\1\end{pmatrix}\right]\\&=\mathsf{M}\cdot\left[a_x\cdot\begin{pmatrix}1\\0\end{pmatrix}\right]+\mathsf{M}\cdot\left[a_y\cdot\begin{pmatrix}0\\1\end{pmatrix}\right]\\&=a_x\cdot\left[\mathsf{M}\cdot\begin{pmatrix}1\\0\end{pmatrix}\right]+a_y\cdot\left[\mathsf{M}\cdot\begin{pmatrix}0\\1\end{pmatrix}\right]\,.\end{aligned}

D.h., wenn wir wissen wollen, was unsere Matrix mit einem beliebigen Punkt macht, müssen wir nur wissen, was sie mit den Basisvektoren anstellt.

Lineare Transformationen sind durch die Bilder der Basisvektoren vollständig bestimmt.

Und was sind die Bilder der Standard-Basisvektoren? Das sind die Spalten der Transformations-Matrix:

\displaystyle\begin{aligned}\begin{pmatrix}m_{11}&m_{12}\\m_{21}&m_{22}\end{pmatrix}\cdot\begin{pmatrix}1\\0\end{pmatrix}&=\begin{pmatrix}m_{11}\\m_{21}\end{pmatrix}\,,\\[2ex]\begin{pmatrix}m_{11}&m_{12}\\m_{21}&m_{22}\end{pmatrix}\cdot\begin{pmatrix}0\\1\end{pmatrix}&=\begin{pmatrix}m_{12}\\m_{22}\end{pmatrix}\,.\end{aligned}

Das Bild von \begin{pmatrix}1\\0\end{pmatrix} ist die erste Spalte der Matrix, und das Bild von \begin{pmatrix}0\\1\end{pmatrix} ist die zweite Spalte.

Im Folgenden sehen wir uns ein paar Beispiele für geometrisch interessante Matrizen an.

Einheitsmatrix

Zunächst gibt es eine Matrix, deren Spalten einfach die Einheitsvektoren der Standardbasis selber sind. Diese Einheitsmatrix

\mathsf{I}=\begin{pmatrix}1&0\\0&1\end{pmatrix}

bildet daher alle Vektoren auf sich selber ab:

\mathsf{I}\cdot\boldsymbol{a}=\begin{pmatrix}1&0\\0&1\end{pmatrix}\cdot\begin{pmatrix}a_x\\a_y\end{pmatrix}=\begin{pmatrix}1\cdot a_x+0\cdot a_y\\0\cdot a_x+1\cdot a_y\end{pmatrix}=\begin{pmatrix}a_x\\a_y\end{pmatrix}=\boldsymbol{a}\,.

Die Multiplikation mit der Einheitsmatrix entspricht der Multiplikation mit 1 in den reellen/komplexen Zahlen.

Skalierung

Die Matrix

\mathsf{S}=\begin{pmatrix}s_x&0\\0&s_y\end{pmatrix}

multipliziert die Einheitsvektoren der Standardbasis mit den Konstanten s_x bzw. s_y. Dadurch wird jeder Punkt in x– bzw. y-Richtung skaliert:

\mathsf{S}\cdot\boldsymbol{a}=\begin{pmatrix}s_x&0\\0&s_y\end{pmatrix}\cdot\begin{pmatrix}a_x\\a_y\end{pmatrix}=\begin{pmatrix}s_x\cdot a_x+0\cdot a_y\\0\cdot a_x+s_y\cdot a_y\end{pmatrix}=\begin{pmatrix}s_x\cdot a_x\\s_y\cdot a_y\end{pmatrix}\,.

Abb. 5 zeigt die Skalierung eines grünen Fs. Dessen Eckpunkte wurden in x-Richtung mit 2 und in y-Richtung mit 0.75 skaliert.

Abb. 5: Das grüne F wurde in x-Richtung mit 2 und in y-Richtung mit 0.75 skaliert.

Spiegelungen

Wenn wir einen Punkt an der x-Achse spiegeln, müssen wir das Vorzeichen seiner y-Koordinate umdrehen. Ähnlich ist es für die Spiegelung an der y-Achse. Die entsprechenden Matrizen sind daher ebenfalls leichte Abwandlungen der Einheitsmatrix

\displaystyle\mathsf{S_x}=\begin{pmatrix}1&\phantom{-}0\\0&-1\end{pmatrix}\quad\text{und}\quad\mathsf{S_y}=\begin{pmatrix}-1&0\\\phantom{-}0&1\end{pmatrix}\,,

weil

\displaystyle\begin{gathered}\mathsf{S_x}\cdot\boldsymbol{a}=\begin{pmatrix}1&\phantom{-}0\\0&-1\end{pmatrix}\cdot\begin{pmatrix}a_x\\a_y\end{pmatrix}=\begin{pmatrix}1\cdot a_x+\phantom{-(}0\phantom{)}\cdot a_y\\0\cdot a_x+(-1)\cdot a_y\end{pmatrix}=\begin{pmatrix}\phantom{-}a_x\\-a_y\end{pmatrix}\\[2ex]\mathsf{S_y}\cdot\boldsymbol{a}=\begin{pmatrix}-1&0\\\phantom{-}0&1\end{pmatrix}\cdot\begin{pmatrix}a_x\\a_y\end{pmatrix}=\begin{pmatrix}-1\cdot a_x+0\cdot a_y\\\phantom{-}0\cdot a_x+1\cdot a_y\end{pmatrix}=\begin{pmatrix}-a_x\\\phantom{-}a_y\end{pmatrix}\end{gathered}

gilt.

Abb. 6 zeigt die Spiegelung der Eckpunkte des grünen Fs an der x– und der y-Achse.

Abb. 6: Das grüne F würde einmal an der x- (rot) und einmal an der y-Achse (blau) gespiegelt.

Allgemeine Drehungen/Rotationen

Wenn wir einen Punkt einen beliebigen Winkel \alpha um den Ursprung drehen wollen, müssen wir uns das wieder nur für die Standard-Basisvektoren anschauen. Positive Winkel drehen dabei gegen den Uhrzeigersinn.

Abb. 7: Drehung der Basisvektoren um den Winkel \alpha.

Die gedrehten Basisvektoren in Abb. 7 haben weiterhin die Länge 1. Ihre x– und y-Komponenten bekommen wir über die Winkelfunktionen in den grünen rechtwinkeligen Dreiecken:

\begin{aligned}&\begin{pmatrix}1\\0\end{pmatrix}\overset{\rule[-1ex]{0pt}{0pt}\mathcal{R}_\alpha}{\longmapsto}\begin{pmatrix}\cos(\alpha)\\\sin(\alpha)\end{pmatrix}\,,\\[1ex]&\begin{pmatrix}0\\1\end{pmatrix}\overset{\rule[-1ex]{0pt}{0pt}\mathcal{R}_\alpha}{\longmapsto}\begin{pmatrix}-\sin(\alpha)\\\phantom{-}\cos(\alpha)\end{pmatrix}\,.\end{aligned}

Die Bilder dieser Basisvektoren müssen die Spalten unserer Rotationsmatrix

\mathsf{R_\alpha}=\begin{pmatrix}\cos(\alpha)&-\sin(\alpha)\\\sin(\alpha)&\phantom{-}\cos(\alpha)\end{pmatrix}

sein.

Mit \alpha=90^\circ ergibt sich daraus unsere Drehmatrix \mathcal{D} von oben. (Statt \mathcal{D} für Drehung verwende ich jetzt das üblichere \mathcal{R} für Rotation.)

Abb. 8 zeigt die Rotation des grünen Fs 60° um den Ursprung. Die entsprechende Rotationsmatrix ist

\mathsf{R_{60^\circ}}=\begin{pmatrix}\cos(60^\circ)&-\sin(60^\circ)\\\sin(60^\circ)&\phantom{-}\cos(60^\circ)\end{pmatrix}\approx\begin{pmatrix}0.500&-0.866\\0.866&\phantom{-}0.500\end{pmatrix}\,.

Abb. 8: Das grüne F wurde 60° um den Ursprung gedreht.

Matrizenmultiplikation

Meistens werden wir mit einer der obigen Transformationen alleine nicht auskommen. Es hält uns aber niemand auf, mehrere Transformationen hintereinander durchzuführen. Z.B. zuerst eine Drehung 60° um den Ursprung und dann eine Spiegelung an der x-Achse:

\boldsymbol{a}'=\mathsf{S_x}\cdot(\mathsf{R_{60^\circ}}\cdot\boldsymbol{a}) .

Können wir das auch mit nur einer Transformationsmatrix \mathsf{T} machen? D.h., gilt hier auch das Assoziativgesetz

\mathsf{S_x}\cdot(\mathsf{R_{60^\circ}}\cdot\boldsymbol{a})=\underbrace{(\mathsf{S_x}\cdot\mathsf{R_{60^\circ}})}_{\displaystyle\mathsf{T}}{}\cdot\boldsymbol{a}\,?

Ja, das gilt tatsächlich! Mit den Abkürzungen \mathsf{R}=(r_{ij}) und \mathsf{S}=(s_{ij}) können wir uns mithilfe der Standardbasis folgendes überlegen:

Der Standard-Basisvektor \begin{pmatrix}1\\0\end{pmatrix} wird durch die Rotation zur 1. Spalte \begin{pmatrix}r_{11}\\r_{21}\end{pmatrix} von \mathsf{R}. Aus diesem Vektor macht die Matrix \mathsf{S} den Vektor

\begin{pmatrix}s_{11}&s_{12}\\s_{21}&s_{22}\end{pmatrix}\cdot\begin{pmatrix}r_{11}\\r_{21}\end{pmatrix}=\begin{pmatrix}s_{11}\cdot r_{11}+s_{12}\cdot r_{21}\\s_{21}\cdot r_{11}+s_{22}\cdot r_{21}\end{pmatrix}=\begin{pmatrix}t_{11}\\t_{21}\end{pmatrix}\,.

Und weil das das endgültige Bild von \begin{pmatrix}1\\0\end{pmatrix} ist, muss das auch die 1. Spalte unserer Produktmatrix \mathsf{T}=\mathsf{S}\cdot\mathsf{R} sein.

Dasselbe Spiel können wir für \begin{pmatrix}0\\1\end{pmatrix} machen. Durch die Rotation wird sein Bild zur 2. Spalte von \mathsf{R}, woraus die Matrix \mathsf{S}

\begin{pmatrix}s_{11}&s_{12}\\s_{21}&s_{22}\end{pmatrix}\cdot\begin{pmatrix}r_{12}\\r_{22}\end{pmatrix}=\begin{pmatrix}s_{11}\cdot r_{12}+s_{12}\cdot r_{22}\\s_{21}\cdot r_{12}+s_{22}\cdot r_{22}\end{pmatrix}=\begin{pmatrix}t_{12}\\t_{22}\end{pmatrix}

macht. Und das muss jetzt die 2. Spalte unseres Produkts \mathsf{T} sein.

Wenn wir zwei (n\times n)Matrizen multiplizieren wollen, können wir die Spalten der zweiten Matrix als Vektoren auffassen und jeweils mit der ersten Matrix multiplizieren. Wir haben so das Produkt zweier Matrizen auf n Matrix-Vektor-Produkte zurückgeführt.

Schauen wir uns nochmal genau an, wie es zu den Elementen (t_{ij}) der Produktmatrix \mathsf{T} kommt. Offensichtlich gilt

t_{ij}=s_{i1}\cdot r_{1j}+s_{i2}\cdot r_{2j}\,.

So können wir die Elemente des Produkts \mathsf{T}=\mathsf{S}\cdot\mathsf{R} direkt ausrechnen. Bei der Multiplikation größerer Matrizen kämen noch s_{i3}\cdot r_{3j}+s_{i4}\cdot r_{4j}+\ldots dazu.

Eine schöne Eigenschaft der Multiplikation reeller/komplexer Zahlen gilt für die Matrizenmultiplikation leider nicht. In Abb. 9 erhalten wir das rote F, indem wir das grüne F zuerst 60° um den Ursprung drehen und dann an der x-Achse spiegeln. Spiegeln wir es jedoch zuerst an der x-Achse und drehen es dann 60° um den Ursprung, erhalten wir das blaue F. Offensichtlich sind das rote und das blaue F verschieden!

Abb. 9: Zuerst drehen und dann spiegeln (rot) ist nicht dasselbe wir zuerst spiegeln und dann drehen (blau). Die strichlierten Figuren sind das Ergebnis nach der jeweils ersten Transformation.

Die Reihenfolge der Transformationen ist nicht vertauschbar! Im Allgemeinen ist die Multiplikation von Matrizen also nicht kommutativ:

\mathsf{S}\cdot\mathsf{R}\neq\mathsf{R}\cdot\mathsf{S} .

Wenn wir mehrere Transformationen hintereinander ausführen, muss die Matrix der ersten Transformation im Produkt ganz rechts und die der letzten Transformation ganz links stehen.

Inverse Matrix

In der Mathematik wie im Leben ist es gut, wenn man Dinge auch wieder rückgängig machen kann. Wenn wir z.B. Punkte 60° um den Ursprung drehen und dann 60° zurück (also um -60°), ist insgesamt nichts passiert:

\mathsf{R_{-60^\circ}}\cdot\mathsf{R_{60^\circ}}=\mathsf{I}\,.

Man sagt, die Matrizen \mathsf{R_{60^\circ}} und \mathsf{R_{-60^\circ}} sind invers zueinander, und schreibt

\begin{aligned}\mathsf{R_{-60^\circ}}&=\mathsf{R_{60^\circ}}^{-1}\,,\\\mathsf{R_{60^\circ}}&=\mathsf{R_{-60^\circ}}^{-1}\,.\end{aligned}

Das demonstriert auch, dass die Inverse der Inversen die ursprüngliche Matrix ist:

\left(\mathsf{R_{60^\circ}}^{-1}\right)^{-1}=\mathsf{R_{-60^\circ}}^{-1}=\mathsf{R_{60^\circ}}\,.

Die Spiegelung an der x-Achse können wir durch eine weitere Spiegelung an der x-Achse ungeschehen machen. Manche Matrizen sind also zu sich selber invers:

\mathsf{S_x}=\mathsf{S_x}^{-1} .

(In den reellen/komplexen Zahlen gilt das nur für \pm1=1/{\pm1}.)

Obwohl wir durch Matrizen nicht dividieren können, kommen wir der Division mit inversen Matrizen noch am nächsten. Leider können wir nicht jede Matrix invertieren. Z.B. bildet die Matrix

\mathsf{M}=\begin{pmatrix}1&1\\1&1\end{pmatrix}

alle Punkte der Ebene auf eine Gerade mit 45°-Steigung ab. Speziell gilt

\begin{gathered}\begin{pmatrix}1&1\\1&1\end{pmatrix}\cdot\begin{pmatrix}2\\1\end{pmatrix}=\begin{pmatrix}3\\3\end{pmatrix}\,,\\[2ex]\begin{pmatrix}1&1\\1&1\end{pmatrix}\cdot\begin{pmatrix}-1\\\phantom{-}4\end{pmatrix}=\begin{pmatrix}3\\3\end{pmatrix}\,.\end{gathered}

D.h., zumindest zwei verschiedene Punkte haben dasselbe Bild. Wir haben keine Chance, die Abbildung rückgängig zu machen. Damit eine Matrix invertierbar ist, muss ihre Determinante ungleich 0 sein.

Man kann sich eine allgemeine Formel für die inverse Matrix überlegen. Für unsere Transformationen ist es jedoch geometrisch klar, wie wir sie umkehren können.

Was passiert, wenn wir wie oben zwei Transformationen nacheinander ausgeführt haben, und dann wieder zurück wollen? Wenn wir z.B. zuerst gedreht und dann gespiegelt haben (\mathsf{S_x}\cdot\mathsf{R}), müssen wir zuerst die Spiegelung und dann die Rotation umkehren:

\underbrace{(\mathsf{R^{-1}}\cdot\mathsf{S_x}^{-1})}_{\displaystyle\mathsf{T^{-1}}}{}\cdot\underbrace{(\mathsf{S_x}\cdot\mathsf{R})}_{\displaystyle\mathsf{T\vphantom{{}^{-1}}}}=\mathsf{I}\,.

Für die Inverse des Produkts zweier beliebiger Matrizen \mathsf{S} und \mathsf{R} gilt daher

\boxed{(\mathsf{S}\cdot\mathsf{R})^{\mathsf{-1}}=\mathsf{R^{-1}}\cdot\mathsf{S^{-1}}}\,.

Verschiebungen

Lineare Transformationen bilden den Ursprung immer auf den Ursprung ab. Warum? Wegen der Linearität gilt (wie beim Distributivgesetz)

\mathsf{M}\cdot\boldsymbol{0}=\mathsf{M}\cdot(\boldsymbol{0}+\boldsymbol{0})=\mathsf{M}\cdot\boldsymbol{0}+\mathsf{M}\cdot\boldsymbol{0} .

Nach Subtraktion von \mathsf{M}\cdot\boldsymbol{0} auf beiden Seiten folgt

\mathsf{M}\cdot\boldsymbol{0}=\boldsymbol{0} .

Damit wir Objekte mittels Matrix-Vektor-Multiplikationen auch verschieben – 0 also auf einen anderen Punkt abbilden – können, müssen wir etwas tricksen. Die Idee der Verschiebung (Translation) ist mathematisch in der Addition realisiert. Und zum Glück steckt die Addition schon in unserer Matrix-Vektor-Multiplikation drinnen.

Wenn wir einen Punkt um (\Delta x|\Delta y) verschieben wollen, hätten wir gerne

\begin{pmatrix}x\\y\end{pmatrix}\mapsto\begin{pmatrix}x+\Delta x\\y+\Delta y\end{pmatrix}=\begin{pmatrix}1\cdot x+0\cdot y+\Delta x\cdot1\\0\cdot x+1\cdot y+\Delta y\cdot1\end{pmatrix}\,.

In der ausführlichen Version erinnert das schon an die Matrix-Vektor-Multiplikation. Der Trick besteht darin, dass wir z.B. \Delta x\cdot1 statt 1\cdot\Delta x schreiben. Dadurch wird der Einser zu einer weiteren Komponente (w-Komponente) des Ortsvektors und \Delta x bzw. \Delta y stehen in der Matrix:

\begin{pmatrix}1&0&\Delta x\\0&1&\Delta y\\?&?&?\end{pmatrix}\cdot\begin{pmatrix}x\\y\\1\end{pmatrix}=\begin{pmatrix}1\cdot x+0\cdot y+\Delta x\cdot1\\0\cdot x+1\cdot y+\Delta y\cdot1\\?\end{pmatrix}\,.

Was sollen wir statt der »?« nehmen? Die etwas künstlich hinzugefügte w-Komponente sollte nicht von x und y abhängen, und außerdem 1 bleiben. Da bleibt nur die Variante

\begin{pmatrix}1&0&\Delta x\\0&1&\Delta y\\0&0&1\end{pmatrix}\cdot\begin{pmatrix}x\\y\\1\end{pmatrix}=\begin{pmatrix}1\cdot x+0\cdot y+\Delta x\cdot1\\0\cdot x+1\cdot y+\Delta y\cdot1\\0\cdot x+0\cdot y+\;\,1\;\,\cdot1\end{pmatrix}=\begin{pmatrix}x+\Delta x\\y+\Delta y\\1\end{pmatrix}\,.

Wir nehmen also künstlich eine 3. Dimension zu den Punkten unserer Ebene dazu. Wenn wir das Ganze im Raum machen, haben wir die x-, y– und z-Komponenten und zusätzlich die w-Komponente als künstliche 4. Dimension. Mit der w-Komponente können wir noch etwas mehr tricksen, speziell in der Projektionsmatrix (die die Projektion vorbereitet, aber nicht durchführt). Für die Transformation von Objekten in der Szene lassen wir sie jedoch bei 1 (und müssten sie da eigentlich gar nicht speichern).

Statt der Einheitsmatrix könnte links oben irgendeine unserer bisherigen Tarnsformationsmatrizen \mathsf{T} stehen:

\begin{pmatrix}t_{11}&t_{12}&\Delta x\\t_{21}&t_{22}&\Delta y\\0&0&1\end{pmatrix}\cdot\begin{pmatrix}x\\y\\1\end{pmatrix}=\begin{pmatrix}t_{11}\cdot x+t_{12}\cdot y+\Delta x\\t_{21}\cdot x+t_{22}\cdot y+\Delta y\\1\end{pmatrix}\,.

Dadurch wird unsere Transformation durchgeführt und anschließend verschoben.

Wenn wir also z.B. um einen anderen Punkt als den Ursprung drehen wollen, können wir diesen Punkt zuerst in den Ursprung verschieben, und alle anderen Punkte entsprechend. Dann können wir um den Ursprung drehen und zum Schluss schieben wir alle Punkte wieder zurück. Sehen wir uns das anhand der Animation in Abb. 10 an.

Abb. 10: Die Drehung um einen Punkt ungleich dem Ursprung kann man sich aus 1.) einer Verschiebung in den Ursprung, 2.) einer Drehung um den Ursprung und 3.) einer Verschiebung zurück in den Drehpunkt vorstellen.

Das grüne F soll jetzt 60° um den Punkt (1|1) gedreht werden. Dazu müssen wir alle Punkte zuerst um (-1|-1) verschieben, dann um den Ursprung drehen und schließlich wieder zurückschieben. Mit der Matrizenmultiplikation erhalten wir die Transformationsmatrix

\begin{gathered}\begin{pmatrix}0.500&-0.866&1\\0.866&\phantom{-}0.500&1\\0&0&1\end{pmatrix}\cdot\begin{pmatrix}1&0&-1\\0&1&-1\\0&0&\phantom{-}1\end{pmatrix}\\=\begin{pmatrix}0.500&-0.866&\phantom{-}1.366\\0.866&\phantom{-}0.500&-0.366\\0&0&1\end{pmatrix}\,.\end{gathered}

Interessanterweise ändert sich am Rotationsteil gar nichts, aber die Verschiebung (1.366|-0.366) der Gesamttransformation ist etwas komisch. Die Gesamttransformation entspricht einfach einer Drehung um den Ursprung und einer anschließenden Verschiebung (s. Abb. 11).

Abb. 11: Ein andere Art, wie man eine Drehung um einen Punkt ungleich dem Ursprung interpretieren kann.

Diskussion

Mittels Transformationen lassen sich Objekte aus vielen Punkten leicht in der Ebene (im Raum) drehen, spiegeln, skalieren und auch verschieben. Sie sind daher ein beliebtes Hilfsmittel, um komplizierte Objekte in einer Standardlage zu definieren, sie dort »anzumalen« und dann in der Szene zu positionieren. Ähnlich kann man mit Transformationen die Kamera beliebig im Raum positionieren (indem der Rest der Szene genau umgekehrt transformiert wird).

Diese Objekt-Transformationen können zu unterschiedlichen Zeitpunkten unterschiedlich sein, sodass wir in jedem Frame die Objekte etwas anders positionieren. Dadurch sind beliebig komplizierte Bewegungen möglich. Wenn wir Teile eines Objekts (z.B. einen Körperteil) animieren wollen, wird die Sache etwas komplizierter.

Obwohl wir Punkte auch anders rotieren oder mit einer einfachen Vektoraddition verschieben könnten, machen wir es mit einer (4\times 4)-Matrix. Warum? Weil moderne Graphikkarten darauf optimiert sind, tausende von solchen Matrix-Multiplikationen parallel durchzuführen. Wenn wir eine Operation – egal wie künstlich – auch mit einer Matrix durchführen können, dann machen wir das. Etwas übertrieben könnte man sagen: »If all you have is a hammer, everything looks like a nail.« Jedenfalls kommen Matrizen aufgrund ihrer Nützlichkeit in der Computergraphik praktisch überall vor (auch in 2D-Programmen).

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.