Подтвердить что ты не робот

Зачем нам нужен единичный вектор (другими словами, зачем нам нормализовать векторы)?

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

alt text
(источник: уравнение листа .com)

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

alt text
(источник: уравнение листа .com)

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

Ответ 5

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

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

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

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

Trigonometric Circle

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

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

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