Серия видеоигр: Vectors

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

Итак, я разрабатывал 2D-шутер на JavaScript и подумал, что было бы неплохо поделиться некоторыми вещами, которым мне пришлось научиться с нуля. Изначально я перемещал позицию игрока, меняя переменные x и y. Итак, если я нажму D, мой игрок перейдет с x = 2 на x = 4.

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

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

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

Итак, я надеюсь, что этот урок изменит ваш взгляд на математику, особенно на векторы в данном случае.

Что такое вектор?

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

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

Итак ... В чем же тогда настоящая разница?

Как видно на рисунке, у вектора есть направление, представленное стрелкой, и величина, представленная длиной линии. В этом случае начало вектора - (0,0).

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

Векторная математика

У векторов есть свой набор правил и операций, которые немного отличаются от обычной математики, но на самом деле это совсем не сложно.

Сложение и вычитание

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

Представьте, что мы пытаемся найти спрятанное сокровище, и все, что у нас есть, - это набор векторов, которые могут привести нас к его точному местонахождению. Векторы: (4, 3), (10, 4) и (-4, -9) в указанном порядке.

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

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

Вот как это выглядело бы на самом деле, если бы мы сначала перешли к (4,3), затем (10,4) и затем (-4, -9) - в указанном порядке.

Итак, сначала мы пошли к вектору (4,3), оттуда мы пошли (10,4) и достигли (14,7), оттуда мы пошли (-4, -9) и наконец достигли сокровища, которое мы теперь знаем. находится в (10, -2).

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

Умножение и деление

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

Чтобы умножить вектор и константу, мы просто умножаем все компоненты вектора на константу. Например, умножение вектора (1, 5) на 5 даст вектор (5,25). Это та же процедура разделения. Легко, правда?

Чтобы умножить два вектора, мы просто умножаем каждый компонент, и все. Так что умножьте X и Y, как при сложении.

Нахождение расстояния между двумя векторами

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

Distance = Sqrt ((u.X-v.X) ² + (u.Y-v.Y) ²), где u и v - два разных вектора.

Зная расстояние между объектами, мы можем узнать, находятся ли наши игроки вне досягаемости и могут или не могут атаковать кого-то.

В поисках величины

Чтобы найти длину вектора, также известную как величина, все, что нам нужно сделать, это использовать старую добрую теорему Пифагора. Поскольку у нас есть X и Y, мы просто пытаемся найти гипотенузу воображаемого треугольника.

Нормализующие векторы

Вектор можно нормализовать, разделив каждый компонент (X и Y) на его величину.

После нормализации вектора его величина всегда будет равна 1. Другими словами, направление сохраняется, но вектор конвертируется в единичную версию своего предыдущего «я».

Это будет невероятно полезно при поиске скалярного произведения, о котором мы узнаем позже.

Точечный продукт

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

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

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

Это даст нам уравнение, в котором угол = cos (вектор U * вектор V) ^ - 1

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

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

Давай перейдем к делу.

Векторы в видеоиграх

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

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

Допустим, у нас есть ИИ противника, которому нужно стрелять во все ящики, с которыми он сталкивается. Представьте, что ИИ имеет вектор скорости и направления (1,0), и он стоит в начале карты, поэтому (0,0). Он находит коробку в позиции (2, 3), поэтому мы хотим повернуть его, чтобы он мог указать на коробку и выстрелить в нее, но нам нужно вычислить угол между тем, куда он целится, и тем, куда он хочет на самом деле прицелиться. коробка.

Чтобы вычислить вектор, указывающий на коробку, мы просто вычитаем положение коробки за вычетом позиции игрока, поэтому (2,3) - (0,0) = (2,3) в нашем очень простом примере.

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

Мы видим, что вектор (1,0) уже нормализован, потому что его величина равна 1, но нам все еще нужно нормализовать (2,3). Его величина равна sqrt (13), и ее нормализация приведет к примерно (0,55, 0,83).

Затем мы просто умножаем (0,55 x 1, 0,83, 0) = (0,55, 0) и получаем обратный косинус этого значения. Угол будет ок. 0,9884 радиана, потому что я использовал только два десятичных знака, но вы поняли.

Радианы - это обычная практика, поэтому, если вы привыкли к градусам, просто знайте, что 360 градусов = 2 радиана.

Радианы гораздо менее произвольны и, таким образом, упрощают преобразование и вычисление углов и т. Д. В градусах вы всегда должны использовать 360 в качестве основы.

Так просто удобнее, так что тебе стоит к этому привыкнуть.

Наконец, мы можем реализовать наш класс Vector2D, чтобы использовать его в следующей части этой серии.

Начните разминку с создания класса vector2D самостоятельно, потому что в следующем эпизоде ​​мы углубимся в реализацию игровой логики и фактически будем использовать векторы для управления движением и многих других замечательных вещей.

Я надеялся, что вам понравилось, и следите за новостями.