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

В чем необходимость нормализации вектора?

Попытка понять векторы немного больше.

Что нужно для нормализации вектора?

Если у меня есть вектор, N = (x, y, z)

Что вы на самом деле получаете, когда вы его нормализуете? Я понимаю, что вам нужно разделить x/| N | г /| N | и z/| N |. Мой вопрос: зачем мы это делаем, я имею в виду, что мы получаем из этого уравнения?

В чем смысл или "внутренняя цель" этого.

Немного математического вопроса, прошу прощения, но я действительно не понимаю в этой теме.

4b9b3361

Ответ 1

Это немного напоминает вопрос, почему мы умножаем числа. Он появляется все время.

Декартова система координат, которую мы используем, является ортонормированным базисом (состоит из векторов длины 1, ортогональных друг другу, базис означает, что любой вектор может быть представлен уникальной комбинацией этих векторов), когда вы хотите повернуть ваш базис (который возникает в механизме видеоигр при просмотре) вы используете матрицы, строки и столбцы которых являются ортонормированными векторами.

Как только вы начнете играть с матрицами в линейной алгебре, вам понадобятся ортонормированные векторы. Слишком много примеров, чтобы просто назвать их.

В конце дня нам не нужны нормализованные векторы (так же, как нам не нужны гамбургеры, мы могли бы жить без них, но кто собирается?), но аналогичная картина v / |v| возникает так часто, что люди решили дать ему имя и специальную нотацию (a ^ над вектором означает нормализованный вектор) как ярлык.

Нормализованные векторы (также известные как единичные векторы) являются, по сути, фактом жизни.

Ответ 2

Для любого вектора V = (x, y, z), |V| = sqrt(x*x + y*y + z*z) задает длину вектора.

Когда мы нормализуем вектор, мы фактически вычисляем V/|V| = (x/|V|, y/|V|, z/|V|).

Легко видеть, что нормированный вектор имеет длину 1. Это происходит потому, что:

| V/|V| | = sqrt((x/|V|)*(x/|V|) + (y/|V|)*(y/|V|) + (z/|V|)*(z/|V|))
          = sqrt(x*x + y*y + z*z) / |V|
          = |V| / |V|
          = 1

Следовательно, мы можем назвать нормированные векторы единичными векторами (т.е. векторами с единичной длиной).

Любой вектор, при нормализации, только изменяет свою величину, а не ее направление. Кроме того, каждый вектор, указывающий в одном направлении, нормализуется к одному и тому же вектору (поскольку величина и направление однозначно определяют вектор). Следовательно, единичные векторы чрезвычайно полезны для указания направлений.

Заметим, однако, что все вышеприведенное обсуждение было для трехмерных декартовых координат (x, y, z). Но что мы на самом деле имеем в виду декартовыми координатами?

Оказывается, для определения вектора в трехмерном пространстве нам нужны некоторые ориентиры. Эти ссылочные направления канонически называются i, j, k (или i, j, k с небольшими шапками на них, называемыми "i cap", "j cap" и "k cap" ). Любой вектор, который мы называем V = (x, y, z), может быть тогда записан как V = xi + yj + zk. (Примечание: я больше не буду называть их кепками, я просто назову их i, j, k). i, j и k - единичные векторы в направлениях X, Y и Z и образуют множество взаимно ортогональных единичных векторов. Они являются основой всей декартовой геометрии координат.

Существуют и другие формы координат (такие как цилиндрические и сферические координаты), и хотя их координаты не так понятны как (x, y, z), они также состоят из набора из 3 взаимно ортогональных единичных векторов, которые составляют основу в который умножаются 3 координаты для создания вектора.

Итак, в приведенном выше обсуждении четко сказано, что нам нужны единичные векторы для определения других векторов, но зачем вам это нужно?

Потому что иногда бывает важна только величина. Это, когда вы используете "обычный" номер (что-то вроде 4 или 1/3 или 3.141592653 - нет, для всех вас, уродов OCD, я НЕ собираюсь ставить там Pi), которые останутся конечными десятичными, только потому, что я - воплощение зла). Вы бы не захотели бросить в это надоедливое направление, не так ли? Я имею в виду, действительно ли имеет смысл сказать, что я хочу 4 килограмма арбузов, стоящих перед Западом? Если вы, конечно, не сумасшедший фанатик.

В других случаях имеет значение только направление. Вы просто не заботитесь о величине, или величина просто слишком велика для понимания (что-то вроде бесконечности, только то, что никто действительно не знает, что такое бесконечность). All Hail The Great Infinite, потому что у Него бесконечные Беспредельности... Извините, там немного увлекся). В таких случаях мы используем нормировку векторов. Например, это не означает, что можно сказать, что у нас есть линия, расположенная на 4 км к северу. Имеет смысл сказать, что у нас есть линия к Северу. Так что же вы тогда делаете? Вы избавляетесь от 4 км. Вы разрушаете величину. Все, что у вас осталось, - это Север (и Зима идет). Делайте это достаточно часто, и вам нужно будет дать имя и обозначение тому, что вы делаете. Вы не можете просто называть это "игнорированием величины". Это слишком грубо. Вы математик, и поэтому вы называете это "нормализацией", и вы даете ему обозначение "cap" (вероятно, потому, что вы хотели пойти на вечеринку, а не застрять с векторами).

BTW, так как я упоминал декартовы координаты, здесь обязательный XKCD: XKCD

Ответ 3

Чтение Godot Game Engine
документация об единичном векторе, нормализация и точечный продукт действительно имеют большой смысл. Вот статья:

Единичные векторы Итак, мы знаем, что такое вектор. Он имеет направление и величину. Мы также знаем, как их использовать в Годо. Следующий шаг - изучение единичных векторов. Любой вектор с величиной длины 1 считается единичным вектором. В 2D представьте себе рисунок радиуса один. Этот круг содержит все единичные векторы для двух измерений:

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

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

Нормализация Принимая любой вектор и уменьшая его величину до 1,0, сохраняя его направление, называется нормировкой. Нормализацию выполняют путем деления составляющих вектора x и y (и z в 3D) по величине:

var a = Vector2(2,4)
var m = sqrt(a.x*a.x + a.y*a.y)

a.x/= m a.y/= m Как вы могли догадаться, если вектор имеет величину 0 (что означает не его вектор, а начало координат, также называемый нулевым вектором), происходит деление на ноль, и вселенная проходит второй большой взрыв, за исключением обратной полярности, а затем обратно, В результате человечество безопасно, но Годо распечатает ошибку. Запомнить! Вектор (0,0) не может быть нормирован!.

Конечно, Vector2 и Vector3 уже предоставляют способ для этого:

a = a.normalized()

Точный продукт ОК, точечный продукт является самой важной частью векторной математики. Без точечного продукта Quake никогда не был бы создан. Это самый важный раздел учебника, поэтому не забудьте правильно его понять. Большинство людей, пытающихся понять векторную математику, отступают здесь, потому что, несмотря на то, насколько это просто, они не могут сделать из него голову или хвосты. Зачем? Вот почему, потому что...

Точечный продукт принимает два вектора и возвращает скаляр:

var s = a.x*b.x + a.y*b.y

Да, в значительной степени это. Умножьте x из вектора a на x из вектора b. Сделайте то же самое с y и добавьте его вместе. В 3D это почти то же самое:

var s = a.x*b.x + a.y*b.y + a.z*b.z

Я знаю, это совершенно бессмысленно! Вы даже можете сделать это со встроенной функцией:

var s = a.dot(b) Порядок двух векторов не имеет значения, a.dot(b) возвращает то же значение, что и b.dot(a).

Здесь начинается отчаяние, и книги и учебные пособия показывают вам эту формулу:

введите описание изображения здесь И вы осознаете свое время, чтобы отказаться от создания 3D-игр или сложных 2D-игр. Как может так просто быть настолько сложным? Кто-то еще должен будет сделать следующий Zelda или Call of Duty. Сверху вниз RPG не выглядят так плохо в конце концов. Да, я слышал, что кто-то очень понравился с одним из них в Steam...

Итак, это ваш момент, это ваше время, чтобы сиять. НЕ СДАВАЙСЯ! На этом этапе в этом руководстве будет сделан резкий поворот и сосредоточиться на том, что делает полезный dot-продукт полезным. Вот почему это полезно. Мы сосредоточимся один за другим в вариантах использования для точечного продукта, с реальными приложениями. Больше никаких формул, которые не имеют никакого смысла. Формулы будут иметь смысл, когда вы узнаете, для чего они полезны.

Сайдинг Первое полезное и самое важное свойство точечного продукта - проверить, на что смотрит материал. Предположим, что у нас есть два вектора: a и b. Любое направление или величина (ни происхождение). Неважно, что это такое, но представьте себе, что мы вычисляем точечный продукт между ними.

var s = a.dot(b) Операция вернет одно число с плавающей запятой (но поскольку мы находимся в векторном мире, мы называем их скалярными, будем продолжать использовать этот термин с этого момента). Это число сообщит нам следующее:

Если число больше нуля, оба они смотрят в одном направлении (угол между ними составляет < 90 ° градусов). Если число меньше нуля, они смотрят в противоположном направлении (угол между ними составляет > 90 ° градусов). Если число равно нулю, векторы формируются в L (угол между ними равен 90 ° градусов). введите описание изображения здесьПоэтому давайте рассмотрим реальный сценарий использования. Представьте, что Змея проходит через лес, а затем поблизости находится враг. Как мы можем быстро сказать, видел ли враг обнаруженный Змей? Чтобы обнаружить его, враг должен уметь видеть Снейка. Скажем, тогда:

Змея находится в положении A. Враг находится в положении B. Враг обращен к вектору направления F.

введите описание изображения здесь Итак, давайте создадим новый вектор BA, который идет от охранника (B) к Snake (A), вычитая два:

var BA = A - B введите описание изображения здесь В идеале, если охранник смотрел прямо на змею, чтобы получить зрительный контакт, он сделал бы это в том же направлении, что и вектор BA.

Если точечный продукт между F и BA больше 0, то Snake будет обнаружен. Это происходит потому, что мы сможем сказать, что охранник смотрит на него:

if (BA.dot(F) > 0):
    print("!")

Кажется, что Змейка в безопасности до сих пор.

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

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

Если оба вектора направлены в одно и то же направление (параллельно друг другу, угол между ними равен 0 °), результирующий скаляр равен 1. Если оба вектора обращены к прямо противоположному направлению (параллельно друг другу, но угол между ними равен 180 °), то полученный скаляр равен -1. Это означает, что точечный продукт между единичными векторами всегда находится между диапазоном 1 и -1. Итак, снова...

Если их угол равен 0 °, то произведение равно 1. Если их угол равен 90 °, то точечный продукт равен 0. Если их угол равен 180 °, то точечный продукт равен -1. Э-э... это странно знакомо... видел это раньше... где?

Возьмем два единичных вектора. Первый направлен вверх, второй тоже, но мы будем вращать его полностью (0 °) вниз (180 ° градусов)...

введите описание изображения здесь При построении результирующего скаляра!

введите описание изображения здесь Ага! Теперь все имеет смысл, это косинус-функция!

Можно сказать, что тогда, как правило...

Точечным продуктом между двумя единичными векторами является косинус угла между этими двумя векторами. Итак, чтобы получить угол между двумя векторами, мы должны сделать:

var angle_in_radians = acos( a.dot(b) )

Для чего это полезно? Хорошо получить угол непосредственно, вероятно, не так полезно, но просто возможность рассказать угол полезен для справки. Один пример - в демонстрации кинематического персонажа, когда персонаж движется в определенном направлении, тогда мы ударяем объект. Как узнать, является ли то, что мы ударили, - это пол?

Сравнивая нормаль точки столкновения с ранее вычисленным углом.

Красота заключается в том, что один и тот же код работает точно так же и без изменений в 3D. Векторная математика, в значительной степени, независима от размера, поэтому добавление или удаление оси только добавляет очень мало сложности.

Ответ 4

Предполагается, что нормали используются только как вектор направления. Они используются для вычисления освещения, что требует нормализованных нормальных векторов.

Ответ 5

Вы делаете свою длину 1 - находите единичный вектор, который указывает в одном направлении.

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