Введение.
Создание игр кажется чем-то увлекательным , однако разработка игр требует от разработчика хорошего знания математики. Но какой конкретно?
Без математики игры просто бы не работали. Персонаж не смог бы подниматься по склону или скользить с него, выпустить пулю из своего ружья или даже просто прыгать. Причём не имеет значения, разрабатываете вы простой инди-проект или AAA-проект.
Однако большая часть математики считается прямо во время игры игровыми движками, которые рендерят всё, что мы видим в игре. Они выполняют очень важную работу, так как без этого игра просто не сможет существовать. Само создание движка включает в себя очень много математических расчётов.
Математика–это всё, когда дело доходит до разработки игр. Начиная от возможности рассчитать траекторию птицы в игре до возможности проверить, что персонаж может прыгнуть и приземлиться обратно на землю.
За последние десять лет сложность многих игр возросла, а вместе с этим возросли и знания, необходимые для их создания. Создание новейшего кода для графики, анимации, физического моделирования и даже в некоторой степени искусственного интеллекта требует досконального знания необходимой математической основы.
Вектора
Вектора это основа основ, особенно в GameDev. Они используются очень часто и имеют огромное значение в разработке.
Векторами задаются: движение, позиционирование, расстояние, поведение и ориентация объектов в двухмерном или трёхмерном пространстве.
На одной векторной арифметике можно сделать качественный искусственный интеллект , с этим может помочь множество полезных операций, таких как сложение, умножение , скалярное произведение и другие.
Базовые векторы являются частью раздела линейной алгебры. С помощью матриц и линейной алгебры вы пишете что угодно, от саперов до 3D мира.
Векторы представляют собой наборы координат различной размерности. Каждая координата в векторе представляет некоторую абсолютную позицию в том направлении пространства, в котором находится вектор.
В практике преимущество использования векторов заключается в том, что они четко представляют такие вещи , как направление, скорость, позиция и упрощают такие операции как перемещение и изменение.
Пример.
Для чего понадобиться складывать вектора? Чаще всего сложение векторов в играх используется для физического взаимодействия с объектом.
Каждый предмет в игре имеет свой вектор (координаты) для местоположения, скорости и ускорения. Для любого кадра, мы должны сложить несколько векторов: прибавить скорость к координате и ускорение к скорости.
Давайте рассмотрим пример с прыжками Марио. Начальная позиция равна (0, 0) так как это 2D игра. В момент начала прыжка его скорость (1, 3), он быстро начинает двигаться вверх и вправо по координатной плоскости. Его ускорение равно (0, -1), из-за того, что в игре присутствует сила притяжения, которая тянет его вниз. Его прыжок проходит в 8 кадров.
Тригонометрия
В разработке игр, есть много ситуаций, где нужно использовать тригонометрические функции. При программировании игры часто нужно будет делать такие вещи, как находить расстояние между двумя точками или заставить объект двигаться.
Через тригонометрию можно выразить поворот и всё с ним связанное, траекторию, углы и даже сгладить движение. И это только первое , что приходит на ум. Так же не стоит забывать, что тригонометрические функции периодичны. Это можно достаточно хорошо реализовать в некоторых задачах.
Угол зрения.
Чтобы понять, что такое угол зрения, нам нужно знать всего две величины— высоту объекта и расстояние до него:
Красный объект ,имеет большее расстояние, поэтому кажется далёким, потому что угол зрения- маленький. Но если мы подвинем этот объект поближе к наблюдателю, то угол зрения станет больше.
Теперь наблюдателю кажется, что объект очень близко, потому что угол зрения стал гораздо больше, чем раньше. Получается, что угол зрения влияет на то, как мы воспринимаем предметы — близкими или далёкими.
И вот тут нам пригодится школьная тригонометрия — все эти синусы, косинусы и тангенсы. Благодаря им мы сможем рассчитывать нужный размер предметов на экране в зависимости от того, какой угол получится между нашей виртуальной камерой и разницей в высоте предмета. Это позволит нам смоделировать разное расстояние до предметов, как будто у двухмерного плоского экрана появляется третье измерение — глубина.
3D графика. Для того, чтобы, скажем, повернуть объект, вы должны уметь манипулировать этими вершинами. Если вы хотите повернуть объект на некоторое количество градусов или радианов, вам придется использовать тригонометрические функции, чтобы определить, где он теперь находится. Базовая тригонометрия является основой для любых манипуляций, необходимых для игр.
Кватернионы и углы Эйлера.
Тема кватернионов довольно сложна в понимании с математической точки зрения. Тем не менее кватернионы играют важную роль при вращении объектов в трёхмерном пространстве. Используя привычные углы Эйлера , которые интуитивны для нас, мы рискуем словить эффект Gimbal lock, когда две оси вращения выстраиваются в одну плоскость ,тем самым с этого момента они отвечают за одну и ту же ось поворота. В результате теряется одна степень свободы. Что бы подобного не происходило и используются кватернионы.
Кватернионы — это четырехмерные числа, которые обычно используются в алгебре, физике и компьютерной графике для представления ориентации и вращения объектов в трехмерном пространстве.
На практике кватернионы – это не просто математический приём , а мощный инструмент для работы с трёхмерными вращениями.
Существует несколько путей представления вращения объектов. Многие программисты используют для этого прежде всего углы Эйлера. Данное решение работает замечательно, до тех пор, пока вы не попытаетесь осуществить гладкую интерполяцию между двумя разными положениями объекта. Например , представьте себе объект ,который свободно вращается в пространстве. Если хранить вращение , как матрицу или в виде углов Эйлера , то гладкая интерполяция окажется довольно дорогостоящей по вычислениям и будет не такой гладкой.
Многие игры от третьего лица располагают камеру на некотором расстоянии от персонажа. Так как камера имеет другое движение , отличающееся от движения персонажа. Например, при повороте персонажа – камера движется по дуге , то иногда бывает , что это движение выглядит не натурально, скачками. Это и есть та проблема, которую можно решить при помощи кватернионов.
Кватернион q задаётся четвёркой чисел (X, Y, Z, W).
w + xi + yj + zk
где i^2=j^2=k^2=-1
Интегралы и производные.
Интегралы и производные нужны для создания красивых , реалистичных и плавных физических движений. Они несут огромный физический смысл. Хотя многие физические движки дают очень хороший инструментарий для того, что бы не просчитывать каждый раз интегралы и производные. Однако их понимание значительно упростит изучение самого движка.
Производные и интегралы встречаются повсюду в игровой физике! Рассмотрим на примере приложенных сил для мяча, катящегося по рампе.Вам нужно знать вектор силы тяжести, массу мяча и угол наклона (его вектор нормали); Тогда вы сможете рассчитать результирующую силу, действующую на мяч, и определить ускорение мяча в этом кадре. В следующем кадре вы снова вычисляете это для новых условий и снова применять ускорение.
Это значение ускорения является производной от скорости мяча. Другими словами, значение ускорения, определяемое в каждом кадре, представляет собой скорость изменения скорости мяча. И скорость - это скорость изменения положения мяча также в каждом кадре. Чтобы реализовать эту физику, нам нужно будет отслеживать все 3 вектора в каждом кадре и добавлять ускорение к скорости, затем добавлять скорость к положению. И для этого у нас есть элементарный физический движок, использующий дискретное исчисление!
Производные также могут использоваться в логических задачах, таких как поиск путей, искусственный интеллект и другие виды решения для получения оптимальных решений.
Примером этого может быть генерация рек в генераторе ландшафта. Реки всегда текут под гору, поэтому, если вы случайным образом выберете исходную точку реки, вам нужно будет вычислить, в каком направлении идет спуск, и обычно это самое крутое направление спуска; Это делается с помощью частных производных, рассматривая местность как математическую поверхность.
Матрица
В математике матрица (множественное число матриц) — это прямоугольный массив или таблица чисел, символов или выражений, расположенных в строках и столбцах, которая используется для представления математического объекта или свойства такого объекта.
Матрица очень удобна для упаковки данных и их хранения. Так же мы можем получить аффинные преобразования. Другими словами мы можем получить поворот, отражение, масштабирование и прочие преобразования.
Начнём с одного из самых главных понятий –аффинные преобразования. Аффинные преобразования - это, по сути, преобразование системы координат (или пространства) с помощью умножения вектора на специальную матрицу. К примеру, такие преобразования, как перемещение, поворот, масштабирование, отражение и др. Основным свойствами аффинных преобразований является то, что вы остаётесь в том же пространстве (невозможно сделать из трёхмерного вектора двухмерный) и то, что если прямые пересекались/были параллельны/скрещивались до преобразования, то это свойство после преобразования сохранится. Помимо этого, у них очень много математических свойств, которые требуют знания теории групп, множеств и линейной алгебры, что позволяет работать с ними намного проще.
Особое внимание уделяется TRS матрице. Вторым важным понятием в компьютерной графике является TRS матрица. С помощью неё можно описать самые частые операции, используемые при работе с компьютерной графикой. TRS матрица – это композиция трёх матриц преобразования. Матрицы перемещения (Translation), поворота по каждой оси (Rotation) и масштабирования (Scale).
А теперь перейдём чуть глубже к контексту Unity . Начнём с того, что TRS матрица – это очень удобная вещь, но ей не стоит пользоваться везде. Так как простое указание позиции или сложение векторов в Unity будет работать быстрее, но во многих математических алгоритмах матрицы в разы удобнее векторов. Функционал TRS в Unity во многом реализован и в классе Matrix4x4, но он не удобен с точки зрения применения. Так как помимо применения матрицы через умножение она может в целом хранить в себе информацию об ориентации объекта, а также для некоторых преобразований хочется иметь возможность рассчитывать не только позицию, а изменять ориентацию объекта в целом (к примеру отражение, которое в Unity не реализовано). Все примеры ниже приведены для локальной системы координат (началом координат считается позиция GameObject’а , внутри которого находится объект. Если объект является корнем иерархии в Unity , то начало координат – это мировые (0,0,0).
Заключение
Мы рассмотрели использование математики в разработке игр и можем сказать, что они довольно тесно связаны. Поскольку разработка игр направлена на моделирование трехмерных или двухмерных миров, то придется столкнуться с большей или меньшей математикой. Само собой разумеется, что, то, что мы рассмотрели здесь является лишь верхушкой айсберга использования математики в разработке видеоигр , но для понимания того, что математика нужна этого достаточно.