Векторы в разработке игр

19

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

Я нашел примеры, но в основном они находятся в консоли, где они выводят числа, и большие примеры, которые я не понимаю.

vqwer
источник
Basic TL; DR Векторы являются частью темы линейной алгебры и ведут к матричности. С помощью Matricies и Linear Algebra вы пишете что угодно, от решателя Minesweeper до 3D проекции мира, чтобы увидеть, какой объект находится под вашим курсором. Линейная алгебра - единственная наиболее полезная и необходимая ветвь математики для любого разработчика игр. Узнайте это сейчас; Вы не будете сожалеть об этом.
Роберт Массайоли
Спасибо всем за все удивительные ответы! Но почему что-то вроде не использовать Vector в этом уроке ?: zetcode.com/tutorials/javagamestutorial Или один разработчик использует другого нет?
vqwer
Трудно сказать, наверное, автор хотел, чтобы все было просто и понятно для начинающих.
Майк Земдер
На самом деле автор использует их, посмотрите на массив точек class Star здесь
Maik Semder
Также здесь будет Point2Dиспользоватьсяclass ResizeRectangle
Maik Semder

Ответы:

31

Какие векторы?

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

  • 1-D вектором будет {1} . Это может быть, например, позиция в X = 1. Или время t = 1.
  • Двумерный вектор будет {-4,3} . Это может быть, например, положение в точке -4 на оси X и 3 на оси Y. Это также может быть температура (3 градуса) в положении (-4 метра) назад по оси X.
  • Трехмерный вектор будет {1,2,3} . Это может быть положение в пространстве 1 вдоль оси X, 2 назад на оси Y и 3 вверх на оси Z. Или это может быть 1 красный, 2 зеленых и 3 синих цвета. Или это может быть позиция XY ( {1,2} ) в некоторый момент времени T ( {3} ).

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

Почему я использую векторы?

Во-первых, вам никогда не придется использовать векторы. Пока вы отслеживаете x и y или любые другие координаты, которые вас интересуют, в некотором смысле вы в порядке.

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

Для простого примера рассмотрим точечное произведение .

Предположим, у вас есть радарная система в стиле сверху вниз. Каждый враг, который появляется в секторе радара (какой-то клиновидный клин в 2D), должен получить маленькую красную точку на вашем экране. Итак, вам нужно выяснить, какие враги в вашем разделе радара.

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

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

  1. Создайте вектор, идущий от центра радара к «передней части радара». Нормализуй это.
  2. Создайте вектор, идущий от центра радара к объекту, для которого мы хотим проверить видимость радара. Нормализуй это.
  3. Возьмем скалярное произведение двух нормализованных векторов.
  4. Возьмите арккозин этого продукта и убедитесь, что он меньше половины ширины радара. Если это так, нарисуйте блик.

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

Почему еще я использую векторы?

Если вы находитесь в 2D, возможно, лучший способ достижения сложных эффектов и движений (вращение, масштабирование и т. Д.) - это использование графа сцены. У планеты есть орбитальный корабль, у корабля есть орбитальный дрон. Расчет для этого без использования векторной математики действительно, очень уродлив.

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

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

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

Заключение Векторы - это мощный инструмент для написания понятного кода, который решает геометрические проблемы чисто и элегантно.

ChrisE
источник
14

Пример 2D - это экранные координаты, он идентифицирует пиксель на экране и имеет x- и y-компоненту [x, y], т.е. левую верхнюю позицию экрана [0, 0]

Другой пример: представьте, что текст прокручивается от правой границы экрана к левой границе экрана. Теперь вам нужно определить скорость прокручиваемого текста в пикселях в секунду, т.е. [-20, 0], что означает, что текст прокручивается на 20 пикселей влево в секунду и никогда не меняет высоту.

Еще один более сложный пример: представьте себе 2D-игру, которая должна работать на разных разрешениях экрана 800x600, 1024x768 и т. Д. Это легко сделать, используя внутреннюю ширину экрана от 0,0 до 1,0 и высоту от 0,0 до 1,0, чтобы отделить игровую логику. от фактического разрешения экрана. Теперь, когда вы рисуете на экране, вы просто умножаете внутренний вектор на вектор разрешения:

screen_pos = internal_pos * screen_ressolution

обратите внимание, что все 3 переменные здесь являются двумерными векторами, они имеют x- и y-компоненту, то есть для этого internal_pos [0.5, 0.25]:

[400, 150] = [0.5, 0.25] * [800, 600]

Таким образом, внутренняя позиция [0,5, 0,25] преобразуется в фактическую позицию экрана [400, 150].

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

Майк Земдер
источник
Разве вектор не является одним массивом измерений, как какой-то список? Когда мы говорим о разрешении экрана, не говорим ли мы о многомерном массиве (одна координата для каждой оси X и Y)? Просто чтобы убедиться, что вектор не перепутан с матрицей. =)
Уилл Маркуиллер
@ Полные пиксельные данные для экрана можно рассматривать как многомерный массив, в основном растровое изображение, но значения ширины и высоты, другими словами, разрешения, не могут
Maik Semder
2
Обратите внимание, что вектор часто трактуется по-разному в математике и в программировании. Математически говоря, вектор не является многомерным массивом, хотя его компоненты относительно некоторого базиса вместе определяют такой массив. Сам вектор является координатно-инвариантным. Операция неscreen_pos = internal_pos * screen_resolution является координатно-инвариантной, как вы ее написали, ее можно было бы более уместно записать , где есть линейное отображение (которое может быть записано как матрица, в данном случае диагональное). screen_pos = map_to_screen * internal_posmap_to_screen
оставлено около
6

Вот отличное объяснение векторов в разработке игр в блоге Wolfire Games:

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

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

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

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

Эран Гальперин
источник
Скорость это скаляр, это длина вектора скорости
Maik Semder
Правильно - исправлено
Эран Гальперин
1
и местоположение обычно рассматривается как вектор, это расстояние, которое является скалярным.
Ali1S232
Положение может рассматриваться как скаляр (или набор скаляров) или вектор, указывающий от начальной точки оси.
Эран Гальперин
1

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

Для базовых вещей не имеет значения, считаете ли вы эти числа векторами, но если вы хотите заниматься какой-либо физикой, вам следует изучить векторную математику.

AAAAAAAAAAAA
источник
Позиция не вектор
Эран Гальперин
Скорость
тоже не
2
@Eran Galperin Я знаю, что это довольно распространенное мнение среди математиков. Однако различие между точкой и вектором ее положения довольно академично. Нет никаких практических причин для суеты по поводу различия.
аааааааааааа
1
Есть практические причины, когда вы работаете с 4D однородными координатами и матрицами, вы должны сделать это различие. Хотя это не относится к объему этого вопроса.
Майк Земдер
@eBusiness это не «взгляд», это факт. А я по образованию физик, а не математик.
Эран Гальперин
0

Очень просто, что-нибудь с позицией или направлением, которое везде в игре, они используют векторы. Вектор как точка

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

Однако разница действительно сводится к этому. Точка - это просто точка, а вектор - стрелка.

если у вас есть

Point2.x = 5;

Point2.y = 10;

Вы говорите, что я имею в виду в этом месте х 5 и у 10.

Однако, когда вы объявляете вектор ...

Vector2.x = 5;

Vector2.y = 10; 

Вы действительно говорите, что я объявляю стрелку от 0,0 до х 5, у 10;

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

point2.x = 10;

point2.y = 15;

Теперь вы можете использовать вектор, чтобы переместить эту точку, скажем, мы хотим переместить эту точку вверх по оси X на 10 единиц, чтобы вы имели

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

Теперь точка переместилась туда, куда указала ваша векторная стрелка.

точка сейчас

point2.x = 20;

point2.y = 15;

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

EddieV223
источник
Точка - это вектор. Это вектор от начала координат до точки P.
Коммунистическая утка
1
@ Технически говоря, это неверно, ссылаясь на однородные координаты, вектор можно найти, вычитая origin_point из position_point, но это не делает их равными: v = pos - originтак v != posкак origin является точкой{0, 0, 0, 1}
Maik Semder
@Duck: точка - это не вектор, а точка, а начало координат определяет вектор, что в большинстве случаев хорошо, если
@ Дак, тогда почему ты назвал это своей точкой Р? LOL
EddieV223