Die Vektor-Funktionen arbeiten mit dreidimensionalen Vektoren, d. h. mit Gruppen von 3 Zahlen (s.u.). Vekroren werden für unterschiedliche Zwecke verwendet, meist zum Beschreiben einer x-, y-, z-Position, einer Richtung oder Geschwindigkeit, sowie einer Blau-Grün-Rot-Farbe (blue green red) oder einem pan tilt roll-dreidimensionalen Euler-Winkel.
Jeder var-Array der Länge 3, sowie jedwede drei aufeinanderfolgenden Skills oder var-Parameter eines Objektes lassen sich als Vektor verwenden. Um beispielsweise die x-, y-, z-Parameter der my-Entity als Positions-Vektor zu verwenden, übergeben Sie der Vektor-Funktion einfach my.x. Gültige Vektor-Parameter sind demnach
Wird dann, wenn ein Vektor erwartet wird, irgend etwas anderes gegeben, kann dies einen Engine-Absturz zur Folge haben - die Gültigkeit von Vektoren wird aus Geschwindigkeitsgründen nicht geprüft.
V = [e1, e2, e3, ..., en]
Am Besten stellt man sich einen Vektoren als einen Pfeil vor, siehe Figur unten. Als Programmierer können Sie sich einen Vektoren auch als einen aus Zahlen bestehenden Array vorstellen.
Graphische Darstellung von ein paar 2D-Vektoren.
A = [2, 2]
B = [1, -3]
C = [2, 2]
Beachten Sie, daß Vektor A und Vektor C dasselbe
sind, denn sie haben dieselbe Größe und Richtung. Ein Vektor wird NICHT durch
seinen
Startpunkt definiert,
in Wahrheit hat er gar keinen.
Die Anzahl der Elemente eines Vektors kennt man auch als seine Dimension. Ein Vektor kann jedwede Dimension haben, in der Graphik-Programmierung verwenden wir aber meist 3D- und 4D-Vektoren. Für die folgenden Beispiele jedoch, werde ich meist 2D-Vektoren verwenden, denn die sich vorzustellen, ist einfacher.
Der oben beschriebene Vektor ist ein Räumlicher. Vektoren werden auch zum Speichern von Farben (Rot, Grün, Blau), Winkel (pan, tilt, roll) oder Positionen (die im Grunde Richtungsvektoren sind, welche im Ursprung starten) verwendet.
A = [3, 1]
B = [0, 2]
A + B = [3 + 0, 1 + 2] = [3, 3]
Das Addieren zweier Vektoren resultiert in einem dritten Vektor, der beide
Verschiebungen einschließt.
A = [-3, 2]
B = [2, 3]
A B = [(-3) - 2, 2 - 3)] = [-5, -1]
Das Substrahieren zweier Vektoren resultiert in einem dritten Vektor, der
vom Endpunkt des zweiten Vektoren zum Entpunkt des ersten Vektoren zeigt. Das
wird oft in Shadern verwendet, um einen Richtungsvektoren zwischen zwei Punkten
zu erhalten.
A = [3, 5, 1]
B = [2, 2, 3]
A * B = [3 * 2, 5 * 2, 1 * 3] = [6, 10, 3]
Die Multiplikation zweier Vektoren wird in der Vektoren-Mathematik selten benutzt, ziemlich oft finden Sie aber die Multiplikation eines Vektors mit einer Matrix womit wir uns später befassen.
|V| = square-root ((Vx)2 + (Vy)2 + (Vz)2)
Ein Vektor des Umfanges 1 wird Einheitsvektor (unit vector) genannt (s. unten).
A = [2, 1]
B = 2 * A = [4, 2]
C = -0.5 * A = [-1, -0.5]
Das Multiplizieren eines Vektoren mit einem Skalar ändert nur die Größe des
Vektors. Ist der Skalar negativ, wird auch der Vektor umgekehrt.
A = [1, 1]
B = [0.71, 0.71]
C = [1, 0]
|A| = square-root(12 + 12) = 1.41,
A ist somit KEIN Einheitsvektor.
|B| = square-root(0.712, 0.712) = 1,
B ist also ein Einheitsvektor.
|C| = square-root(12, 02) = 1, C ist
somit ein Einheitsvektor.
Für viele Berechnungen in Beleuchtungsalgorithmen müssen die Vektoren Einheitsvektoren
sein. Normale beispielsweise - die seknrecht zu einer bestimmten Oberfläche stehen - sind immer Einheitsvektoren. Sie können einen beliebigen Vektoren in einen Einheitsvektor konvertieren,
das nennt man dann Normalisierung. Um einen Vektoren zu normalisieren,
müssen Sie jede Komponente des Vektoren durch seine Länge dividieren. Beispiel:
V = [4, 4]
|V| = square-root(42 + 42) = square-root(32) = 5.66
Vnormalized = [4 / 5.66, 4 / 5.66] = [0.71, 0.71]
And to prove that it's actually normalized:
| Vnormalized | = square-root(0.712 + 0.712) = 1
A · B = |A| * |B| * cos(A,B)
Das Punktprodukt ist die Länge von Vektor A multipliziert
mit der Länge von Vektor B, multipliziert mit dem Cosinus
des Winkels zwischen A und B. Da wir beim
Shader-Programmieren für gewöhnlich den Winkel zwischen A und B nicht kennen,
ist dies für uns von wenig Nutzen. Glücklicherweise gibt es einen anderen Weg,
das Punktprodukt zu berechnen:
A · B = Ax * Bx + Ay * By + Az * Bz
Das Punktprodukt ist dasselbe wie die Summe sämtlicher miteinander multiplizierter Vektorenkomponenten. Um den Winkel zwischen A und B herauszufinden, dividieren wir diesen Wert einfach durch das Produkt von |A| und |B|. Im Falle von normalisierten Vektoren ist das Punktprodukt gleich dem Cosinus des Winkels zwischen A und B, denn |A| und|B| sind beide 1.
A x B = |A| * |B| * sin(A,B) * N
wo N der Einheitsvektor und senkrecht zu A und B ist. Wir wissen für gewöhnlich den Winkel zwischen A und B nicht, aber wieder gibt es einen anderen Weg, auch das Kreuzprodukt zu berechnen.
A x B = [Ay * Bz - Az * By, Az * Bx - Ax * Bz, Ax * Cy - By * Bz]
In Shadern wird das Kreuzprodukt normalerweise zum Finden des Vektoren der dritten Achse eines Koordinatensystems benutzt, wenn die beiden anderen Vektoren bekannt sind. Die Reihenfolge der zu multiplizierenden und abzuziehenden Komponenten läßt sich durch die Regel "xyzzy" merken (x Komponente des Ergebnisses = Ay * Bz - Az * By).
(Einweisung und Bilder aus dem Shader-Workshop von Taco Cohen)