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

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

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

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

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

Спасибо!

35
задан user366312 25 July 2015 в 23:03
поделиться

4 ответа

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

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

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

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

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

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

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

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

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

-121--1278476-

EDIT: Версия, которая работает с немодифицированными A и B

#define f(x, y) (x+y) 
#define g(x, y) (x*y) 
#define A 1, 2 
#define B 2, 3

#define APPLY2(a, b) a b
#define APPLY(a, b) APPLY2(a, (b))

int main(int argc, char* argv[])
{
    int x= APPLY(f, A);
    int y= APPLY(f, B);
    int z= APPLY(g, A);
    int d= APPLY(g, B);

    return 0;
}
-121--4746123-

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

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

32
ответ дан 27 November 2019 в 06:59
поделиться

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

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

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

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

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

23
ответ дан 27 November 2019 в 06:59
поделиться

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

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

8
ответ дан 27 November 2019 в 06:59
поделиться

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

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

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

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

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

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

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

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

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

6
ответ дан 27 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: