webentwicklung-frage-antwort-db.com.de

Warum brauchen wir einen Einheitsvektor (mit anderen Worten, warum müssen wir Vektoren normalisieren)?

Ich lese gerade ein Buch über KI-Spiele.

Einer der verwendeten Begriffe ist das Normalisieren eines Vektors, der einen Vektor in eine Einheit umwandeln soll. Dazu müssen Sie jede Dimension x, y und z durch ihre Größe teilen.

Wir müssen den Vektor in eine Einheit verwandeln, bevor wir etwas damit anfangen können. Warum?

Und könnte jemand einige Szenarien nennen, in denen wir einen Einheitsvektor verwenden müssen?

Vielen Dank!

35
numerical25

Sie müssen Vektoren nicht normalisieren, aber dadurch werden viele Gleichungen etwas einfacher. Es könnte auch die APIs verkleinern: Jede Form der Standardisierung kann die Anzahl der erforderlichen Funktionen reduzieren.

Hier ist ein einfaches Beispiel. Angenommen, Sie möchten den Winkel zwischen den beiden Vektoren u und v ermitteln. Wenn es sich um Einheitsvektoren handelt, handelt es sich bei dem Winkel nur um Arccos (u v). Wenn es sich nicht um Einheitsvektoren handelt, ist der Winkel Arccos (u v/(| u | | v |)). In diesem Fall berechnen Sie die Normen von u und v trotzdem.

32
John D. Cook

Wie John D. Cook sagt, tun Sie dies hauptsächlich, weil Sie sich für die Richtung interessieren, nicht für den Vektor selbst. Abhängig vom Kontext möchten/benötigen Sie höchstwahrscheinlich keine Informationen zur Größe, sondern nur die Richtung. Sie normalisieren sich, um die Größe zu entfernen, damit andere Berechnungen nicht verzerrt werden, was wiederum viele andere Dinge vereinfacht.

In Bezug auf KI - stellen Sie sich vor, Sie nehmen den Vektor V zwischen P1 (dem AI-Bösen) und P2 (Ihrem Helden) als Richtung, in die sich der Böse bewegen soll. Sie wollen, dass sich der Böse mit einer Geschwindigkeit N pro Takt bewegt - wie berechnen Sie das? Nun, entweder normalisieren Sie den Vektor bei jedem Taktschlag, multiplizieren Sie mit N, um herauszufinden, wie weit er sich bewegt hat, oder normalisieren Sie die Richtung an erster Stelle, und multiplizieren Sie einfach den Einheitsvektor mit N - sonst würde sich der Bösewicht bewegen weiter, wenn es weiter vom Helden entfernt wäre! Wenn der Held seine Position nicht ändert, ist dies eine Berechnung weniger, über die er sich Sorgen machen muss. 

In diesem Zusammenhang ist es keine große Sache - aber was ist, wenn Sie hundert Bösewichte haben? Oder tausend? Was ist, wenn Ihre KI mit Kombinationen von Bösewichten umgehen muss? Plötzlich sparen Sie hundert oder tausend Normalisierungen pro Schlag. Da dies eine Handvoll Multiplikationen und eine Quadratwurzel für jeden ist, erreichen Sie schließlich den Punkt, an dem eine vorzeitige Normalisierung der Daten bedeutet, dass Sie Ihre AI-Verarbeitungsrate beenden werden. 

Allgemeiner ausgedrückt - die Mathematik ist wirklich üblich - die Leute tun hier, was sie für Dinge wie 3D-Rendering tun. Wenn Sie beispielsweise nicht die Normalen für Ihre Oberflächen vereinheitlichen, hätten Sie möglicherweise Tausende von Normalisierungen pro Rendering sind völlig überflüssig. Sie haben zwei Möglichkeiten: eine - jede Funktion die Berechnung durchführen lassen, oder zwei - die Daten vornormalisieren. 

Aus der Sicht des Framework-Designers: Letzteres ist inhärent schneller - wenn wir von Ersterem ausgehen, müssen die Benutzer selbst dann, wenn sie die Daten normalisieren wollen, die gleiche Normalisierungsroutine durchlaufen: OR you ' Sie müssen zwei Versionen jeder Funktion bereitstellen, was Kopfschmerzen ist. An dem Punkt, an dem die Leute darüber nachdenken, welche Version der Funktion aufgerufen werden soll, können Sie sie auch dazu bringen, ausreichend nachzudenken, um die richtige anzurufen, und sie nur zur Verfügung zu stellen, damit sie das Richtige für die Leistung tun . 

23
James

Sie normalisieren häufig einen Vektor, weil Sie sich nur für die Richtung der Vektorpunkte interessieren und nicht für die Größe.

Ein konkretes Szenario ist Normal Mapping . Durch das Kombinieren von Licht, das auf die Oberfläche fällt, und Vektoren, die senkrecht zur Oberfläche stehen, können Sie eine Illusion von Tiefe vermitteln. Die Vektoren von der Oberfläche definieren die parallele Richtung, und die Größe des Vektors würde tatsächlich falsche Berechnungen bewirken.

8
smaclell

Wir müssen einen Vektor in Einheiten Umwandeln, bevor wir etwas damit anfangen.

Diese Aussage ist falsch. Alle Vektoren sind keine Einheitsvektoren.

Die Vektoren, die die Basis für einen Koordinatenraum bilden, weisen zwei sehr schöne Eigenschaften auf, die das Arbeiten mit ihnen erleichtern: 

  1. Sie sind orthogonal
  2. Sie sind Einheitsvektoren - Betrag = 1

Auf diese Weise können Sie einen beliebigen Vektor in einen 3D-Raum als lineare Kombination von Einheitsvektoren schreiben: 

alt text http://www.equationsheet.com/latexrender/pictures/e691d8878d3d2cf83362af36faa16096.gif

Ich kann diesen Vektor in einen Einheitsvektor umwandeln, wenn ich jede Komponente durch die Größe dividieren muss 

alt text http://www.equationsheet.com/latexrender/pictures/78a0af48a0d02492fdd2b5377157c6a8.gif

Wenn Sie nicht wissen, dass es sich bei Koordinatenräumen oder Basisvektoren handelt, empfiehlt es sich, ein wenig mehr über die Mathematik von Grafiken zu lernen, bevor Sie viel weiter gehen.

6
duffymo

Neben den bereits gegebenen Antworten möchte ich zwei wichtige Aspekte erwähnen.

Trigonometrie wird auf einem Einheitskreis definiert

Alle trigonometrischen Funktionen werden über einen Einheitskreis definiert. Die Zahl pi selbst ist über einen Einheitskreis definiert.

Wenn Sie Vektoren normalisieren, können Sie alle trigonometrischen Funktionen direkt ohne Skalierungsrunden verwenden. Wie bereits erwähnt, ist der Winkel zwischen zwei Einheitsvektoren einfach: acos(dot(u, v)) ohne weitere Skalierung.

 Trigonometric Circle

Einheitsvektoren erlauben es uns, die Größe von der Richtung zu trennen

Ein Vektor kann als eine Menge interpretiert werden, die zwei Arten von Informationen trägt: Größe und Richtung. Kraft, Geschwindigkeit und Beschleunigung sind wichtige Beispiele.

Wenn Sie getrennt mit der Größe und Richtung behandeln möchten, ist eine Darstellung der Form vector = magnitude * direction, wobei magnitude ein Skalar und direction ein Einheitsvektor ist, oft sehr praktisch: Änderungen der Größe haben Skalarmanipulationen und Änderungen zur Folge in Richtung die Größe nicht verändern. Die Variable direction muss ein Einheitsvektor sein, um sicherzustellen, dass die Größe von vector genau gleich magnitude ist.

0
Escualo