Vektorrechnung

Vektoren sind das grundlegenste Element in der 3D-Grafik. Mit ihnen werden Richtungen und Punkte im 3D-Raum festgelegt. Ein Vektor bestimmt eigentlich nur eine bestimmte Strecke im Raum ohne Ursprung und daher kann man einen Vektor beliebig verschieben ohne dass es sich danach um einen anderen Vektor handelt. Man stellt sich einen Vektor üblicherweise als einen Pfeil vor den man nicht drehen aber beliebig verschieben kann.

Identische Vektoren

Identische Vektoren

Möchte man einen bestimmten Punkt im Raum mit einem Vektor definieren, so legt man fest, dass der Ursprung des Vektors der Ursprung des Koordinatensystems ist (=(0,0,0)). Diese Vektoren nennt man dann Ortsvektoren und schreibt sie mit einem großen Buchstaben mit Pfeil darüber, im Gegensatz zu den Richtungsvektoren die mit Kleinbuchstaben geschrieben werden.

\(\vec v = \left( \begin{array}{c} v_{x} \\ v_{y} \\ v_{z} \\ v_{t} \end{array} \right)\)

Damit ein Punkt im 3D-Raum genau definiert ist, muss dieser mindestens drei Elemente beinhalten: Für jede Raumachse eine Koordinate: X, Y und Z. Die Vektoren besitzen daher auch mindestens drei Elemente wenn es sich um Vektoren für 3D-Koordinaten handelt.

Ein Punkt in 3D

Ein Punkt in 3D

Für die 3-D Grafik haben die Vektoren aber nicht drei, sondern vier Elemente. Das vierte Element ist die sogenannte homogene Koordinate. Diese wird benötigt wenn man auch Verschiebungen mit Matrizen abbilden möchte. Das Thema homogene Koordinaten wird im Matrix-Kapitel beschrieben.

Addition und Subtraktion

Mit Vektoren kann man natürlich auch rechnen – es gibt zum Beispiel die Vektoraddition und -subtraktion. Diese Operationen kann man sich mit den Vektorpfeilen besonders gut vorstellen: Man hängt bei der Addition einfach beide Vektorpfeile hintereinander und erhält mit der Spitze des letzten Vektors den Endpunkt der Addition. Bei der Subtraktion muss man den um 180° gedrehten Vektor anfügen. Eine Drehung um 180° entspricht der skalaren Multiplikation aller Vektorelemente mit -1 so dass die Subtraktion hier analog zu den „normalen“ Zahlen funktioniert. Schließlich gilt in der Algebra auch: \(3 – 4 = 3 + (-1)*4\)

Vektoren werden addiert und subtrahiert indem sie elementweise addiert bzw. subtrahiert werden.

\(\vec v_{result} = \vec v_1 + \vec v_2 = \left( \begin{array}{c} v_{1x} \\ v_{1y} \\ v_{1z} \\ v_{1t} \end{array} \right) +
\left( \begin{array}{c} v_{2x} \\ v_{2y} \\ v_{2z} \\ v_{2t} \end{array} \right) =
\left( \begin{array}{c} v_{1x}+v_{2x} \\ v_{1y}+v_{2y} \\ v_{1z}+v_{2z} \\ v_{1t}+v_{2t} \end{array} \right)\) \(\vec v_{result} = \vec v_1 – \vec v_2 = \left( \begin{array}{c} v_{1x} \\ v_{1y} \\ v_{1z} \\ v_{1t} \end{array} \right) –
\left( \begin{array}{c} v_{2x} \\ v_{2y} \\ v_{2z} \\ v_{2t} \end{array} \right) =
\left( \begin{array}{c} v_{1x}-v_{2x} \\ v_{1y}-v_{2y} \\ v_{1z}-v_{2z} \\ v_{1t}-v_{2t} \end{array} \right)\)


Skalare Multiplikation

Skalare Multiplikation

Skalare Multiplikation

Multiplizieren und dividieren kann man Vektoren untereinander nicht – dies geht nur in der Kombination Vektor und skalare Zahl. Durch die Multiplikation einer Zahl mit einem Vektor wird dieser um diese Zahl verlängert bzw. verkürzt. Negative Zahlen kehren die Richtung des Vektors um:

\(\vec v_{result} = f \vec v_1 = \left( \begin{array}{c} f v_{1x} \\ f v_{1y} \\ f v_{1z} \\ f v_{1t} \end{array} \right) \qquad f \in \mathbb{R}\)

Länge eines Vektors

Die Länge eines Vektors wird auch euklidische Länge genannt. Es handelt sich dabei um die Verallgemeinerung des Satz des Pythagoras in vier Dimensionen:

\(l = \sqrt{x^2 + y^2 + z^2 + t^2}\)

Skalarprodukt

Der Winkel zwischen zwei Vektoren wird mit dem Skalarprodukt ermittelt (nicht zu verwechseln mit der skalaren Multiplikation):

Der Winkel zwischen den Vektoren \(\vec a\) und \(\vec b\)

\(\cos \alpha = \frac{\vec a \vec b}{\lvert \vec a \rvert \lvert \vec b \rvert}\)

Eine wichtige Eigenschaft des Skalarprodukts ist die, dass es positiv ist wenn der Winkel zwischen den beiden Vektoren kleiner als 90 Grad ist. Dies geht daraus hervor, dass der Kosinus im Bereich -90 bis 90 Grad positiv ist und daran auch das Dividieren durch die beiden Längen nichts ändert. Interessiert man sich also nur dafür ob der Winkel zwischen den Vektoren \(\vec a\) und \(\vec b\) kleiner als 90 Grad ist, genügt es das Skalarprodukt zu bilden und kann sich das Dividieren durch die Längen sparen – ein enormer Performancegewinn!

Die am meisten genutzte Eigenschaft ist aber die, dass das Skalarprodukt genau dann 0 ist wenn \(\vec a\) und \(\vec b\) aufeinander senkrecht stehen.

Das Skalarprodukt wird ermittelt indem die Elemente der beiden Vektoren elementweise multipliziert und die Produkte anschließend addiert werden:

\(\vec a \vec b = a_x b_x + a_y b_y + a_z b_z + a_t b_t\)

Senkrechte Projektion

Senkrechte Projektion

Senkrechte Projektion

Die senkrechte Projektion projiziert einen Vektor \(\vec a\) senkrecht auf einen zweiten Vektor \(\vec b\):

\(\vec p = \vec b \frac{\vec a \vec b}{\vec b ^ 2}\)

Die senkrechte Projektion wird unter anderem dann benötigt, wenn es darum geht die Anteile eines Vektors an einer orthogonalen(=senkrechten) Linearkombination zu ermitteln.

Da in der 3-D Grafik in den meisten Fällen mit senkrecht zueinander stehenden Koordinatenachsen gearbeitet wird, wird auch die senkrechte Projektion oft benötigt wenn Koordinaten zu den Koordinatensystemachsen ermittelt werden sollen.

Das Kreuzprodukt

Kreuzprodukt

Kreuzprodukt

Mit dem Kreuzprodukt kann man einen Vektor $\vec c$ errechnen der auf zwei gegebenen Vektoren \(\vec a\) und \(\vec b\) senkrecht steht. Damit dies funktioniert, müssen die Vektoren \(\vec a\) und \(\vec b\) linear unabhängig sein. Dies bedeutet, dass sie nicht parallel zueinander sein dürfen (egal wie sie ausgerichtet oder wie lang sie sind).

\(\vec a \times \vec b = \left( \begin{array}{c}
a_y b_z – a_z b_y \\
a_z b_x – a_x b_z \\
a_x b_y – a_y b_x \\
0 \end{array} \right)\)

Etwas zu Koordinatensystemen

In den späteren Kapiteln wird es ganz besonders wichtig sich eine allgemeingültige Tatsache bewusst zu machen:

Koordinatensysteme sind nicht statisch!

Dies bedeutet, dass die uns so vertraute X-Achse nur aufgrund einer Konvention mit dem Vektor (1,0,0) identisch ist. Das gleiche gilt auch für die Y- und Z-Achse. Genausogut könnte man beliebige andere Vektoren als Koordinatenachsen verwenden – solange sie linear unabhängig sind. Betrachten wir erstmal einen Punkt im 3D-Raum unter der Zuhilfenahme unseres „normalen“ Koordinatensystems (der Übersichtlichkeit und des besseren Verständnisses halber beschränke ich mich hier auf 3-elementige Vektoren):

\(\vec P = \left( \begin{array}{c} 3 \\ -2 \\ 7 \end{array} \right)\)

Die Koordinaten dieses Punktes bedeuten nun, dass er 3 Einheiten in Richtung der X-Achse, 2 Einheiten in Richtung der negativen Y-Achse sowie 7 Einheiten in Richtung der Z-Achse liegt. Dies können wir auch in einer Formel ausdrücken:

Der Beispielpunkt als Linearkombination

\(\left( \begin{array}{c} 3 \\ -2 \\ 7 \end{array} \right) =
3 \left( \begin{array}{c} 1 \\ 0 \\ 0 \end{array} \right) –
2 \left( \begin{array}{c} 0 \\ 1 \\ 0 \end{array} \right) +
7 \left( \begin{array}{c} 0 \\ 0 \\ 1 \end{array} \right)\)

Hier erkennt man die drei Komponenten wieder, sowie die Koordinatenachsen an denen diese angelegt werden. Man kann zeigen, dass für jede beliebige Kombination von drei linear unabhängigen Vektoren es genau einen Satz von drei Komponenten gibt mit denen die Linearkombination den gleichen Punkt wie zuvor ergibt.

Transformation

Möchten wir nun unseren Punkt zum Beispiel skalieren, dann kann man natürlich die drei Komponenten 3, -2 und 7 nehmen und diese mit einer Zahl multiplizieren. Wenn es aber um sehr viele Punkte geht, muss man das mit allen Punkten machen und zudem würde man ja auch seine Ursprungsdaten verändern (Okay, dass man die Daten vorher kopieren kann beachten wir nun mal nicht). Sehr viel flexibler ist es jedoch das Koordinatensystem so zu modifizieren, dass das neue Koordinatensystem automatisch für uns diese Operation durchführt.

Wenn wir ab sofort nur noch mit Linearkombinationen der Koordinatenachsen rechnen, können wir unsere 3D-Objekte in beliebigen Systemen zeichnen ohne erhöhten Rechenaufwand. Es wird zu Beginn der Zeichenoperation das gewünschte Koordinatensystem eingestellt und dann drauf los gezeichnet (so wird das in OpenGL gemacht). Wir können unsere Objekte um beliebige Achsen drehen indem wir einfach das zugrunde liegende Koordinatensystem drehen 😉

Nehmen wir als Faktor mal den Wert 3. Um nun das Koordinatensystem so einzustellen, dass alle Punkte die mit ihm berechnet oder gezeichnet werden sich entsprechend verändern, wenden wir den Faktor einfach auf alle drei Achsen des Koordinatensystems an und erhalten:

\(3 \left( \begin{array}{c} 3 \\ 0 \\ 0 \end{array} \right) –
2 \left( \begin{array}{c} 0 \\ 3 \\ 0 \end{array} \right) +
7 \left( \begin{array}{c} 0 \\ 0 \\ 3 \end{array} \right)
= \left( \begin{array}{c} 9 \\ -6 \\ 21 \end{array} \right)\)

Dies ist nur ein erstes kleines Beispiel was wir im nächsten Kapitel mit Matrizen machen werden – mit Matrizen wird das Jonglieren mit Koordinatensystemen zur Perfektion erhoben.