Wenn ein 3D-Vektor einen Punkt darstellt, wie kann er eine Länge haben?


27

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?


14
Stellen Sie sich einen Skalar vor, der auch als Zahl bezeichnet wird. Dies kann einen absoluten Wert, eine Differenz, einen Prozentsatz usw. bedeuten.
Peter

1
NormalizedIm Kontext bedeutet dies, dass ein neuer Vektor den DirectionWert Magnitude1 beibehält. Das heißt, der NormalizedVektor wird durch Skalieren des ursprünglichen Vektors erstellt.
Theraot

@ Theraot, vielen Dank, dieser Satz hat mir sehr geholfen!
Mohammed Noureldin

19
Das tut es nicht. Es stellt eine Verschiebung dar. Es ist nur Punkte bis zu einem gewissen Punkt , wenn Sie ihm ein betrachten Positionsvektor , in welchem Fall es um die Verschiebung von bezeichnet (0, 0, 0). Die Länge eines solchen Positionsvektors ist der Abstand des Punktes zum Ursprung.
Polygnome

1
@ Peter Ich fürchte, ich muss mit dir nicht einverstanden sein. Standard-Algebraische Definitionen eines Vektors bedeuten so ziemlich, dass es kein Punkt ist. Es ist oft nützlich, es als solches zu betrachten, da Positionsvektoren verwendet werden können, um Punkte darzustellen , aber sie sind keine Punkte. "5 meter" ist immer eine Entfernung (oder Länge), es wird niemals eine Zeit oder Farbe sein. Es ist oft nützlich, verschiedene Symbole zu verwenden - ich persönlich würde niemals (5, 5, 5) verwenden, um einen Vektor zu bezeichnen , ich würde immer (5, 5, 5) ^ T (T für transponiert) verwenden oder die richtige Spaltendarstellung verwenden wo unterstützt. Da ein Vektor sagen , ist ein Punkt einleitet Ungenauigkeiten.
Polygnome

Antworten:


20

Bedeutet das, dass die Größe einfach der Abstand vom Ursprungspunkt (0, 0, 0) ist?

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 Matrix4x4Klasse. Es hat zwei verschiedene Funktionen:

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:

1.0   0.0   0.0   1.0
0.0   1.0   0.0   2.0
0.0   0.0   1.0   3.0
0.0   0.0   0.0   1.0

Es beschreibt eine Übersetzung über (1,2,3). Nun, wenn Sie den folgenden Pseudocode haben

Vector3 tp = matrix.MultiplyPoint (new Vector3(2,3,4));
Vector3 tv = matrix.MultiplyVector(new Vector3(2,3,4));

Dann tpwird (3,4,5) sein, wohingegen tv(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 Vector3Klasse sowohl für Vektoren als auch für Punkte verwendet, ist legitim, kann jedoch verwirrend sein. Andere Bibliotheken unterscheiden gezielt zwischen Point3Dund Vector3D, manchmal mit einer gemeinsamen Basis wie Tuple3D.


3
Sind Sie sicher, dass "ein Vektor die Menge aller Pfeile ist, die die gleiche Länge und Richtung haben", mathematisch sinnvoll ist? Klingt so, als würden Sie von Äquivalenzklassen sprechen, aber Vektorräume habe ich noch nie als Äquivalenzklassen definiert. - Wie auch immer, Sie heben einen sehr wichtigen Punkt hervor , und zwar mit der Unterscheidung zwischen Vektorräumen und affinen Räumen , die die mathematischen Namen für die Typen aller Vektoren bzw. aller Punkte sind.
linksum

3
A vector is, in fact, not a single arrowSie haben Recht, Vector3 als einen einzigen Pfeil darzustellen ist genau das, was mich verwirrt hat. +1 für das Erwähnen dieses kritischen Satzes.
Mohammed Noureldin

@leftaroundabout Es gibt verschiedene mögliche Definitionen für Vektoren (abgesehen davon, dass es sich um "irgendein n-Tupel ..." handelt). Stellen Sie sich in der linearen Algebra die Menge aller Pfeile und die (Äquivalenz! -) Beziehung "Hat die gleiche Länge und Richtung" vor. Die Faktorisierung der Menge aller Pfeile durch diese Beziehung ergibt die Äquivalenzklassen. Ich wollte mich nicht mit mathematischen Detials auseinandersetzen (ich bin auch kein Mathematiker), wollte aber klarstellen, dass ein Vektor nicht "ein Pfeil ist, der bei (0,0,0) beginnt". Der Punkt (...) ist: Ein Vektor hat keine "Position".
Marco, 13.

2
Es wird noch komplizierter, wenn der Begriff " vectorArray" oder "Multiple" in der Informatik verwendet wird. In C ++ können Sie std::vector<Vector3>zum Beispiel eine haben. A vectorvon Vectors.
user1118321

Ah, Sie meinen also, ausgehend von einem affinen Raum X , für zwei beliebige Punkte ( p , q ) einen Pfeil sA ( X ) als den kürzesten Weg (dh differenzierbare Funktion mit minimaler integrierter absoluter Ableitung) s : [0,1] → X derart , dass s (0) = p und s (1) = q . Dann ist der Raum der Vektoren die Menge der Äquivalenzklassen A ( X ) / ~ wobei s ~ σ ist, wenn ∂ s / ∂ t = ∂ σ ist/ ∂ t für alle t ∈] 0,1 [? Das ist sinnvoll, obwohl ich glaube, dass Sie dies nicht als Definition von Vektoren verwenden können, da die Unterscheidung bereits von ihnen abhängt.
linksum

36

Bedeutet das, dass die Größe einfach der Abstand vom Ursprungspunkt (0, 0, 0) ist?

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:

Vector3 mPosition;

Es repräsentiert im Allgemeinen nur die Position, dh wo es sich im 3D-Raum befindet.

Wenn Sie diese Variable haben:

Vector3 mDirection;

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 Auswirkungen myVec3. Wenn Sie diesen normalisierten Vektor häufig verwenden möchten, sollten Sie wahrscheinlich eine Variable erstellen:

Vector3 myVec3Normalized = myVec3.normalized;

um wiederholte Aufrufe der normalizedMethode zu vermeiden .

Und wenn Sie Variablen sehen:

Vector3 mVelocity;

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 sein float mSpeed;.

Alle diese werden im Hinblick auf ihre lokale Herkunft verwendet, die (0, 0, 0) oder eine andere Position sein kann.


4
Es zerstört einen Teil der im Vektor enthaltenen Informationen, und diese Informationen sind die Größe. Die Richtung bleibt jedoch gleich.

6
@Eldy Es ist genauer zu bemerken, dass myVec3.normalizedein neuer Vector3 mit der gleichen Richtung, aber der Stärke 1 zurückgegeben myVec3wird
Caleth

4
@ NPSF3000 Das wäre ein Ruck und ein Ruck , über Namen darüber hinaus besteht kein Konsens. Wir sind alle froh, dass Idioten nicht häufig sind.
Theraot

1
@ NPSF3000 Einige schlagen vor, dass die 4., 5. und 6. Ableitung der Position Knacken, Knistern und Knallen sein sollte! :-D en.wikipedia.org/wiki/Snap,_Crackle_and_Pop#Physics
gbmhunter

1
Vielleicht ändern these vector are unit vectorszu , direction vectors are unit vectorsoder was? Denn so wie es jetzt ist, kann ein Leser verwirrt denken, das thesesich auf die beiden vorhergehenden Beispiele bezieht, mPosition und mDirection . (So ​​habe ich es zuerst gelesen.)
31.

8

Bedeutet das, dass die Größe einfach der Abstand vom Ursprungspunkt (0, 0, 0) ist?

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.


Related reading: Torsors
Buster

5

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.


Vielen Dank, aber was bedeutet es dann, Vector3.Normalized zu verwenden? In der Dokumentation heißt es also: Returns this vector with a magnitude of 1Zerstört das nicht die im Vektor gespeicherten Informationen? eigentlich das Magnitudeund Normalizedwas hat mich verwirrt.
Mohammed Noureldin

Ob es ein Punkt im Raum oder ein Pfeil ist, der die Geschwindigkeit anzeigt, ist alles in deinem Kopf. Die gleichen Daten stehen für beide.
Omnifarious

@MohammedNoureldin Ein normalisierter Vektor hat eine Längeneinheit (dh 1). Ja, wenn Sie einen Vektor normalisieren, verlieren Sie die Längen- oder Größeninformationen. Wenn Sie beide benötigen (in vielen Fällen nützlich), ermitteln Sie die Länge des Vektors und normalisieren Sie ihn.
Ian Young

1

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.


2
+1. Mein Bauchgefühl ist jedoch, dass die meisten Menschen, die die von Ihnen verwendete Sprache verstehen, die Antwort auf die ursprüngliche Frage bereits kennen. Daher empfehle ich, die Antwort für Gelegenheitsleser anzupassen.
Peter

@Peter Ich fand es schwierig, alles anzusprechen. Ich würde es gerne zugänglicher machen, weiß aber nicht, wie ich das machen soll, ohne es näher zu erläutern. Als ich zum ersten Mal mit OpenGL gearbeitet habe, habe ich mich gefragt, was homogene Matrizen und Perspektivmatrizen bedeuten und wie Übersetzungsmatrizen als Alternative zur Übersetzung durch Summieren entdeckt wurden. Es ist also möglich, dass dies nicht allzu weit in die Tiefe reicht. Formalismus ist Sprache, und wenn ich die richtige Formulierung gebe, denke ich, wie die Konzepte zu diskutieren sind, werden sie herauskommen. Es ist jedoch sehr undurchsichtig, prägnant zu sein, daher ähnelt dies eher einer Wiki-Leseliste.
Loki Clock

Ich habe einige Links hinzugefügt, insbesondere ein Video von affinen Karten, die in einer höheren Dimension als lineare Karten erstellt werden. Hoffentlich hilft das.
Loki Clock

nett. verdient mehr Stimmen.
Peter

-1

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 .


Sorry, aber das ist völlig falsch. Wenn ich zwei Punkte A und B habe, dann ist v = BA der Vektor, der von A nach B geht. V geht in diesem Fall überhaupt nicht durch den Ursprung. Ein Vektor ist kein Punkt. Es kann verwendet werden, um einen Punkt (als Positionsvektor) darzustellen , aber es ist etwas anderes. Bitte machen Sie die algebraischen Grundlagen klar.
Polygnome

Ich habe die Antwort aktualisiert, um die Verwirrung zu beseitigen. Ich verweise jedoch auf die Dokumentation, was ein Vector3 in Unity ist, und meine Antwort stimmte mit allen höherrangigen Antworten überein, einschließlich Ihrer eigenen.
Stephan

Wenn Sie die Unity-Dokumentation sorgfältig lesen, werden Sie feststellen, dass der Ursprung nie erwähnt wird, da er sowieso nichts mit der Länge des Vektors zu tun hat. Der Vektor zwischen (1,1,1) und (2,3,4) ist <1,2,3> und hat eine Länge von sqrt (1 ^ 2 + 2 ^ 2 + 3 ^ 3) = ~ 3,9 ist der Abstand zwischen diesen beiden Punkten. Es berührt nicht einmal den Ursprung überhaupt . Ich bin verwirrt , wie Sie vielleicht denken könnte meine Antwort stimmt mit Ihnen, weil es nicht der Fall ist, überhaupt .
Polygnome
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.