Всем привет! Сегодня хотелось бы поговорить о математике. Математика очень интересная наука и она может сильно пригодиться при разработке игр, да и в целом при работе с компьютерной графикой. Многие (особенно новички) просто не знают о том, как она применяется при разработке. Существует множество задач, не требующих глубокого понимания таких понятий как: интегралы, комплексные числа, группы, кольца и др, но благодаря математике вы можете решать многие интересные задачи. В этой статье мы рассмотрим векторы и интегралы. Если интересно, добро пожаловать под кат. Иллюстрирующий Unity проект, как всегда, прилагается.
Векторная математика.
Векторы и векторная математика являются необходимыми инструментами для разработки игр. Многие операции и действия завязаны на ней целиком. Забавно, что для реализации класса, который отображает стрелочку вектора в Unity, уже потребовалось большинство типовых операций. Если вы хорошо разбираетесь в векторной математике данный блок вам будет неинтересен.
Векторная арифметика и полезные функции
Аналитические формулы и прочие детали легко нагуглить, так что не будем тратить на это время. Сами операции будут проиллюстрированы гиф-анимациями ниже.
Важно понимать, что любая точка в сущности является вектором с началом в нулевой точке.
Гифки делались с помощью Unity, так что нужно было бы реализовывать класс, отвечающий за отрисовку стрелочек. Стрелка вектора состоит из трех основных компонент – линии, наконечника и текста с именем вектора. Для отрисовки линии и наконечника я воспользовался LineRenderer. Посмотрим на класс самого вектора:
Так как мы хотим, чтобы вектор был определённой длинны и точно соответствовал точкам, которые мы задаём, то длинна линии рассчитывается по формуле:
В данной формуле (_VectorEnd — _VectorStart).normalized – это направление вектора. Это можно понять из анимации с разницей векторов, приняв что _VectorEnd и _VectorStart – это вектора с началом в (0,0,0).
Дальше разберём две оставшиеся базовые операции:
Нахождение нормали (перпендикуляра) и середины вектора – это очень часто встречающиеся задачи при разработке игр. Разберём их на примере размещения подписи над вектором.
Для того, чтобы разместить текст перпендикулярно вектору нам понадобится нормаль. В 2D графике нормаль находится достаточно просто.
Вот мы и получили нормаль к отрезку.
normal = normal.y > 0? normal: -normal; — эта операция отвечает за то, чтобы текст всегда показывался над вектором.
Дальше остаётся поместить его в середину вектора и поднять по нормали на расстояние, которое будет смотреться красиво.
В коде использованы локальные позиции, чтобы можно была возможность двигать получившуюся стрелочку.
Но это было про 2D, а что же с 3D?
В 3D плюс-минус всё тоже самое. Отличается только формула нормали, так как нормаль уже берётся не к отрезку, а к плоскости.
В данном примере контролла нормаль к плоскости используется, чтобы сместить конечную точку траектории право, чтобы планету не загораживал интерфейс. Нормаль в 3д графике – это нормализованное векторное произведение двух векторов. Что удобно, в Юнити есть обе эти операции и мы получаем красивую компактную запись:
Думаю, многим, кто думает, что математика не нужна и зачем вообще это знать, стало чуть понятнее какие задачи с помощью неё можно решать просто и элегантно. Но это был простой вариант, который должен знать каждый разработчик игр не стажёр. Поднимем планку — поговорим об интегралах.
Вообще у интегралов очень много применений, таких как: физические симуляции, VFX, аналитика и многое другое. Я не готов сейчас детально описывать все. Хочется описать простой и визуально понятный. Поговорим про физику.
Допустим есть задача – двигать объект в определённую точку. К примеру, чтобы при вхождении в определённый триггер, должны вылетать книги с полок. Если вы хотите двигать равномерно и без физики, то задача тривиальна и не требует интегралов, но когда книги выталкивает с полки призрак, такое распределение скорости будет смотреться совсем не так.
Что такое интеграл?
По сути это площадь под кривой. Но что это означает в контексте физики? Допустим у вас есть распределение скорости по времени. В данном случае площадь под кривой – это путь который пройдёт объект, а это как раз то, что нам и нужно.
Если перейти от теории к практике, то в Unity есть замечательный инструмент под названием AnimationCurve. С помощью него можно задать распределение скорости с течением времени. Создадим вот такой класс.
Метод GetApproxSquareAnimCurve – это и есть наше интегрирование. Мы делаем его простейшим численным методом, просто идём по значениям фукнции и суммируем их определённое число раз. Я выставил 1000 для верности, в целом можно подобрать оптимальнее.
Благодаря этой площади мы дальше уже знаем, какое относительное расстояние. А дальше сравнив два пройденных пути мы получаем коэффициент скорости speedK, который отвечает за то, чтобы мы прошли заданное расстояние.
Видео:Unity/C# Векторы, модуль, направлениеСкачать
unity3d Vector3 Creating a Vector3
Видео:Вектора в Unity. Простое объяснение за 20 минут! Часть (1/2)Скачать
Example
A Vector3 structure can be created in several ways. Vector3 is a struct, and as such, will typically need to be instantiated before use.
Видео:Векторы и Манипуляции с ними, Vector3 - Unity урокиСкачать
Constructors
There are three built in constructors for instantiating a Vector3 .
Constructor | Result |
---|---|
new Vector3() | Creates a Vector3 structure with co-ordinates of (0, 0, 0). |
new Vector3(float x, float y) | Creates a Vector3 structure with the given x and y co-ordinates. z will be set to 0. |
new Vector3(float x, float y, float z) | Creates a Vector3 structure with the given x , y and z co-ordinates. |
Видео:Unity 18 C# Урок 5 - Векторы и Манипуляции с ними, Vector3Скачать
Converting from a Vector2 or Vector4
While rare, you may run into situations where you would need to treat the co-ordinates of a Vector2 or Vector4 structure as a Vector3 . In such cases, you can simply pass the Vector2 or Vector4 directly into the Vector3 , without previously instantiating it. As should be assumed, a Vector2 struct will only pass x and y values, while a Vector4 class will omit its w .
We can see direct conversion in the below script.
Видео:[UNITY3D] 4 способа задать движение объектуСкачать
DenTNT.trmw.ru
Видео:Unity C#. Vector3 Lerp. Справочник. Мусин Михаил.Скачать
Записная книжка
Видео:Unity vector3Скачать
Unity: Операции с векторами
В одном из проектов мне встретился такой код:
здесь transform.forward представлен как Vector3,
moveSpeed и Time.deltaTime — float
Т.е. тут идет умножение ненулевого ВЕКТОРА на число. Поскольку я учился на физмате, то сейчас у меня чуть не съехала крыша, когда я пытался вспомнить все то, что я знаю о векторах, ведь если вернутся к математике, формула выше решается так:
Произведение ненулевого вектора на число — это вектор, коллинеарный данному (сонаправленный данному, если число положительное, имеющий противоположное направление, если число отрицательное), а его модуль равен модулю данного вектора, умноженному на модуль числа. OnlineMSchool
К счастью, до того, как окончательно треснул мой череп, я успел понять, что Vector3 в Unity — это не совсем ВЕКТОР (отрезок, имеющий направление), здесь это прежде всего КООРДИНАТЫ x, y для Vector2 и x. y, z — для Vector3. Хотя наверное на вектор это похоже, т.к. начало его лежит в точке 0.
В документации Unity есть несколько статей про операции с векторами:
1. Понимание векторной арифметики
2. Направление и расстояние от одного объекта до другого
3. Вычисление нормали/перпендикуляра
4. Величина одного вектора, лежащая в направлении другого вектора
🎥 Видео
Вектора в Unity на практике. Просто объяснение за 20 минут! Часть (2/2)Скачать
Векторная математика в UnityСкачать
Vector3.MoveTowards 30 second Unity tutorialСкачать
Unity - Вектор - 16Скачать
Unity C#. Vector3 normalized. Справочник. Мусин Михаил.Скачать
Unity C#. Vector3 RotateTowards. Справочник. Мусин Михаил.Скачать
Как задать движение объекту в unity 2020 | 6 способовСкачать
Структуры Vector2 и Vector3 в Unity 🗜️ #unity #gamedev #unity3d #coding #csharp #старикСкачать
Демонстрация работы векторной математики в UnityСкачать
Физика в Unity - 9. RaycastСкачать
Unity/C# Вектора: скалярное произведение и векторное произведение векторовСкачать
Unity C#. Vector3 ProjectOnPlane. Справочник. Мусин Михаил.Скачать
ВСЕ про Quaternions в Unity - вращение объектовСкачать