Ich versuche, die Vektorarithmetik (und insbesondere ihre Verwendung in der Unity-Engine) zu verstehen. Ich kann nicht herausfinden, wie ein Vektor eine Länge (Größe) haben kann, obwohl er nur einen Punkt (Position und Richtung) darstellt.
Bedeutet das, dass die Größe einfach die Entfernung vom Ursprungspunkt (0, 0, 0) ist? Oder vermisse ich etwas?
Normalized
Im Kontext bedeutet dies, dass ein neuer Vektor denDirection
WertMagnitude
1 beibehält. Das heißt, derNormalized
Vektor wird durch Skalieren des ursprünglichen Vektors erstellt.Antworten:
Die tl; dr Antwort kann sein: Ja, man es so vorstellen kann.
Ich bin mir aber nicht sicher, ob dies nicht zu einem falschen Verständnis führen könnte.
Ein Vektor ist kein Punkt und es gibt einen entscheidenden Unterschied zwischen den beiden!
Die Tatsache, dass ein Vektor normalerweise als "Pfeil" dargestellt wird, kann einen falschen Eindruck erwecken. Ein Vektor ist in der Tat kein einzelner Pfeil. Genauer gesagt ist ein Vektor die Menge aller Pfeile, die dieselbe Länge und Richtung haben . (Der normalerweise gemalte Pfeil ist nur ein Vertreter all dieser Pfeile.) Aber ich möchte hier nicht zu weit in die langweiligen Details der Mathematik gehen.
Noch wichtiger ist, dass es einen entscheidenden Unterschied zwischen einem Punkt und einem Vektor gibt, der bei der Grafikprogrammierung beim Transformieren des Punkts oder Vektors deutlich wird. Unity ist mir nicht vertraut, aber ausgehend von einem kurzen Blick in die Dokumentation modellieren sie den wichtigsten Unterschied zwischen einem Punkt und einem Vektor in der
Matrix4x4
Klasse. Es hat zwei verschiedene Funktionen:Matrix4x4.MultiplyVector
undMatrix4x4.MultiplyPoint
Der Unterschied besteht grob gesagt darin, dass ein Vektor nicht übersetzt wird, wohingegen ein Punkt übersetzt wird. Stellen Sie sich die folgende 4x4-Matrix vor:
Es beschreibt eine Übersetzung über (1,2,3). Nun, wenn Sie den folgenden Pseudocode haben
Dann
tp
wird (3,4,5) sein, wohingegentv
(2,3,4) noch sein wird. Das Verschieben eines Vektors ändert ihn nicht (da es sich, wie oben erwähnt, um die Menge aller Pfeile mit der gleichen Größe und Richtung handelt).Die Tatsache, dass Unity die
Vector3
Klasse sowohl für Vektoren als auch für Punkte verwendet, ist legitim, kann jedoch verwirrend sein. Andere Bibliotheken unterscheiden gezielt zwischenPoint3D
undVector3D
, manchmal mit einer gemeinsamen Basis wieTuple3D
.quelle
A vector is, in fact, not a single arrow
Sie haben Recht, Vector3 als einen einzigen Pfeil darzustellen ist genau das, was mich verwirrt hat. +1 für das Erwähnen dieses kritischen Satzes.vector
Array" oder "Multiple" in der Informatik verwendet wird. In C ++ können Siestd::vector<Vector3>
zum Beispiel eine haben. Avector
vonVector
s.Das ist genau das.
Ein Vektor kann unter anderem je nach Kontext einen Punkt (eine Position), eine Richtung und / oder eine Geschwindigkeit darstellen.
Wenn Sie diese Variable haben:
Es repräsentiert im Allgemeinen nur die Position, dh wo es sich im 3D-Raum befindet.
Wenn Sie diese Variable haben:
Es repräsentiert im Allgemeinen die Richtung. Typischerweise sind diese Vektoren Einheitsvektoren, dh Vektoren der Länge 1 (dies wird jedoch nicht immer benötigt). Ein Einheitsvektor und ein normalisierter Vektor sind dasselbe, sie haben beide die Länge 1. Diese Vektoren werden oft zusammen mit anderen Vektoren verwendet, um ihre Position zu ändern.
Wenn Sie einen Vektor normalisieren, verlieren Sie seine Länge (seine Größe), aber die Richtung bleibt gleich. Es gibt Situationen, in denen Sie nur die Richtung benötigen (z. B. wenn Sie ein Objekt in diese Richtung bewegen möchten) und die Größe (ohne Einheitslänge) im Vektor zu unerwarteten Berechnungsergebnissen führen würde.
Wenn Sie einen normalen Vektor für eine einzelne Berechnung benötigen, den Sie verwenden können
myVec3.normalized
, hat dies keine AuswirkungenmyVec3
. Wenn Sie diesen normalisierten Vektor häufig verwenden möchten, sollten Sie wahrscheinlich eine Variable erstellen:um wiederholte Aufrufe der
normalized
Methode zu vermeiden .Und wenn Sie Variablen sehen:
Es stellt im Allgemeinen eine Kraft / Geschwindigkeit dar: Diese Vektoren stellen eine Richtung dar und ihre Größe (ihre Länge) ist wichtig. Sie könnten auch mit
Vector3 mDirection;
und a vertreten seinfloat mSpeed;
.Alle diese werden im Hinblick auf ihre lokale Herkunft verwendet, die (0, 0, 0) oder eine andere Position sein kann.
quelle
myVec3.normalized
ein neuer Vector3 mit der gleichen Richtung, aber der Stärke 1 zurückgegebenmyVec3
wirdthese vector are unit vectors
zu ,direction vectors are unit vectors
oder was? Denn so wie es jetzt ist, kann ein Leser verwirrt denken, dasthese
sich auf die beiden vorhergehenden Beispiele bezieht,mPosition
undmDirection
. (So habe ich es zuerst gelesen.)Du können es so sehen, aber nur so kann zu einem falschen Verständnis führen.
Erstens ist ein Vektor kein Punkt, und ein Punkt ist kein Vektor.
Der Unterschied zwischen einem Vektor und einem Punkt ist der gleiche wie zwischen einer Dauer und a Tageszeit . Ersteres ist ein Zeitintervall, letzteres ist ein einzelner Zeitpunkt. Es ist offensichtlich, dass 6 Stunden nicht gleich 6 Uhr sind. Sie würden nicht sagen "Das Rennen dauert 1 Uhr" und Sie würden auch nicht sagen "Treffen wir uns um 13 Uhr". Das Rennen dauert eine Stunde - eine Pause - und Sie treffen sich um 13 Uhr - zu einem bestimmten Zeitpunkt.
Gleiches gilt für Vektoren und Punkte. Ein Vektor ist ein Intervall - eine Verschiebung, wenn Sie so wollen. Es zeigt in eine bestimmte Richtung und ja, es hat eine Länge.
Punkte und Vektoren stehen daher in Beziehung zueinander, ebenso wie die Dauer und die Tageszeit. Das Rennen beginnt um 13 Uhr und endet um 15 Uhr. Beides sind Zeitpunkte. Aber 15 Uhr - 13 Uhr = 2 Stunden, eine Dauer. Das Rennen dauert zwei Stunden, nicht 2 Uhr.
Gleiches gilt für Punkte. Die Differenz zwischen Punkt A und B wird als ⃗v = B - A bezeichnet, wobei ⃗v einen Vektor bezeichnet und A und B Punkte bezeichnet.
Nun gibt es etwas, das als Positionsvektor bezeichnet wird . Sie können einen Vektor bis zu einem gewissen Grad als Punkt betrachten, wenn Sie sagen, dass die Vektoren vom Ursprung zu einem bestimmten anderen Punkt zeigen. Mit anderen Worten: Wenn alle Ihre Freunde wissen, dass Sie Tageszeiten als Dauer seit Mitternacht (0 Uhr) angeben, können Sie sagen: "Wir treffen uns um 6 Uhr". Sie würden wissen, dass 0 Uhr + 6 Stunden = 6 Uhr und daher, wann Sie zu treffen sind. Dies ist in der Tat, was die Seezeiten tun. "Wir treffen uns um sechshundert Uhr" bedeutet 6 Uhr.
Der Vektor <1,2,3> zeigt also auf den Punkt (1,2,3), wenn Sie den Ursprung als Ankerpunkt betrachten, und ja, die Länge dieses Vektors ist der Abstand dieses Punkts vom Ursprung.
Der Vektor <1,2,3> zeigt aber auch von (1,1,1) nach (2,3,4), und in diesem Fall bezeichnet seine Länge den Abstand zwischen diesen beiden Punkten.
Wie Sie sehen, hat ein Vektor eine Länge, da er kein Punkt, sondern ein Intervall ist - eine Verschiebung.
quelle
Ein Vektor kann eine Linie zwischen zwei Punkten im 3D-Raum (Richtung und Entfernung) oder eine Position im 3D-Raum (Länge ist die Entfernung vom Ursprung) darstellen.
Wenn Sie Punkt A und Punkt B haben, dann ist BA = AB = die Richtung und Entfernung, die Sie zurücklegen müssten, um von A nach B zu gelangen.
quelle
Returns this vector with a magnitude of 1
Zerstört das nicht die im Vektor gespeicherten Informationen? eigentlich dasMagnitude
undNormalized
was hat mich verwirrt.Was Unity über Punkte im Vergleich zu Vektoren sagt, ist auf lange Sicht bedeutungslos, da Geometrie-APIs nur bestimmte Definitionen auswählen, um den Zugriff auf das Werkzeug zu erleichtern. Schauen Sie sich die Implementierungen der Klassen an, wenn Sie können. Weil es willkürlich ist, zu wissen, wie es definiert ist, ist die einzige Möglichkeit, das Konzept zu verstehen. Vollständige Offenlegung, ich habe keine Erfahrung mit Unity.
Ein Vektor ist ein Punkt in einem Vektorraum , indem das Konzept eines Punkts in der Geometrie durch Elemente der zugrunde liegenden Menge codiert wird. Ein Vektorraum hat einen definierten Vektor, der als Ursprung oder 0 bezeichnet wird . Die lineare Algebra ist ein Versuch, ein Fragment der euklidischen Geometrie mit einem Ursprung algebraisch zu codieren.
Der Pfeil und seine Länge
Bewegungen über einen Raum von Punkten werden häufig als alle Pfeile von den Quell- / Vorher-Punkten zu ihren Ziel- / Nachher-Punkten interpretiert .
Eine Funktion von zwei Argumenten kann auf ein Argument angewendet werden, um eine Funktion von einem Argument zu erzeugen - wir können von x + sprechen , der Funktion, die jeden Vektor y zum Vektor x + y führt . Dies ist die mit x verbundene Übersetzung . Die zugehörigen Pfeile verlaufen von Punkt y zu Punkt x + y . Siehe: Teilbewerbung , Currying .
Also warum verwenden wir nur den einen Pfeil ? Der Pfeil vom Ursprung zeigt auf einen bestimmten Vektor, das x in x + - der Ursprung ist die Identität der Vektoraddition. Wir können also die Übersetzung x + nur aus ihrem Wert x +0 = x wiederherstellen .
Als grafische Darstellung des Raums hat die Pfeildarstellung mit unserer Fähigkeit zu tun, den Effekt einer Übersetzung aus dem sie bestimmenden Wert visuell oder physikalisch zu extrapolieren. Wann haben wir diese Fähigkeit?
Um dem Vektorraum eine Norm zu geben, die ihn zu einem normierten Vektorraum macht, muss ein Begriff der Länge eines Vektors angegeben werden, der als Abstand von 0 sinnvoll ist starke Einschränkung, wie sich die Längen zweier Vektoren auf die ihrer Summe beziehen. Ausgehend von der Länge können wir die Entfernung definieren , um daraus einen metrischen Raum zu machen , und eine Geodätische ist ein Pfad, der an sich gerade ist und so kurz wie möglich ist. Die euklidische Norm induziert eine euklidische Distanz und die Geodäten sind die Liniensegmente der Pfeile, wenn Sie die Pfeile jedoch als Geodäten zeichnen unterschiedlichen Normenkönnen Sie den geometrischen Effekt der Übersetzung aus der Geodätik extrapolieren, um mehr über die Geometrie zu erfahren.
Die Bedeutung von Punkt und Vektor
In einigen Fällen ist beim Ausführen von Spielegeometrie der Punktebereich kein Vektorbereich . Ein affiner Raum der Dimension n kann in einen projektiven Raum der Dimension n eingebettet werden . Affine Maps reduzieren sich auf Projektivitäten. Projektivitäten lassen Sie auch FOV tun, w / c denke ich, ist nicht affin. Projektivitäten haben Vorteile:
Der projektive n- Raum über einem Feld kann aus dem linearen ( n + 1) -Raum (Vektorraum) konstruiert werden , indem die Punkte des projektiven Raums als Linien durch den Ursprung des linearen Raums behandelt werden. Ebenen durch den Ursprung geben wiederum projektive Linien. Das Multiplizieren von Vektoren mit einer festen Matrix ist eine lineare Abbildung . Dies ist der Zweck der Matrixmultiplikation. Lineare Karten behalten den Ursprung bei und sind mit der Inzidenz kompatibel. Insbesondere wenn f ein linearer Automorphismus ist ( entsprechend einer invertierbaren ( n + 1) x ( n + 1) Matrix) und zwei Linien L, M durch den Ursprung eine Ebene A überspannen , dannf L, f Msind Linien durch den Ursprung, die f A überspannen , so dass f auch den Einfall auf den projektiven Raum beibehält - eine invertierbare Matrix hat eine zugehörige Projektivität. Die Matrixmultiplikation codiert die Zusammensetzung der linearen Abbildungen und damit der Projektivitäten.
Wenn Sie den Ursprung aus dem linearen Raum entfernen, sind alle Punkte auf einer bestimmten Linie durch den Ursprung skalare Vielfache voneinander. Unter Ausnutzung dieser Tatsache wählt die Homogenisierung einen linearen Punkt für jeden Projektionspunkt und eine invertierbare Matrix für jede Projektionstransformation (wie in diesem 2D -> 2D affinen Karten als 3D -> 3D linearen Kartenvideo ) Art und Weise, dass die Vertreter unter Matrix-Matrix- und Matrix-Vektor-Produkten geschlossen sind und durch einzigartige projektive Dinge geben und gegeben sind. Diese Beschreibung der Konstruktion der projektiven Ebene aus der linearen Ebene verbindet einige Dinge miteinander.
In der Modellansicht-Projektionsmatrix-Pipeline verwenden wir Vektoren, um die Punkte unseres projektiven Raums darzustellen, aber der projektive Raum ist kein Vektorraum, und nicht alle Vektoren im Vektorraum, den wir verwenden, repräsentieren Punkte unserer Geometrie (siehe Bild der affinen Ebene rechts ). Wir verwenden Übersetzungsmatrizen anstelle von Vektorsummen, wenn wir Übersetzungen wünschen. Manchmal werden projektive oder affine Punktvektoren genannt, insbesondere wenn ein Setup in diesem Sinne verwendet wird.
quelle
Die Länge (oder Größe) des Vektors ist
square root of (x*x+y*y+z*z)
. Vektoren werden immer als Strahlen betrachtet, die vom Ursprung<0,0,0>
durch den im Vektor beschriebenen Punkt verlaufen<x,y,z>
Die Unity-Dokumentation dazu finden Sie hier .
quelle