Unity угол между вектором и плоскостью

Расчет фактического угла между двумя векторами в Unity3D

есть ли способ рассчитать фактический угол между двумя 3D-векторами в единстве? Метода Vector3.Угол дает самый короткий угол между двумя векторами. Я хочу знать фактический угол, рассчитанный по часовой стрелке.

Видео:Векторы и Манипуляции с ними, Vector3 - Unity урокиСкачать

Векторы и Манипуляции с ними, Vector3 - Unity уроки

3 ответов

это должно быть то, что вам нужно. a и b являются векторами, для которых вы хотите рассчитать угол, n будет нормалью вашей плоскости, чтобы определить, что вы называете «по часовой стрелке / против часовой стрелки»

для простоты я использовать Vector3.Angle а затем вычислить знак от величины угла между плоскостью нормальной n и поперечное произведение (перпендикулярный вектор) a и b .

Это легко, если вы просто использовать сложение и вычитание. Посмотрите на это:

вот что я имею в виду: если мы по часовой стрелке и угол отрицательный, например -170 чтобы сделать его 180, вы используете это уравнение. «180-|угла|+180» вы уже знаете, что угол отрицательный, поэтому используйте «180 — (- angle)+180» и добавьте 180 «360 + angle». Тогда, если по часовой стрелке,дальше но если это против часовой стрелки, сделайте угол отрицательным, это потому, что другая часть угла 360 (это комплимент 360 + угол) — это «360 — (360 + угол)» или «360 — 360 — угол» или «(360 — 360) — угол» и, опять-таки, или «угол». Ну вот и все. ваш законченный угол.

попробуйте использовать Vector3.Angle(targetDir, forward);

Так как вы хотите самый короткий угол между ними, то, если возвращаемое значение больше 180 градусов, просто вычесть 360 градусов с этим значением.

Видео:21. Угол между прямой и плоскостьюСкачать

21. Угол между прямой и плоскостью

Скалярное произведение в разработке игр: проекции и прыгающие мячики в Unity ⛹

Unity угол между вектором и плоскостью

Видео:10 класс, 21 урок, Угол между прямой и плоскостьюСкачать

10 класс, 21 урок, Угол между прямой и плоскостью

furry.cat

Unity угол между вектором и плоскостью

Скалярное произведение – простой, но чрезвычайно полезный математический инструмент. Он кодирует отношение между величинами и направлениями двух векторов в единственное скалярное значение. Его можно использовать для вычисления проекции, отражения, расчета тени и постановки освещения. Из этого руководства вы узнаете:

  • Геометрический смысл скалярного произведения.
  • Как спроецировать один вектор на другой.
  • Как измерить размер объекта вдоль произвольной оси.
  • Как отразить вектор относительно плоскости.
  • Как создать эффект отскока мяча от наклонной поверхности.

Видео:Физика в Unity - 9. RaycastСкачать

Физика в Unity - 9. Raycast

Скалярное произведение

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

a и b , выходящие из одной точки плоскости» data-src=»https://media.proglib.io/posts/2020/04/04/182e211c01704ab48d14f469d9838df4.png» > Два вектора a и b , выходящие из одной точки плоскости

Проекцию одного вектора на другой можно представить как отбрасывание тени от первого вектора в направлении, перпендикулярном второму:

Unity угол между вектором и плоскостьюПроекция одного вектора на другой

Как вы знаете, операция вычисления произведения векторов записывается так:

Unity угол между вектором и плоскостью

Далее в статье мы будем использоваться запись a * b .

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

Если b – единичный вектор, то величина проекции a на b – это просто произведение a * b .

Видео:Вращение, углы Эйлера, Кватернионы в UnityСкачать

Вращение, углы Эйлера, Кватернионы в Unity

Вычисление скалярного произведения через косинус угла

На схеме изображен прямоугольный треугольник. Угол между векторами a и b равен θ .

Unity угол между вектором и плоскостьюДва вектора образуют прямоугольный треугольник

Для начала требуется рассчитать величину проекции вектора a на вектор b – это нижний катет в нарисованном нами треугольнике. Длину катета стороны можно найти, умножив длину гипотенузы треугольника на косинус прилежащего угла.

a на вектор b – это катет прямоугольного треугольника» data-src=»https://media.proglib.io/posts/2020/04/04/c4a332573e7bdc88dcc72dddf457044d.png» > Проекция вектора a на вектор b – это катет прямоугольного треугольника

Итак, длина проекции равна произведению модуля вектора a на косинус угла θ . Скалярное произведение можно выразить следующим образом:

Unity угол между вектором и плоскостьюФормула вычисления скалярного произведения через косинус

Эта формула лишний раз подтверждает, что порядок умножения не важен – в результат входят беззнаковые длины обоих векторов. Если оба вектора – единичные, правая часть формулы упрощается до cos(θ) . А если угол равен 90° (векторы перпендикулярны), то их произведение равно 0 .

Если угол острый (меньше 90°), результат будет положительным, так как косинус такого угла больше 0. Аналогично для тупого угла получится отрицательный результат. Таким образом, знак скалярного произведения дает нам некоторое представление о направлениях векторов.

Функция косинуса монотонно убывает на промежутке от 0 до 180° (от 1 до -1 ). Следовательно, чем ближе направления двух векторов, тем больше их скалярное произведение и наоборот.

  • Направления совпадают, угол θ равен 0°, произведение равно |a| * |b| .
  • Направления противоположны, угол θ равен 180°, произведение – -1* |a| * |b| .

Видео:21. Угол между прямой и плоскостьюСкачать

21. Угол между прямой и плоскостью

Вычисление скалярного произведения через компоненты векторов

Если наши векторы расположены в 3D-пространстве и имеют по три координаты каждый, не совсем понятно, где тот угол, косинус которого нужно вычислить. К счастью, существует другой способ расчета скалярного произведения – без всякой тригонометрии! Для начала нужно разложить каждый вектор на компоненты:

Unity угол между вектором и плоскостьюРазложение векторов на компоненты

Намного проще и без всяких косинусов! В Unity есть встроенный метод Vector3.Dot для вычисления скалярного произведения двух векторов:

Его реализация выглядит следующим образом:

Нам известно, как найти длину вектора по его координатам:

Но ее можно выразить и через скалярное произведение вектора на себя:

Вернемся к формуле a * b = |a| * |b| * cos θ . При известных длинах векторов мы можем вычислить угол между ними с помощью функции арккосинуса:

Unity угол между вектором и плоскостьюВычисление величины угла между векторами

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

Unity угол между вектором и плоскостьюУпрощенные формулы для единичных векторов

Видео:Unity/C# Векторы, модуль, направлениеСкачать

Unity/C# Векторы, модуль, направление

Проекция вектора

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

Пусть вектор с = project ba – это проекция вектора a на вектор b .

Unity угол между вектором и плоскостьюВектор c – проекция вектора a на вектор b

Возьмем единичный вектор в направлении вектора b . Он будет равен b / |b| . Если мы возьмем величину проекции a на b со знаком и умножим на этот единичный вектор, то получим вектор c . Cкалярное произведение a * b – это результат умножения длины b на длину проекции a на b . Отсюда получаем, что длину c со знаком можно найти, разделив скалярное произведение a * b на длину b :

Unity угол между вектором и плоскостьюВычисление длины проекции одного вектора на другой

Умножив полученное значение на единичный вектор b / |b| , получаем формулу для нахождения проекции вектора:

Unity угол между вектором и плоскостьюВычисление проекции одного вектора на другой

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

Unity угол между вектором и плоскостьюВычисление проекции одного вектора на другой

Если b – единичный вектор, то можно упростить еще больше:

Unity угол между вектором и плоскостьюВычисление проекции вектора на единичный вектор

В Unity для вычисления проекции одного вектора на другой есть специальная функция Vector3.Project :

Вот так выглядит ее реализация:

Следует остерегаться возможного вырожденного случая, когда вектор, на который происходит проекция, – нулевой или имеет малую величину. При этом произойдет численный «взрыв» из-за деления на 0 или близкое к нему значение. Один из способов решить проблему – заранее вычислять величину вектора и при необходимости использовать резервный вариант (единичный вектор).

Видео:Угол между прямой и плоскостью. Видеоурок по геометрии 10 классСкачать

Угол между прямой и плоскостью. Видеоурок по геометрии 10 класс

Упраженение #1. Линейка

В качестве упражнения для закрепления знаний о векторной проекции сделаем линейку, которая измеряет размер объекта вдоль произвольной оси.

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

Как спроецировать какую-либо точку ( Point ) на линейку? Прежде всего, найдем относительный вектор от базовой позиции линейки ( Base ) до этой точки. Затем спроецируем его на ось линейки ( Axis ). Проекция точки ( Projection ) – это базовое положение линейки, смещенное на проекцию относительного вектора.

Unity угол между вектором и плоскостьюПроекция точки на линейку

Промежуточное значение relativeDot в коде отражает, насколько далеко проекция точки находится от базового положения линейки – в направлении оси линейки, если она положительная, или в противоположном направлении, если отрицательная.

Чтобы найти размер объекта вдоль оси линейки, нужно провести такие измерения для каждой вершины меша (Mesh) и найти минимальное и максимальное значение. Ответ будет равен разнице между ними.

Видео:Unity/C# Вектора: скалярное произведение и векторное произведение векторовСкачать

Unity/C# Вектора: скалярное произведение и векторное произведение векторов

Отражение вектора

Еще одно практическое применение скалярного произведения – отражение вектора относительно плоскости. Рассмотрим вектор v и плоскость с нормальным вектором (перпендикуляром) n .

Unity угол между вектором и плоскостьюОтражение вектора v от плоскости

Мы можем разложить отражаемый вектор на параллельную и перпендикулярную к плоскости составляющие:

Unity угол между вектором и плоскостьюРазложение отражаемого вектора на составляющие

Сам вектор является суммой параллельной и перпендикулярной составляющих:

Unity угол между вектором и плоскостьюРазложение отражаемого вектора на составляющие

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

Unity угол между вектором и плоскостьюПолучение параллельного плоскости компонента вектора

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

Unity угол между вектором и плоскостьюПолучение отраженного от плоскости вектора

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

То есть разность самого вектора и его удвоенной проекции на нормаль плоскости.

В Unity, конечно же, есть встроенная функция для расчета отраженного вектора – Vector3.Reflect :

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

Видео:УГОЛ МЕЖДУ ПРЯМОЙ И ПЛОСКОСТЬЮ 10 классСкачать

УГОЛ МЕЖДУ ПРЯМОЙ И ПЛОСКОСТЬЮ 10 класс

Упражнение #2. Отскок мяча от наклонной плоскости

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

Для моделирования траектории движения шара под действием силы тяжести мы будем использовать метод Эйлера.

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

Сфера может быть определена центром ( C ) и радиусом ( R ). Плоскость определяется нормальным вектором ( n ) и точкой на плоскости ( P ). Вектор от P до С обозначим u .

Unity угол между вектором и плоскостьюСфера и плоскость

Если сфера НЕ проникает в плоскость, перпендикулярный плоскости компонент вектора u , должен иметь то же направление, что и вектор n , а также длину не менее R .

Unity угол между вектором и плоскостьюПерпендикулярный плоскости компонент вектора

Другими словами, сфера не проникает в плоскость, если скалярное произведение векторов u и n больше R . В противном случае величина проникновения составляет R – u * n , и положение сферы нужно исправить.

Чтобы это сделать, можно просто переместить сферу в направлении нормали плоскости n на величину проникновения. Это лишь приближенное решение, которое не является физически правильным, но для упражнения оно хорошо подходит.

Добавим логику для коррекции позиции:

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

Эта анимация демонстрирует идеальное отражение и выглядит неестественной. Мы ожидаем, что с каждым отскоком скорость мяча будет уменьшаться.

Это поведение обычно моделируется значением реституции (восстановления) между двумя сталкивающимися объектами. При 100% реституции мяч идеально отскакивает от плоскости. При 50% – величина перпендикулярной к плоскости составляющей скорости мяча будет уменьшена вдвое.

Величина реституции – это отношение величин перпендикулярного к плоскости компонента скорости мяча до и после отскока.

Вот пересмотренный с учетом коэффициента восстановления скорости вариант функции отражения:

Вот так выглядит обновленная функция SphereVsPlane :

Логика корректировки позиции заменяется логикой полноценного отскока:

Теперь мы можем устанавливать разные коэффициенты реституции для разных шариков:

Видео:Видеоурок "Угол между прямой и плоскостью"Скачать

Видеоурок "Угол между прямой и плоскостью"

Заключение

Мы ответили на все вопросы, заданные в начале этого руководства.

  • Скалярное произведение двух векторов – это произведение проекции первого вектора на второй (с учетом знака) и модуля второго вектора.
  • Существует две формулы вычисления скалярного произведения: через косинус угла и через компоненты векторов.
  • Скалярное произведение имеет множество полезных практических применений. Например, оно позволяет рассчитать проекцию вектора на другой вектор.
  • С помощью скалярного произведения можно найти отраженный от плоскости вектор. На этой основе строятся различные физические модели, например, имитация отскока шарика от плоскости.

Расскажите в комментариях – разрабатываете ли вы сейчас какую-нибудь игру и если да, то о чем она. Каких уроков по Unity вам не хватает?

Видео:Физика в Unity - 10. JointСкачать

Физика в Unity - 10. Joint

DenTNT.trmw.ru

Видео:Unity 18 C# Урок 5 - Векторы и Манипуляции с ними, Vector3Скачать

Unity 18 C# Урок 5 - Векторы и Манипуляции с ними, Vector3

Записная книжка

Видео:Угол между прямыми, плоскостями, прямой и плоскостью | Математика ЕГЭ для 10 класса | УмскулСкачать

Угол между прямыми, плоскостями, прямой и плоскостью | Математика ЕГЭ для 10 класса | Умскул

Unity: Операции с векторами

В одном из проектов мне встретился такой код:

здесь transform.forward представлен как Vector3,
moveSpeed и Time.deltaTime — float
Т.е. тут идет умножение ненулевого ВЕКТОРА на число. Поскольку я учился на физмате, то сейчас у меня чуть не съехала крыша, когда я пытался вспомнить все то, что я знаю о векторах, ведь если вернутся к математике, формула выше решается так:

Произведение ненулевого вектора на число — это вектор, коллинеарный данному (сонаправленный данному, если число положительное, имеющий противоположное направление, если число отрицательное), а его модуль равен модулю данного вектора, умноженному на модуль числа. OnlineMSchool

К счастью, до того, как окончательно треснул мой череп, я успел понять, что Vector3 в Unity — это не совсем ВЕКТОР (отрезок, имеющий направление), здесь это прежде всего КООРДИНАТЫ x, y для Vector2 и x. y, z — для Vector3. Хотя наверное на вектор это похоже, т.к. начало его лежит в точке 0.
В документации Unity есть несколько статей про операции с векторами:
1. Понимание векторной арифметики
2. Направление и расстояние от одного объекта до другого
3. Вычисление нормали/перпендикуляра
4. Величина одного вектора, лежащая в направлении другого вектора

📹 Видео

11 класс, 7 урок, Вычисление углов между прямыми и плоскостямиСкачать

11 класс, 7 урок, Вычисление углов между прямыми и плоскостями

Shader graph в Unity! Проще чем кажется! Шейдер графСкачать

Shader graph в Unity! Проще чем кажется! Шейдер граф

Вектора в Unity на практике. Просто объяснение за 20 минут! Часть (2/2)Скачать

Вектора в Unity на практике. Просто объяснение за 20 минут! Часть (2/2)

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

Угол между прямыми в пространстве. 10 класс.

Векторная математика в UnityСкачать

Векторная математика в Unity
Поделиться или сохранить к себе: