Kapitel 5: Transformationen

Affine Transformationen (Translation, Rotation, Skalierung), ihre Verkettung als nicht-kommutative Matrixmultiplikation, homogene Koordinaten und der Szenegraph. Grundlage für die Positionierung aller Objekte in der Szene.

Überblick

Geometrische Objekte werden zuerst im lokalen Koordinatensystem (local / object coordinate system) modelliert und dann per Transformation ins gemeinsame Weltkoordinatensystem (world coordinate system) eingeordnet. Bewegt werden dabei nur die Vertices (Eckpunkte), geschrieben als Spaltenvektoren.

Roter Faden:

  • Translation = Vektoraddition, Rotation/Skalierung = Matrixmultiplikation.
  • Rotation und Skalierung wirken immer relativ zum Ursprung.
  • Um additive und multiplikative Anteile in einer Matrix zu vereinen, braucht man homogene Koordinaten (4. Koordinate).
  • Verkettungen sind nicht kommutativ: die Reihenfolge entscheidet.

Affine Transformationen

Affine Transformation (affine transformation) ist der Oberbegriff für Translation, Rotation und Skalierung. Eigenschaften:

  • Was parallel ist, bleibt parallel.
  • Teilverhältnisse (Länge, Fläche, Volumen) bleiben konstant.

Ein Punkt ist ein Spaltenvektor:

p=[xy](2D)p=[xyz](3D)\vec{p} = \begin{bmatrix} x \\ y \end{bmatrix} \quad\text{(2D)} \qquad \vec{p} = \begin{bmatrix} x \\ y \\ z \end{bmatrix} \quad\text{(3D)}

Translation (Verschiebung)

Reine Vektoraddition eines Translationsvektors t\vec{t}. Neutrales Element: der Nullvektor.

p=p+t\vec{p'} = \vec{p} + \vec{t}

Beispiel: Punkt (0.3,0.1,0)T(0.3, 0.1, 0)^T, Translation (0.5,0.7,0)T(0.5, 0.7, 0)^T:

[0.30.10]+[0.50.70]=[0.80.80]\begin{bmatrix} 0.3 \\ 0.1 \\ 0 \end{bmatrix} + \begin{bmatrix} 0.5 \\ 0.7 \\ 0 \end{bmatrix} = \begin{bmatrix} 0.8 \\ 0.8 \\ 0 \end{bmatrix}

Skalierung (Größenänderung)

Komponentenweise Multiplikation mit den Faktoren sx,sy,szs_x, s_y, s_z (neutrales Element: Faktor 1):

[pxpypz]=[sx000sy000sz][pxpypz]\begin{bmatrix} p'_x \\ p'_y \\ p'_z \end{bmatrix} = \begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & s_z \end{bmatrix} \begin{bmatrix} p_x \\ p_y \\ p_z \end{bmatrix}

Wichtig (typische Falle): Skalierung ist nur gegenüber dem Nullpunkt invariant. Liegt ein Objekt nicht im Ursprung, wird sein Abstand zum Ursprung mitskaliert, also ändert sich neben der Größe auch die Position. Beispiel: ein Rechteck von x=1x=1 bis x=2x=2 wird mit sx=3s_x=3 zu einem Rechteck von x=3x=3 bis x=6x=6.

Rotation (Drehung)

Drehung um einen Winkel α\alpha, immer relativ zum Ursprung. Rotation um die Z-Achse:

Rz(α)=[cosαsinα0sinαcosα0001]R_z(\alpha) = \begin{bmatrix} \cos\alpha & -\sin\alpha & 0 \\ \sin\alpha & \cos\alpha & 0 \\ 0 & 0 & 1 \end{bmatrix}

Herleitung (2D): Die Spalten der Rotationsmatrix sind die Bilder der Einheitsvektoren. ex=(1,0)T\vec{e}_x=(1,0)^T wird auf (cosα,sinα)T(\cos\alpha, \sin\alpha)^T abgebildet (1. Spalte), ey=(0,1)T\vec{e}_y=(0,1)^T auf (sinα,cosα)T(-\sin\alpha, \cos\alpha)^T (2. Spalte).

Beispiel: 9090^\circ um Z (cos90=0, sin90=1\cos 90^\circ=0,\ \sin 90^\circ=1), Punkt (0.3,0.1,0)T(0.3,0.1,0)^T:

[010100001][0.30.10]=[0.10.30]\begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} 0.3 \\ 0.1 \\ 0 \end{bmatrix} = \begin{bmatrix} -0.1 \\ 0.3 \\ 0 \end{bmatrix}

Drehen/Skalieren um einen Referenzpunkt

Da Rotation und Skalierung nur um den Ursprung wirken, braucht man für einen beliebigen Referenzpunkt (reference point) einen dreistufigen Algorithmus:

  1. Referenzpunkt in den Ursprung verschieben: MT1=T(p)M_{T1} = T(-\vec{p})
  2. Transformation anwenden (z.B. MRM_R)
  3. Zurückverschieben: MT2=T(+p)M_{T2} = T(+\vec{p})
M=MT2MRMT1M = M_{T2} \cdot M_R \cdot M_{T1}

Im Code wird die Kette in umgekehrter Reihenfolge notiert:

Matrix4f m = new Matrix4f();
m.translate( 0.5, 0.7, 0.);   // 3. Ruecktransformation (MT2)
m.rotate( 60., 0., 0., 1.);   // 2. Rotation um Z        (MR)
m.translate(-0.5,-0.7, 0.);   // 1. in den Ursprung      (MT1)

Reihenfolge: Nicht-Kommutativität

Matrixmultiplikation ist nicht kommutativ: ABBAA\cdot B \neq B\cdot A. Bei Spaltenvektoren steht die zuerst anzuwendende Transformation ganz rechts (direkt an p\vec{p}).

Mit P=(1,2,3)TP=(1,2,3)^T, Rotation RR (um Z) und Translation T(2,3,0)T(2,3,0):

TRP=(3, 2, 3)TRTP=(5, 3, 3)TT\cdot R\cdot P = (3,\ 2,\ 3)^T \qquad\neq\qquad R\cdot T\cdot P = (5,\ -3,\ 3)^T

Hinweis (mögliche Unstimmigkeit in den Folien): Die konkreten Zahlenwerte hängen von der genauen Rotationsmatrix ab und lassen sich mit einer sauberen Rz(90°)R_z(90°) nicht exakt reproduzieren. Rechnet man mit R_z(90°)=\begin{psmallmatrix}0&-1&0\\1&0&0\\0&0&1\end{psmallmatrix} (nur die x,yx,y-Ebene), erhält man TRP=(0,4,3)TT\cdot R\cdot P=(0,4,3)^T und RTP=(5,3,3)TR\cdot T\cdot P=(-5,3,3)^T. Die Kernaussage bleibt in jedem Fall dieselbe: ABBAA\cdot B \neq B\cdot A, die Reihenfolge ist entscheidend.

Merksatz: "Die Geometrie wandert rückwärts durch das Programm und sammelt die Transformationen ein."

Wegen der Assoziativität sind beide Rechenwege äquivalent:

P=M2(M1P)=(M2M1)P\vec{P'} = M_2\cdot(M_1\cdot\vec{P}) = (M_2\cdot M_1)\cdot\vec{P}

Rechts steht die akkumulierte Matrix M=M2M1M = M_2\cdot M_1: OpenGL multipliziert alle Transformationen zu einer Matrix zusammen und wendet sie dann einmal auf jeden Vertex an (schneller, weniger Rundungsfehler).

Homogene Koordinaten

Eine reine 3×33\times 3-Matrix kann keine Translation ausdrücken (Translation ist Addition, nicht Multiplikation). Lösung: eine zusätzliche 4. Koordinate ww (in 2D die 3.), also Abbildung von R3\mathbb{R}^3 in den projektiven Raum P3\mathbb{P}^3:

(xyz)(xyz1)\begin{pmatrix} x \\ y \\ z \end{pmatrix} \longrightarrow \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix}

Die Homogenisierung (perspective divide) kehrt in den euklidischen Raum zurück, indem man durch WW teilt (W0W\neq 0):

(XYZW)(X/WY/WZ/W)\begin{pmatrix} X \\ Y \\ Z \\ W \end{pmatrix} \longrightarrow \begin{pmatrix} X/W \\ Y/W \\ Z/W \end{pmatrix}

In der homogenen Matrix ist der obere linke Block der multiplikative Teil (Rotation/Skalierung), die letzte Spalte der additive Teil (Translation).

Die fünf 4x4-Transformationsmatrizen (prüfungsrelevant)

Rx(α)=(10000cosαsinα00sinαcosα00001)Ry(α)=(cosα0sinα00100sinα0cosα00001)R_x(\alpha) = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\alpha & -\sin\alpha & 0 \\ 0 & \sin\alpha & \cos\alpha & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} \qquad R_y(\alpha) = \begin{pmatrix} \cos\alpha & 0 & \sin\alpha & 0 \\ 0 & 1 & 0 & 0 \\ -\sin\alpha & 0 & \cos\alpha & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} Rz(α)=(cosαsinα00sinαcosα0000100001)S=(sx0000sy0000sz00001)T=(100tx010ty001tz0001)R_z(\alpha) = \begin{pmatrix} \cos\alpha & -\sin\alpha & 0 & 0 \\ \sin\alpha & \cos\alpha & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} \qquad S = \begin{pmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} \qquad T = \begin{pmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{pmatrix}

Vorzeichen-Merkhilfe: Bei RyR_y steht +sin+\sin oben rechts und sin-\sin unten links (spiegelverkehrt zu RxR_x und RzR_z).

Szenegraph (scene graph)

Baumförmige Struktur zur Organisation einer Szene. Kind-Objekte erben die Transformationen ihrer Eltern. Für ein Blatt (Geometrie PP) wird die Kette von der Wurzel zum Blatt multipliziert; die Wurzel-Transformation steht ganz links (wirkt als letzte, äußerste Transformation):

T1T3T6PT_1 \cdot T_3 \cdot T_6 \cdot P

Beispiel Miniatursonnensystem: Wurzel T1T_1 = Rotation um die Y-Achse der Sonne.

  • Sonne: MS=T1T2M_S = T_1 \cdot T_2 (mit T2T_2 = Skalierung / "Pumpen")
  • Erde: ME=T1T3M_E = T_1 \cdot T_3 (mit T3T_3 = Translation weg von der Sonne + Rotation um eigene Y-Achse)

So umkreist die Erde die Sonne (geerbte T1T_1) und dreht sich zugleich um sich selbst.

Prüfungsrelevanz

  • Die fünf 4x4-Matrizen aufstellen können (besonders das RyR_y-Vorzeichenmuster).
  • Konkrete Zahlenbeispiele nachrechnen (Translation, Skalierung, 9090^\circ-Rotation).
  • Warum homogene Koordinaten nötig sind und wie die Homogenisierung funktioniert.
  • Nicht-Kommutativität und die umgekehrte Code-Reihenfolge.
  • Referenzpunkt-Algorithmus T(+p)RT(p)T(+\vec{p})\cdot R\cdot T(-\vec{p}).
  • Szenegraph: Vererbung und die akkumulierte Kette für ein Blatt.

Typische Fehler

  • Reihenfolge der Matrizen verwechseln (nicht kommutativ). Zuerst angewandte Transformation steht rechts.
  • Vergessen, dass Rotation und Skalierung nur um den Ursprung wirken (nicht im Ursprung liegende Objekte verschieben sich mit).
  • Falsches sin\sin-Vorzeichen, vor allem bei RyR_y.
  • Homogenisierung (Division durch WW) vergessen bzw. W=0W=0 nicht ausschließen.
  • Elterntransformation im Szenegraph als erste statt als letzte (äußerste) anwenden.

Glossar

DeutschEnglish
Vertex / Eckpunktvertex
Spaltenvektorcolumn vector
lokales / Weltkoordinatensystemlocal / world coordinate system
affine Transformationaffine transformation
Translation / Rotation / Skalierungtranslation / rotation / scaling
neutrales Elementidentity element
nicht kommutativnon-commutative
Referenzpunktreference point
akkumulierte Matrixaccumulated matrix
homogene Koordinatenhomogeneous coordinates
Homogenisierunghomogenization / perspective divide
Szenegraphscene graph
Vererbunginheritance