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

Lesezeit: 5 Minuten

Benutzeravatar von Numerical25
numerisch25

Ich lese ein Buch über Spiele-KI.

Einer der verwendeten Begriffe ist die Normalisierung eines Vektors, der einen Vektor in eine Einheit umwandeln soll. Dazu müssen Sie jede Dimension teilen x, y und z nach seiner Größenordnung.

Wir müssen den Vektor in eine Einheit umwandeln, bevor wir irgendetwas damit machen. Wieso den?

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

Vielen Dank!

Benutzeravatar von John D. Cook
John D. Koch

Sie müssen Vektoren nicht normalisieren, aber es macht viele Gleichungen ein wenig einfacher, wenn Sie dies tun. Es könnte auch APIs kleiner machen: Jede Form der Standardisierung hat das Potenzial, die Anzahl der erforderlichen Funktionen zu reduzieren.

Hier ist ein einfaches Beispiel. Angenommen, Sie möchten den Winkel zwischen zwei Vektoren u und v ermitteln. Wenn es sich um Einheitsvektoren handelt, ist der Winkel einfach arccos(uv). Wenn es sich nicht um Einheitsvektoren handelt, ist der Winkel arccos(uv/(|u| |v|)). In diesem Fall berechnest du sowieso die Normen von u und v.

  • Ich glaube, Sie müssen Quaternion für die Rotation normalisieren.

    – Afriza N. Arief

    21. Februar 2010 um 5:15 Uhr

  • @afriza: Ein Quaternion ist ein anderes Tier als ein Einheitsvektor, aber Sie haben Recht, dass der Satz von Einheitsquaternionen Ihnen den Satz aller Rotationen gibt

    – Zebrabox

    21. Februar 2010 um 13:22 Uhr


Wie John D. Cook sagt, tun Sie dies hauptsächlich, weil Sie sich um die Richtung kümmern, nicht um den Vektor selbst. Je nach Kontext möchten / benötigen Sie höchstwahrscheinlich keine Größeninformationen – nur die Richtung selbst. Sie normalisieren, um die Größe zu entfernen, damit andere Berechnungen nicht verzerrt werden, was wiederum viele andere Dinge vereinfacht.

Stellen Sie sich in Bezug auf die KI vor, Sie nehmen den Vektor V zwischen P1 (dem KI-Bösewicht) und P2 (Ihrem Helden) als Bewegungsrichtung für den Bösewicht. Sie möchten, dass sich der Bösewicht mit einer Geschwindigkeit N pro Schlag bewegt – wie berechnen Sie das? Nun, entweder normalisieren wir den Vektor bei jedem Schlag, multiplizieren mit N, um herauszufinden, wie weit sie sich bewegt haben, oder wir normalisieren zuerst die Richtung vor und multiplizieren einfach den Einheitsvektor jedes Mal 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 das eine Berechnung weniger, um die man 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 fertig werden muss? Plötzlich sind es hundert oder tausend Normalisierungen, die Sie pro Schlag speichern. Da dies eine Handvoll Multiplikationen und jeweils eine Quadratwurzel sind, erreichen Sie schließlich den Punkt, an dem Sie Ihre KI-Verarbeitungsrate beenden, wenn Sie die Daten nicht im Voraus normalisieren.

Im weiteren Sinne – Mathematik dafür ist sehr verbreitet – die Leute tun hier, was sie für Dinge wie 3D-Rendering tun – wenn Sie beispielsweise die Normalen für Ihre Oberflächen nicht vereinheitlichen würden, hätten Sie möglicherweise Tausende von Normalisierungen pro Rendering sind völlig unnötig. Sie haben zwei Möglichkeiten: erstens – jede Funktion die Berechnung durchführen lassen oder zweitens – die Daten vornormalisieren.

Aus Sicht des Framework-Designers: Letzteres ist von Natur aus schneller – wenn wir Ersteres annehmen, selbst wenn Ihr Benutzer daran denkt, die Daten zu normalisieren, muss er dieselbe Normalisierungsroutine durchlaufen ODER Sie müssen zwei bereitstellen Versionen jeder Funktion, was Kopfschmerzen bereitet. Aber an dem Punkt, an dem Sie die Leute dazu bringen, darüber nachzudenken, welche Version der Funktion aufgerufen werden soll, können Sie sie genauso gut zum Nachdenken bringen, um die richtige Version aufzurufen, und sie nur an erster Stelle bereitstellen, damit sie das Richtige für die Leistung tun .

  • Damit ist diese Frage für mich am besten beantwortet. Tolle Erklärung!

    – Ton

    15. Mai 2013 um 20:52 Uhr

  • Hallo, wo sagt John D. Cook, dass ich ihn verweisen muss?

    – Monster-MMORPG

    23. Juni 2016 um 13:22 Uhr

Benutzeravatar von smaclell
klein

Sie normalisieren häufig einen Vektor, weil Sie sich nur um die Richtung kümmern, in die der Vektor zeigt, und nicht um die Größe.

Ein konkretes Szenario ist Normale Zuordnung. Durch die Kombination von Licht, das auf die Oberfläche trifft, und Vektoren, die senkrecht zur Oberfläche stehen, können Sie eine Illusion von Tiefe erzeugen. Die Vektoren von der Oberfläche definieren die parallele Richtung und die Größe zum Vektor würde die Berechnungen tatsächlich falsch machen.

Benutzeravatar von duffymo
duffymo

Wir müssen einen Vektor in Einheiten umwandeln, bevor wir irgendetwas damit machen.

Diese Aussage ist falsch. Alle Vektoren sind keine Einheitsvektoren.

Die Vektoren, die die Grundlage für einen Koordinatenraum bilden, haben zwei sehr schöne Eigenschaften, die es einfach machen, mit ihnen zu arbeiten:

  1. Sie sind orthogonal
  2. Sie sind Einheitsvektoren – Magnitude = 1

Auf diese Weise können Sie jeden Vektor in einem 3D-Raum als Linearkombination von Einheitsvektoren schreiben:

Alt-Text
(Quelle: gleichungsblatt.com)

Ich kann diesen Vektor bei Bedarf in einen Einheitsvektor umwandeln, indem ich jede Komponente durch die Größe dividiere

Alt-Text
(Quelle: gleichungsblatt.com)

Wenn Sie nicht wissen, was Koordinatenräume oder Basisvektoren sind, würde ich empfehlen, etwas mehr über die Mathematik der Grafik zu lernen, bevor Sie weiter gehen.

Zusätzlich zu den bereits gegebenen Antworten möchte ich zwei wichtige Aspekte erwähnen.

Trigonometrie ist auf einem Einheitskreis definiert

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

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

Trigonometrischer Kreis

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

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

Wenn Sie handeln möchten separat mit der Größe und Richtung eine Darstellung der Form vector = magnitude * directionwo magnitude ist ein Skalar und direction B. ein Einheitsvektor, ist oft sehr praktisch: Änderungen der Größe führen zu Skalarmanipulationen, und Änderungen der Richtung ändern die Größe nicht. Das direction muss ein Einheitsvektor sein, um sicherzustellen, dass die Größe von vector ist genau gleich magnitude.

1393330cookie-checkWarum brauchen wir einen Einheitsvektor (mit anderen Worten, warum müssen wir Vektoren normalisieren)?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy