Mathematik für Spieleprogrammierer: Vektoren

Inhalt

Einleitung
Vorraussetzung
Kartesisches Koordinatensystem
    Zeichnen
Vom Punkt zum Vektor
Betrag(Länge) eines Vektors
Rechnen mit Vektoren
    Addieren
    Subtrahieren
    Multiplizieren
    Dividieren
Besondere Vektoren
    Nullvektor
    Einheitsvektor
    Basisvektoren
Skalarprodukt
    Herleitung
    Anwendung
Kreuzprodukt
    Herleitung
Fazit
Quellen


Einleitung.

Was ist ein Vektor? Diese Frage stellt sich früher oder später jedem, der etwas mit Spieleprogrammierung zu tun hat. Viele schlaue Bücher und Artikel im Internet versuchen es zu erklären und viele scheitern daran. Es gibt nur wenige Quellen, die den Stoff auch einem mathematischen Laien gut vermitteln. Ich habe mit diesem Tutorial einen Versuch unternommen diese Frage anschaulich und so einfach wie möglich zu beantworten. Vor allem ist mir dabei wichtig, dass Sie nicht nur wissen was Vektoren sind und wie sie angewendet werden, sondern auch warum es so ist und was dahinter steckt. Doch keine Angst, die hier vorkommenden Rechnungen sind mit grundlegenden mathematischen Kenntnissen und einer Portion Motivation von jedem zu nachvollziehen. Es ist besonders von Vorteil und ich es empfehle dringend beim lesen des Tutorials sich einzelne Probleme aufzuzeichnen. Das fordert nicht ihr Verständnis an der Materie, sondern auch ihr räumliches Vorstellungsvermögen, was ihnen später helfen wird mache Aufgaben bereits im Kopf durch das Vorstellen zu lösen.
Viel Spaß! :)


Vorraussetzung

– Interesse und Motivation
– Genug Zeit und Ruhe
– Ein kariertes Heft, Bleistift, Geodreieck, Radiergummi


Kartesisches Koordinatensystem

Das kartesische Koordinatensystem, welches nach lateinischen Namen seines Erfinders René Descartes genannt wird, kennt bereits jeder aus der Schule. Die Achsen dieses Koordinatensystems stehen senkrecht zu einander und bilden in zweidimensionalem Raum (ab hier nur 2D) vier Quadranten.

Kartesisches Koordinatensystem
Zweidimensionales kartesisches Koordinatensystem

In 3D kommt zu den bekannten x- und y-Achsen noch die z-Achse hinzu, die senkrecht zu der x- und gleichzeitig auch zu der y-Achse steht. Dabei wird unterschieden ob die z-Achse nach hinten (vom Betrachter weg) oder nach vorne (zum Betrachter hin) zeigt.
Zeigt die z-Achse nach vorne, so spricht man von einem rechtshändigen Koordinatensystem, zeigt die z-Achse hingegen nach hinten (vom Betrachter weg) so spricht man von einem (man staune) linkshändigen Koordinatensystem.

Dreidimensionales kartesisches rechtshändiges Koordinatensystem.
Dreidimensionales kartesisches rechtshändiges Koordinatensystem
Dreidimensionales kartesisches rechtshändiges Koordinatensystem.
Dreidimensionales kartesisches linkshändiges Koordinatensystem

Welches Koordinatensystem man auch verwendet, es gibt keinerlei Auswirkungen auf die Ergebnisse der Vektorrechnung oder die Darstellung der Objekte. So verwenden unterschiedliche Grafik-APIs verschiedene Koordinatensysteme. OpenGL verwendet wie in Mathematik üblich ein rechtshändiges Koordinatensystem, DirectGraphics dagegen ein linkshändiges.
Wir werden hier das rechtshändige kartesische Koordinatensystem verwenden.


Zeichnen.

Damit wir später gut arbeiten können, brauchen wir ein ordentliches Koordinatensystem. Ein zweidimensionales ist schnell hingezeichnet, ein dreidimensionales erfordert hier schon etwas mehr Aufwand.

Auf einem Blatt Papier hat die Z-Achse 45° bzw. 135° Winkel zu der X-Achse und ihre Einteilung wird meistens um den Faktor [math] \sqrt{2} * 0.5 [/math] skaliert. Wenn zum Beispiel die X-Achse 1cm-Einteilung hat, so wird die Z-Achse in 0.71cm eingeteilt.

[math] 1cm * \sqrt{2} * 0.5 = 0.71cm[/math]

Dadurch wird das Zeichnen der Einteilungsstriche auf einem karierten Blatt erleichtert, da die Teilstriche genau auf den Quadratecken liegen. Sehen Sie sich dazu noch mal die Zeichnung oben an.

Die Beschriftung der Achsen erfolgt wie gehabt mit x, y und z.


Vom Punkt zum Vektor

Bevor wir anfangen brauchen wir ein paar Punkte in einem 2D Koordinatensystem.
Zeichnen Sie die Punkte P(3.5 | 2 ), U (-1.5 | 4 ), N (-3 | -1 ), K( 0 | 0), T ( 0 | -4 ) in das Koordinatensystem ein. Jetzt zeichnen wir einen Pfeil vom Koordinatenursprung O bis zum Punkt P und schon haben wir einen Vektor OP.

Vektor V
Beispielvektor

Wir bezeichnen diesen als [math] \vec{v} [/math]. Der Pfeil über den Buchstaben bedeutet, dass es sich um einen Vektor handelt, so kann man schnell einen Vektor von einem Punkt unterscheiden. Die Schreibweise für einen Vektor sieht folgendermaßen aus.
[math]
\vec{v}=\left(\begin{array}{c} x \\ y \end{array}\right) \\
\vec{v}=\left(\begin{array}{c} x \\ y\\z \end{array}\right)
[/math]

In den meisten Lehrbüchern werden die Koordinaten nicht mit verschiedenen Buchstaben bezeichnet. Stattdessen verwendet man den Buchstaben des Vektors (ohne Pfeil) mit fortlaufenden Nummern. Wenn ein Vektor [math] \vec{a} [/math] heißt, dann wird x zu [math] a_1 [/math], y zu [math] a_2 [/math] und z zu [math] a_3 [/math], also :
[math] \vec{a}=\left(\begin{array}{c} a_1 \\ a_2\\ a_3\end{array}\right) [/math]

Mit diesem Wissen können wir unseren Vektor [math] \vec{v} [/math], den wir gerade eingezeichnet haben, richtig angeben
[math] \vec{a}=\left(\begin{array}{c} 3.5 \\ 2\end{array}\right) [/math]

Man kann sich einen Vektor als einen Pfeil vorstellen. Doch was stellt ein Pfeil eigentlich dar? Schauen wir den Anfang und das Ende des Pfeils an. Anfang liegt im Punkt O (0|0) und da Ende im Punkt P (3,5 | 2). Man kann sich vorstellen, dass durch diesen Pfeil, also unseren Vektor [math] \vec{v} [/math], der Punkt O an die Position P verschoben wurde.

Nehmen wir einen anderen Punkt z.B. U (-1,5 | 4) und verschieben diesen mit Hilfe unseren Vektors. Dazu bedienen wir uns des Geodreiecks und zeichnen ein Pfeil vom Punkt T aus, der genau so lang ist wie der Pfeil zum Punkt P und noch dazu parallel zum ersten Pfeil ist. An der Spitze des Pfeils zeichnen wir einen Punkt M ein. Der Punkt M hat, wenn richtig gezeichnet, die Koordinaten (2|6).

Wiederholt man die Prozedur mit anderen Punkten, so bekommt man ein Bild mit vielen Pfeilen, die eines gemeinsam haben. Sie zeigen alle in eine Richtung und besitzen alle dieselbe Länge und genau das sind die beiden Eigenschaften, die einen Vektor ausmachen: die Länge und die Richtung. Die Position des Vektors spielt keinerlei Rolle, was man daran erkennt, dass egal welchen Punkt wir auch mit Hilfe von dem Vektor [math] \vec{v} [/math] verschieben, so bleibt die Länge der Verschiebung und die Ausrichtung des Pfeils immer gleich.

An dieser Stelle möchte ich die Definition eines Vektors angeben.

Ein Vektor ist eine gerichtete Größe, die vollständig durch Angabe eines Zahlenwertes (einer Maßeinheit) und einer Richtung charakterisiert wird. Vektoren charakterisieren die Parallelverschiebung des Raumes aus dem Punkt A in den Punkt B.

Damit ist die Sache ziemlich klar. Ein Vektor ist ein mathematisches Konstrukt das uns erlaubt einen beliebigen Punkt in eine bestimmte Richtung und auf eine bestimmte Entfernung zu verschieben.

Viele physikalische Größen sind Vektorgrößen, das heißt sie besitzen eine Richtung und eine Länge z.B. die Kraft oder die Geschwindigkeit. So hat ein fahrendes Auto immer eine bestimmte Fahrtrichtung und ein bestimmtes Tempo (das ist die Länge des Geschwindigkeitsvektors). Bewegt sich ein Auto mit der Geschwindigkeit 1m/s nach Rechts (in einem Koordinatensystem), so kann man sich vorstellen, dass alle Punkte eines Autos (an dieses Stelle kann man sich ein Drahtgittermodel eines Autos vorstellen) pro Sekunde um den Vektor [math] \vec{a}=\left(\begin{array}{c} 1 \\ 0\end{array}\right) [/math] verschoben werden. Ist ja auch klar, das Auto fährt nur nach Rechts, d.h. nur auf der X-Achse und zwar 1 Meter pro Sekunde.

Betrag (Länge) eines Vektors

Wie kann man die Länge eines Vektors berechnen? Schauen wir uns noch mal eine Zeichnung mit einem Vektor [math] \vec{v} [/math] an.

Betrag
Betrag

Das sieht sehr verdächtig nach Pythagorassatz aus ;)
Unser Vektor stellt die Hypotenuse eines rechtwinkligen Dreiecks dar. Die Katheten sind unsere x- und y-Komponenten des Vektors.

So wird die bekannte Gleichung [math] c^2 = a^2 + b^2 [/math] an unsere Bezeichnungen angepasst und umgeformt.
[math] l^2 = v_1^2 + v_2^2 [/math]

[math] l = \sqrt{ v_1^2 + v_2^2} [/math]

Die formelle Bezeichnung eines Vektorbetrags ist ein Vektor eingeschlossen in zwei senkrechte Striche, also wenn [math] \vec{v} [/math] unser Vektor ist, dann ist [math]\left| \vec{v} \right| [/math] der Betrag dieses Vektors. Daraus ergibt sich vollständige Betragsgleichung.

[math] \left| \vec{v} \right| = \sqrt{ v_1^2 + v_2^2} [/math]

Diese Gleichung gilt selbstverständlich nur in 2D. Eine ähnliche Formel gilt auch für 3D:

[math] \left| \vec{v} \right| = \sqrt{ v_1^2 + v_2^2 + v_3^2} [/math]

Wie der Titel des Unterkapitels andeuten lässt, wird die Länge des Vektors auch als Betrag bezeichnet. Im Falle der Geschwindigkeit ist das genau der Wert, den wir bei einer Aussage wie: „Das Auto schafft 250km/h“ angeben. Die Richtung interessiert in diesem Fall keinen ;)


Rechnen mit Vektoren

Obwohl oder vielleicht gerade deswegen Vektoren aus mehreren Zahlen bestehen, kann mit ihnen ähnlich Rechnen wie mit Skalaren. Was ist ein Skalar? Skalare sind normale Zahlen wie z.B. 5; 3,14; -2/5 oder 6854341.
Im Folgenden werden wir uns die Grundrechenoperationen der Vektorrechnung anschauen.


Addieren

Die Addition zwei Vektoren liefert einen neuen Vektor. Das haben Sie sicherlich schon mal gemacht. Sagt ihnen Kräfteparallelogramm was?

Kraefteparallelogramm
Kraefteparallelogramm

Wir haben Vektoren
[math] \vec{a}=\left(\begin{array}{c} 2 \\ 3\end{array}\right) [/math] und [math] \vec{b}=\left(\begin{array}{c} 4 \\ 0.5\end{array}\right) [/math] und die resultierende Kraft [math] \vec{r}=\left(\begin{array}{c} 6 \\ 3.5\end{array}\right) [/math]

Man muss kein Genie sein um zu erkennen dass hier die einzelnen Koordinatenangaben addiert wurden. Die x-Koordinate von [math] \vec{a} [/math] wird mit x-Koordinate von [math] \vec{b} [/math] und y-Koordinate von [math] \vec{a} [/math] wird mit y-Koordinate von [math] \vec{b} [/math] addiert.

[math] \vec{a} + \vec{b} = \left(\begin{array}{c} a_1 + b_1 \\ a_2 + b_2\end{array}\right) [/math]

Wie man sieht, entsteht beim Addieren ein Vektor der die Diagonale eines Kräfteparallelogramms darstellt. Noch einfacher ist es sich vorzustellen, dass beim Addieren die einzelnen Vektoren eine Kette darstellen und alle nach einander gezeichnet werden. Ein Beispiel mit 3 Vektoren.

Addition
Addition

So nebenbei, es macht überhaupt keinen Unterschied welche Reihenfolge die Kette hat. Ob man jetzt mit [math] \vec{a} [/math], [math] \vec{b} [/math] oder [math] \vec{c} [/math] anfängt und wie man die Kette weiter fortgesetzt ist egal.
Am besten man versucht einige Vektoren rechnerisch und zeichnerisch zu addieren und schaut ob die resultierenden Vektoren gleich sind.


Subtrahieren

Das Subtrahieren geht ähnlich wie das Addieren. Die einzelnen Vektorkoordinaten werden von einander abgezogen.

[math] \vec{b} – \vec{a} = \left(\begin{array}{c} b_1 – a_1 \\ b_2 – a_2\end{array}\right) [/math]

Interessant ist die Zeichnung dazu.

Subtraktion
Subtraktion

Jetzt sieht man auch, wie Vektoren „entstehen“, die nicht im Koordinatenursprung beginnen, also keine Ortsvektoren sind. Hat man zwei Punke, so kann daraus einen Vektor bauen.
Beispiel: Es sind Punkte A(2, 5) und B(6, 2) gegeben.
Man kann die beiden Punkte als Ortsvektore beschreiben. Wir bekommen Vektor [math] \overrightarrow{OA} = \left(\begin{array}{c} 2 \\ 5 \end{array}\right) [/math]

und Vektor [math] \overrightarrow{OB} = \left(\begin{array}{c} 6 \\ 2 \end{array}\right) [/math].
Rechnet man [math] \overrightarrow{OB} – \overrightarrow{OA} [/math] so bekommt man den Vektor [math] \overrightarrow{AB} [/math].
In unserem Beispiel:
[math] \overrightarrow{AB} = \overrightarrow{OB} – \overrightarrow{OA} [/math]

[math] \overrightarrow{AB} = \left(\begin{array}{c} 6 \\ 2\end{array}\right) – \left(\begin{array}{c} 2 \\ 5\end{array}\right)[/math]
[math] \overrightarrow{AB} = \left(\begin{array}{c} 4 \\ -3\end{array}\right) [/math]


Multiplizieren

Hier muss man zuerst unterscheiden ob ein Vektor mit einem weiteren Vektor oder mit einem Skalar multipliziert wird. Der erste Fall wird später unter Skalarprodukt beschrieben, es sei nur gesagt, dass bei der Multiplikation eines Vektors mit einem weiteren Vektor nur eine einzige Zahl entsteht, aber sie hat es in sich ;)

Wir beschäftigen uns hier mit dem zweiten Fall, also mit der Multiplikation eines Vektors mit einen ganz normalen Zahl, wie z.B. zwei.
Die Definition hierfür ist sehr einfach. Ein Skalar wird mit jeder Koordinate des Vektors multipliziert.

[math] \vec{a} * s = \left(\begin{array}{c} a_1 * s \\ a_2 * s \\ a_3 *s \end{array}\right) [/math]

[math] \vec{a} * s = \left(\begin{array}{c} a_1 * s \\ a_2 * s\end{array}\right) [/math]

Multiplikation
Multiplikation mit einem Skalar

Wenn wir das grafisch betrachten, dann sehen wir, dass der Vektor verlängert wird, wenn der Skalar größer als 1 ist oder verkleinert wird, wenn der Skalar kleiner als 1 ist. Ein negativer Skalar hat zwar keine Auswirkung auf die Länge, dafür aber auf die Richtung des Vektors – sie wird umgedreht. Wenn wir zum Beispiel einen Vektor [math] \vec{a} = \left(\begin{array}{c} 3 \\ 2\end{array}\right) [/math] mit -1 multiplizieren so, bekommen wir als Ergebnis Vektor [math] \vec{b} = \left(\begin{array}{c} -3 \\ -2\end{array}\right) [/math] , der genau in die entgegengesetzte Richtung wie [math] \vec{a} [/math] zeigt (siehe Zeichnung).

Zusammengefasst: Multiplikation eines Vektors mit einem Skalar verändert die Richtung oder/ und den Betrag des Vektors, vorausgesetzt es ist kein Nullvektor (alle Komponenten sind 0).


Dividieren

Das Dividieren von Vektoren geht genau so einfach wie das Multiplizieren. Man teilt jede Koordinate des Vektors durch einen Skalar.

[math] \vec{a} / s = \left(\begin{array}{c} a_1 / s \\ a_2 / s \\ a_3 / s \end{array}\right) [/math]

[math] \vec{a} / s = \left(\begin{array}{c} a_1 / s \\ a_2 / s\end{array}\right) [/math]

Wie man sieht geht es genau so wie die Multiplikation. Aber Vorsicht! Man kann einen Vektor nur durch einen Skalar teilen. Einen Vektor durch einen Vektor zu teilen ist nicht möglich, weil die Operation undefiniert ist. Dazu später mehr.


Besondere Vektoren

Es gibt Vektoren, die besondere Eigenschaften haben und auch eigene Bezeichnung. Diese Vektoren stellen keine Sonderfälle dar und es gibt keine Sonderregelungen und Ausnahmen. Die Folgende Übersicht soll nur einige Eigenschaften etwas verdeutlichen, weil sie in der Anwendung besonders praktisch sind.


Nullvektor

Ein Nullvektor ist ein Vektor mit dem Betrag 0 und unbestimmter Richtung. Als Bezeichnung wird häufig eine Null mit Pfeil herangezogen:
\fed 0^>
.
So ein Vektor entsteht, wenn man beim Erstellen eines Vektors zwei Mal denselben Punkt nimmt.

[math] \vec{0} = \overrightarrow{OA} – \overrightarrow{OA} [/math]

[math] \vec{0} = \left(\begin{array}{c} 0 \\ 0\end{array}\right) [/math]

Oder wenn ein Vektor mit einer Null multipliziert wird.

[math] \vec{v} * 0 = \vec{0} [/math]

Der Betrag ist somit auch Null.

[math] \left|\vec{0}\right| = \sqrt{ 0^2 + 0^2 } [/math]

[math] \left|\vec{0}\right| = 0 [/math]

Da ein Nullvektor keine Richtung besitzt, hat er auch keine Auswirkung auf eine Vektoraddition bzw. Subtraktion.

[math] \vec{v} + \vec{0} = \vec{v} [/math]

[math] \vec{v} – \vec{0} = \vec{v} [/math]


Einheitsvektor

Ein Einheitsvektor ist ein Vektor mit der Länge 1. Die Richtung spielt dabei keine Rolle.

[math] \left|\vec{a}\right| = 1 [/math]

Wenn man in ein Koordinatensystem einen Einheitskreis (Radius = 1) einzeichnet, so ist jeder Vektor, der vom Mittelpunkt zum Rand des Kreises zeigt ein Einheitsvektor.

Einheisvektoren
Einheisvektoren

Sehr oft muss ein Vektor in die Einheitsform gebracht werden. Dazu muss die Vektorlänge auf 1 gebraucht werden in dem man den Vektor durch seinen Betrag teilt.

[math] \vec{n} = \frac{1}{\left|\vec{a}\right|} * \vec{a} [/math]

Rechnen wir einen Beispiel mit dem Vektor [math] \vec{a} = \left(\begin{array}{c} -3 \\ 4\end{array}\right) [/math] durch. Zuerst berechnen wir den Betrag des Vektors.

[math] \left|\vec{a}\right| = \sqrt{ (-3)^2 + 4^2 } [/math]

[math] \left|\vec{a}\right| = \sqrt{ 9 + 16 } [/math]

[math] \left|\vec{a}\right| = \sqrt{25} [/math]

[math] \left|\vec{a}\right| = 5 [/math]

Jetzt teilen wir [math] \vec{a} [/math] durch 5.

[math] \vec{n} = 1/5 * \vec{a} [/math]

[math] \vec{n} = \left(\begin{array}{c} -3/5 \\ 4/5\end{array}\right) [/math]

[math] \vec{n} = \left(\begin{array}{c} -0.6 \\ 0.8\end{array}\right) [/math]

Vektor [math] \vec{n} = \left(\begin{array}{c} -0.6 \\ 0.8\end{array}\right) [/math] ist der gesuchte Einheitsvektor. Der Betrag dieses Vektors ist 1, was man dur eine kleine Rechnung überprüfen kann.

[math] \left|\vec{n}\right| = \sqrt{ (-0.6)^2 + 0.8^2 } [/math]

[math] \left|\vec{n}\right| = \sqrt{ 0.36 + 0.64 } [/math]

[math] \left|\vec{n}\right| = \sqrt{1} [/math]

[math] \left|\vec{n}\right| = 1 [/math]


Basisvektoren

Basisvektoren stellen die Basis eines Koordinatensystems dar. Das sind praktisch die Koordinatenachsen eines Koordinatensystems. Der 2D-Raum hat somit zwei Basisvektoren und der 3D-Raum drei. Meistens werden Basisvektoren als Einheitsvektoren dargestellt.

[math] \vec{x} = \left(\begin{array}{c} 1 \\ 0\end{array}\right) [/math]

[math] \vec{y} = \left(\begin{array}{c} 0 \\ 1\end{array}\right) [/math]

bzw.

[math] \vec{x} = \left(\begin{array}{c} 1 \\ 0 \\ 0\end{array}\right) [/math]

[math] \vec{y} = \left(\begin{array}{c} 0 \\ 1 \\ 0\end{array}\right) [/math]

[math] \vec{z} = \left(\begin{array}{c} 0 \\ 0 \\ 1\end{array}\right) [/math]

Durch die Basisvektoren kann jeder Vektor in dem jeweiligem Koordinatensystem beschrieben werden. Wenn [math] \vec{v} [/math] ein Vektor im 2D Raum ist, so kann man schreiben:

[math] \vec{v} = a * \left(\begin{array}{c} 1 \\ 0 \end{array}\right) + b * \left(\begin{array}{c} 0 \\ 1 \end{array}\right) [/math]

Durch die Variation von a und b bekommt man bekommt man jeden beliebigen Vektor.

Beispiel:
Der Vektor [math] \vec{a} = \left(\begin{array}{c} -3 \\ 1/9 \\ \sqrt{2} \end{array}\right) [/math] kann auf folgendermaßen angegeben werden:

[math] \vec{a} = -3 *\left(\begin{array}{c} 1 \\ 0 \\ 0 \end{array}\right) + 1/9 * \left(\begin{array}{c} 0 \\ 1 \\ 0 \end{array}\right) + \sqrt{2} * \left(\begin{array}{c} 0 \\ 0 \\ 1 \end{array}\right) [/math]

[math] \vec{a} = \left(\begin{array}{c} -3 \\ 0 \\ 0 \end{array}\right) + \left(\begin{array}{c} 0 \\ 1/9 \\ 0 \end{array}\right) + \left(\begin{array}{c} 0 \\ 0 \\ \sqrt{2} \end{array}\right) [/math]

[math] \vec{a} = \left(\begin{array}{c} -3 + 0 + 0 \\ 0 + 1/9 + 0 \\ 0 + 0 + \sqrt{2} \end{array}\right) [/math]

[math] \vec{a} = \left(\begin{array}{c} -3\\ 1/9 \\ \sqrt{2} \end{array}\right) [/math]


Skalarprodukt

Als Skalarprodukt wird eine Multiplikation von zwei Vektoren bezeichnet und wird folgendermaßen ausgerechnet:

[math] \vec{a} * \vec{b} = a_1*b_1 + a_2*b_2 [/math]

oder für 3D:

[math] \vec{a} * \vec{b} = a_1*b_1 + a_2*b_2 + a_3*b_3 [/math]

Das Ergebnis ist ein Skalar, d.h. eine einzige Zahl. Doch diese Zahl beinhaltet mehr als man denkt, nämlich die Länge und den Winkel zwischen den beiden Vektoren.
Es gilt:

[math] \vec{a} * \vec{b} = \left|\vec{a}\right| * \left|\vec{b}\right| * cos( \measuredangle{( \vec{a},\vec{b})})[/math]

Durch eine kleine Umstellung der Formel kann man leicht einen Winkel zwischen zwei Vektoren bestimmen.

[math] cos( \measuredangle{( \vec{a},\vec{b})}) = \frac{\vec{a} * \vec{b}} { \left|\vec{a}\right| * \left|\vec{b}\right| } [/math]

Wir gehen später genauer drauf ein.


Herleitung

Schauen wir uns zuerst eine Aufgabe an.
Aufgabe: Bestimmen Sie den Winkel w.

Winkel bestimmen
Winkel bestimmen

Wenn die Seitenlängen gegeben sind (das sind sie in diesem Fall durch die Zeichnung), so kann der Winkel per Cosinussatz bestimmt werden.
Cosinussatz lautet:

[math] c^2 = a^2 + b^2 – 2ab*\cos(w) [/math]

Arbeiten wir mit Vektoren und nicht mit den Seitenlängen, so kann man immer noch auf den Cosinussatz zurückgreifen, in dem man die Seitenlängen durch die Beträge der jeweiligen Vektoren ersetzt.

Winkel bestimmen
Winkel bestimmen

Anstatt Geradenlängen nehmen wir die Längen der Vektoren. Dann sieht der Cosinussatz folgendermaßen aus:

[math] \left|\vec{c}\right|^2 = \left|\vec{a}\right|^2 + \left|\vec{b}\right|^2 – 2* \left|\vec{a}\right|* \left|\vec{b}\right|*\cos(w)[/math]

Durch die Beziehung [math] \left|\vec{v}\right|^2 = \vec{v} * \vec{v}[/math] bekommen wir

[math] \vec{c} * \vec{c} = \vec{a}*\vec{a} + \vec{b}*\vec{b} – 2* \left|\vec{a}\right|* \left|\vec{b}\right|*\cos(w)[/math]

Da wir mit Vektoren arbeiten, können wir den Vektor [math] \vec{c}[/math] durch [math] \vec{b} – \vec{a} [/math] ersetzen (siehe Subtraktion).

[math] (\vec{b} – \vec{a}) * (\vec{b} – \vec{a}) = \vec{a}*\vec{a} + \vec{b}*\vec{b} – 2* \left|\vec{a}\right|* \left|\vec{b}\right|*\cos(w)[/math]

Jetzt werden die beiden Klammern ausmultipliziert (binomische Formel).

[math] \vec{b}*\vec{b} – 2*\vec{a}*\vec{b} + \vec{a}*\vec{a}= \vec{a}*\vec{a} + \vec{b}*\vec{b} – 2* \left|\vec{a}\right|* \left|\vec{b}\right|*\cos(w)[/math]

Wir vereinfachen in dem wir auf beiden Seiten der Gleichung [math] \vec{b}*\vec{b}[/math] und [math] \vec{a}*\vec{a}[/math] abziehen.

[math] – 2*\vec{a}*\vec{b} = – 2* \left|\vec{a}\right|* \left|\vec{b}\right|*\cos(w)[/math]

Jetzt noch durch -2 teilen und schon haben wir die Definition der Skalarmultiplikation.

[math] \vec{a}*\vec{b} = \left|\vec{a}\right|* \left|\vec{b}\right|*\cos(w)[/math]


Anwendung

a)
Wie schon bereits erwähnt, hilft uns das Skalarprodukt auf eine unkomplizierte Weise den Winkel zwischen zwei Vektoren zu bestimmen.

[math] cos( \measuredangle{( \vec{a},\vec{b})}) = \frac{\vec{a} * \vec{b}} { \left|\vec{a}\right| * \left|\vec{b}\right| } [/math]

Rechnen wir ein Fallbeispiel durch.
Es sind zwei Vektoren [math] \vec{a} = \left(\begin{array}{c} 3 \\ 4 \end{array}\right) [/math] und [math] \vec{b} = \left(\begin{array}{c} 5 \\ 0 \end{array}\right) [/math] gegeben. Berechnen Sie den Winkel w.

Winkel bestimmen
Winkel bestimmen

[math] cos(w) = \frac{\vec{a} * \vec{b}} { \left|\vec{a}\right| * \left|\vec{b}\right| } [/math]

[math] cos(w) = \frac{ \left(\begin{array}{c} 3 \\ 4 \end{array}\right) * \left(\begin{array}{c} 5 \\ 0 \end{array}\right) }
{ \left|\left(\begin{array}{c} 3 \\ 4 \end{array}\right)\right| * \left|\left(\begin{array}{c} 5 \\ 0 \end{array}\right)\right| } [/math]

[math] cos(w) = \frac{3*5 + 4*0} { \sqrt{3^2 + 4^2}*\sqrt{5^2 + 0^2} } [/math]

[math] cos(w) = \frac{15} { \sqrt{25}*\sqrt{25} } [/math]

[math] cos(w) = \frac{15} {25} [/math]

[math] cos(w) = 0.6 [/math]

Jetzt wird die Gegenoperation von Kosinus – der Akuskosinus – angewendet.

[math] w = \arccos(0.6) [/math]

[math] w = 53,13^\circ [/math]

Schön oder? Doch es kommt noch besser.

b)

Sind zwei Vektoren orthogonal zu einander, so ist das Skalarprodukt dieser Vektoren gleich Null. Das ist nicht weiter verwunderlich denn, der Kosinus von 90° ist gleich Null und somit der ganze Term.

[math] \vec{a} * \vec{b} = \left|\vec{a}\right| * \left|\vec{b}\right| * cos( w ) [/math]

[math] \vec{a} * \vec{b} = \left|\vec{a}\right| * \left|\vec{b}\right| * cos( 90^\circ ) [/math]

[math] \vec{a} * \vec{b} = \left|\vec{a}\right| * \left|\vec{b}\right| * 0 [/math]

[math] \vec{a} * \vec{b} = 0 [/math]

Dazu ein Beispiel:

Rechter Winkel
Rechter Winkel

[math] \vec{a} * \vec{b} =\left(\begin{array}{c} 4 \\ 0 \end{array}\right) * \left(\begin{array}{c} 0 \\ 4 \end{array}\right) [/math]

[math] \vec{a} * \vec{b} = 4*0 + 0*4 [/math]

[math] \vec{a} * \vec{b} = 0 \Rightarrow \vec{a} \perp \vec{b}[/math]

Das ist eine super einfache Rechnung um Orthogonalität zu überprüfen, vor allem, wenn es nicht mit so runden Zahlen wie in dem Beispiel gearbeitet wird.


Kreuzprodukt

WIRD FORTGESETZT


Quellen

http://de.wikipedia.org/wiki/Kartesisches_Koordinatensystem
http://matheplanet.com/matheplanet/nuke/html/article.php?sid=1010
http://de.wikipedia.org/wiki/Skalar_%28Mathematik%29
http://www.mathe-online.at/mathint.html
http://de.wikipedia.org/wiki/Skalarprodukt
http://de.wikipedia.org/wiki/Kreuzprodukt

Eigene Schulunterlagen.

Alle Zeichnungen wurden mit Hilfe von TTGeo 2 erstellt und mit Paint.NET bearbeitet.

5 Gedanken zu „Mathematik für Spieleprogrammierer: Vektoren“

  1. Das ist alles ganz super beschrieben aber ich kapiere trotzdem nicht wie ich das praktisch anwenden kann. Bspw. um den Austrittswinkel eines Balls zu berechnen der auf eine schiefe Ebene trifft. Der Vector des Balls hat nunmal nicht den Urprung 0,0 und die Ebene hat auch einen anderen Ursprung.

  2. Die Vektoren sind nicht an einen Ursprung gebunden (außer in speziellen Fällen). Sie zeigen nur eine Richtung und einen Betrag an. Für eine schiefe Ebene kannst du den Normalenvektor berechnen und daraus nach Einfallswinkel=Ausfallwinkel den Ausfallwinkel berechnen. Wenn dieser Bekannt ist, musst du dann deinen Bewegungsvektor des Balls drehen.
    Es geht über den Rahmen dieses Artikels hinaus, aber dies hier ist die Basis.

  3. Ich sehe nicht wo hier ein Vektor gegeben ist der woanders hinzeigt als weg von 0, 0 … entschuldige dass ich so unbedarft bin, aber Mathematik allgemein bereitet mir schon Kopfschmerzen wegen des immer fehlenden „Warum“, aber Vektoren machen mich irre. Ein Vektor (3, 5) ist ein Punkt an x=3, y=5 … die Richtung ist weg von 0, 0. Wie kann ein Vektor einen anderen Ursprung haben?

  4. „Ein Vektor (3, 5) ist ein Punkt an x=3, y=5 … die Richtung ist weg von 0, 0. Wie kann ein Vektor einen anderen Ursprung haben?“
    Nein, eben nicht. Das ist spezieller Vektor – ein Ortsvektor. Ein Vektor (3,5) hat erst mal keinen Ursprung, sondern nur eine Richtung. Wenn du sagen wir einen Ball an der Position (5,5) hast und dein Geschwindigkeitsvektor (1,2) pixel/s beträgt, dann heißt es, dass dein Ball von der Position (5,5) in der ersten Sekunde an die Position (5,5)+(1,2) = (6,7) fliegt. In der nächsten Sekunde fliegt er von (6,7) nach (6,7)+(1,2) = (7,9) usw. Wie du siehst spielt hier der Ursprung überhaupt keine Rolle.

    Sagen wir an der Position (7,9) ist jetzt auch die Wand, dann musst schauen wie der Vektor (1,2) im Bezug zum Normalenvektor (der steht senkrecht auf der Ebenenfläche und absolut ursprungsunabhängig) steht. Du musst also den Winkel zwischen den beiden Vektoren ausrechnen (siehe oben). Sagen wir der Winkel wäre 0, also fliegt der Ball genau in die entgegengesetzte Richtung. Um das umzusetzen musst du den Geschwindigkeitsvektor umdrehen, also mit -1 multiplizieren.

  5. Also ist die Position des Balls gar kein Vektor sondern nur ein Punkt und der Geschwindigkeitsvektor bestimmt alles. So muss ich „nur“ die Normale der Kollisionsebene berechnen und normalisieren? *phew*, da muss ich noch viel lernen ;)

    Vielen Dank für die erhellenden Antworten und ein frohes Weihnachtsfest!

Schreibe einen Kommentar