Зачем нам нужен единичный вектор (другими словами, зачем нам нужно нормализовать векторы)? - PullRequest
35 голосов
/ 21 февраля 2010

Я читаю книгу об игровом AI.

Одним из используемых терминов является нормализация вектора, который превращает вектор в единицу. Для этого вы должны разделить каждое измерение x, y и z на его величину.

Мы должны превратить вектор в единицу, прежде чем что-либо делать с ним. Зачем?

А кто-нибудь может привести некоторые сценарии, в которых мы должны использовать единичный вектор?

Спасибо!

Ответы [ 5 ]

32 голосов
/ 21 февраля 2010

Вам не нужно нормализовать векторы, но это значительно упрощает многие уравнения. Это также может сделать API меньше: любая форма стандартизации может сократить количество необходимых функций.

Вот простой пример. Предположим, вы хотите найти угол между двумя векторами u и v. Если они являются единичными векторами, то угол равен просто arccos (u v). Если они не единичные векторы, угол равен arccos (u v / (| u | | v |)). В этом случае вы все равно вычисляете нормы u и v.

23 голосов
/ 21 февраля 2010

Как говорит Джон Д. Кук - в основном вы делаете это, потому что заботитесь о направлении, а не о самом векторе.В зависимости от контекста, вы, скорее всего, не хотите / не нуждаетесь в информации о величине - только само направление.Вы нормализуете, чтобы убрать величину, чтобы она не искажала другие вычисления, что, в свою очередь, упрощает многие другие вещи.

С точки зрения ИИ - представьте, что вы берете вектор V между P1 (плохой парень ИИ)и P2 (ваш герой) как направление для плохого парня.Вы хотите, чтобы плохой парень двигался со скоростью N за удар - как вы рассчитываете это?Что ж, мы либо нормализуем вектор для каждого удара, умножаем на N, чтобы выяснить, как далеко они продвинулись, либо мы предварительно нормализуем направление в первую очередь, и просто умножаем вектор единицы на N каждый раз, иначе плохой парень будет двигатьсядальше, если бы он был дальше от героя!Если герой не меняет позицию, это еще один расчет для беспокойства.

В этом контексте это не имеет большого значения - но что, если у вас есть сто плохих парней?Или тысяча?Что если вашему ИИ нужно иметь дело с комбинациями плохих парней?Внезапно это сотня или тысяча нормализаций, которые вы сохраняете за удар.Так как это несколько умножений и квадратный корень для каждого, в конечном итоге вы достигнете точки, в которой преждевременная нормализация данных означает, что вы собираетесь убить скорость обработки ИИ.

В более широком смысле - математика для этого действительно распространена - люди делают здесь то, что они делают для таких вещей, как 3D-рендеринг - если бы вы не унифицировали, например, нормали для ваших поверхностей, вы бы потенциально моглитысячи нормализаций на рендеринг, которые совершенно не нужны.У вас есть два варианта: один - заставить каждую функцию выполнять вычисления, или два - предварительно нормализовать данные.

С точки зрения дизайнера фреймворка: последний по своей природе быстрее - если мы примем первый, даже если ваш пользователь думает нормализовать данные, ему придется пройти ту же процедуру нормализации ИЛИ вы 'Мы собираемся предоставить две версии каждой функции, что является головной болью.Но в тот момент, когда вы заставляете людей задуматься о том, какую версию функции вызывать, вы также можете заставить их думать достаточно, чтобы вызывать правильную, и только предоставлять ее в первую очередь, заставляя их делать правильные вещи для производительности.,

8 голосов
/ 21 февраля 2010

Вы часто нормализуете вектор, потому что вас интересует только направление вектора, а не его величина.

Конкретный сценарий: Нормальное отображение . Комбинируя свет, падающий на поверхность, и векторы, перпендикулярные поверхности, вы можете создать иллюзию глубины. Векторы от поверхности определяют параллельное направление, и величина вектора фактически сделает неправильные вычисления.

6 голосов
/ 21 февраля 2010

Мы должны превратить вектор в единицы прежде чем мы что-то сделаем с ним.

Это утверждение неверно. Все векторы не являются единичными векторами.

Векторы, составляющие основу для координатного пространства, имеют два очень приятных свойства, с которыми им легко работать:

  1. Они ортогональны
  2. Они единичные векторы - величина = 1

Это позволяет записать любой вектор в трехмерном пространстве в виде линейной комбинации единичных векторов:

alt text
(источник: rulesheet.com )

Я могу превратить этот вектор в единичный вектор, если мне нужно, разделив каждый компонент на величину

alt text
(источник: rulesheet.com )

Если вы не знаете, что такое координатные пространства или базисные векторы, я бы порекомендовал узнать немного больше о математике графики, прежде чем идти дальше.

0 голосов
/ 24 марта 2018

В дополнение к уже предоставленным ответам я бы упомянул два важных аспекта.

Тригонометрия определяется на единичной окружности

Все тригонометрические функции определены в единичном круге. Само число pi определено в единичном круге.

Когда вы нормализуете векторы, вы можете использовать все тригонометрические функции напрямую без каких-либо циклов масштабирования. Как упоминалось ранее, угол между двумя единичными векторами просто: acos(dot(u, v)), без дальнейшего масштабирования.

Trigonometric Circle

Единичные векторы позволяют отделить величину от направления

Вектор можно интерпретировать как величину, несущую два типа информации: величину и направление. Сила, скорость и ускорение являются важными примерами.

Если вы хотите иметь дело отдельно с величиной и направлением, представление формы vector = magnitude * direction, где magnitude - скаляр, а direction - единичный вектор, часто очень удобно: Изменения величины влекут за собой скалярные манипуляции, а изменения направления не изменяют величину. direction должен быть единичным вектором, чтобы гарантировать, что величина vector точно равна magnitude.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...