Я читаю книгу по игре AI.
Один из терминов, который используется, должен нормализовать вектор, который должен превратить вектор в единицу. Чтобы сделать так, необходимо разделить каждый размер x
, y
и z
его величиной.
Мы должны превратить вектор в единицу, прежде чем мы сделаем что угодно с ним. Почему?
И кто-либо мог дать некоторые сценарии, где мы должны использовать единичный вектор?
Спасибо!
Мы должны превратить вектор в единицы прежде чем мы что-нибудь с этим сделаем.
Эта инструкция неверна. Все векторы не являются единичными.
Векторы, которые составляют основу для координатного пространства, имеют два очень хороших свойства, которые делают их простыми в работе:
Это позволяет записать любой вектор в 3D пространстве как линейную комбинацию единичных векторов:
(источник: equationsheet.com )
Я могу превратить этот вектор в единичный вектор, если нужно, разделив каждую составляющую на величину
(источник: 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 в любом случае.
Как говорит Джон Д. Кук - в основном вы делаете это потому, что вам важно направление, а не сам вектор. В зависимости от контекста вам, скорее всего, не нужна / не нужна информация о величине - только само направление. Вы нормализуете, чтобы убрать величину, чтобы она не искажала другие вычисления, что, в свою очередь, упрощает многие другие вещи.
С точки зрения ИИ - представьте, что вы берете вектор V между P1 (плохой парень AI) и P2 (ваш герой) как направление движения плохого парня. Вы хотите, чтобы плохой парень двигался со скоростью N за удар - как это вычислить? Что ж, мы либо нормализуем вектор для каждого удара, умножаем его на N, чтобы выяснить, как далеко они переместились, либо мы предварительно нормализуем направление в первую очередь и просто каждый раз умножаем единичный вектор на N - иначе плохой парень переместится дальше, если бы он был подальше от героя! Если герой не меняет позицию, это на один расчет меньше, о чем нужно беспокоиться.
В этом контексте это не имеет большого значения - но что, если у вас есть сотня плохих парней? Или тысяча? Что, если вашему ИИ нужно иметь дело с комбинациями плохих парней? Внезапно вы сохраняете сотню или тысячу нормализаций на такт. Поскольку это несколько умножений и квадратный корень для каждого, в конечном итоге вы достигнете точки, когда не нормализация данных заранее означает, что вы собираетесь убить скорость обработки AI.
В более широком смысле - математика для этого действительно обычна - здесь люди делают то же, что и для таких вещей, как 3D-рендеринг - если бы вы не унифицировали, например, нормали для ваших поверхностей, у вас потенциально были бы тысячи нормализаций. за рендеринг, которые совершенно не нужны. У вас есть два варианта: один - заставить каждую функцию выполнять расчет или два - предварительно нормализовать данные.
С точки зрения разработчика фреймворка: последний по своей сути быстрее - если предположить первое, даже если ваш пользователь думает нормализовать данные, ему придется пройти ту же процедуру нормализации, ИЛИ вы собираетесь предоставить две версии каждой функции, что является головной болью. Но в тот момент, когда вы заставляете людей думать о том, какую версию функции вызывать, вы также можете заставить их подумать достаточно, чтобы вызвать правильную, и предоставить ее только в первую очередь, заставляя их делать правильные вещи для производительности. .
Вы часто нормализуете вектор, потому что вас волнует только направление, в котором он указывает, а не величина.
Конкретный сценарий - Нормальное отображение . Комбинируя свет, падающий на поверхность, и векторы, перпендикулярные поверхности, вы можете создать иллюзию глубины. Векторы от поверхности определяют параллельное направление, и величина вектора может привести к неправильным вычислениям.
Мы должны превратить вектор в единицы. прежде чем что-то с ним делать.
Это утверждение неверно. Все векторы не являются единичными векторами.
Векторы, образующие базис координатного пространства, обладают двумя очень хорошими свойствами, которые облегчают работу с ними:
Это позволяет записать любой вектор в трехмерном пространстве как линейную комбинацию единичных векторов:
(источник: equationsheet.com)
Если нужно, я могу превратить этот вектор в единичный вектор, разделив каждый компонент на величину
(источник: equationsheet.com)
Если вы не знаете, что такое координатные пространства или базисные векторы, я бы рекомендовал узнать немного больше о математике графики, прежде чем идти дальше.