Столкновения в компьютерных играх - PullRequest
4 голосов
/ 06 сентября 2011

У меня есть общие вопросы, касающиеся методов или подходов, используемых в компьютерных играх для обнаружения частиц (или столкновений объектов).Даже в простых примерах, как в настоящее время популярные злые птицы, как программно достигается то, что игра знает, что объект поражает другой, и определяет его траекторию, в то время как этот объект может поражать другие и т. Д. Я предполагаю, что он не постоянно проверяет состоянияВСЕ объекты на игровой карте ...

Спасибо за любые подсказки / ответы и извините за небольшой дурацкий / общий вопрос.

Ответы [ 3 ]

5 голосов
/ 06 сентября 2011

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

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


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

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

Одна техника для этого называется "квадри". Другая техника, которую вы можете использовать, это Binary Space Partitioning . В обоих случаях сцена разбита на множество мелких частей, которые вы можете использовать для организации сцены.


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

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

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

1 голос
/ 06 сентября 2011

num1 ответ охватывает большую часть того, что я бы сказал, и поэтому я проголосовал за него. Но есть несколько модификаций / дополнительных моментов, которые я хотел бы сделать:

1) Ограничивающие рамки являются вторым самым простым способом проверки столкновения. Самый простой способ - это дистанционные проверки; просто посчитайте, как далеко эти два объекта находятся друг от друга, и если они достаточно близко, то они сталкиваются.

2) Другим распространенным способом организации сцены с целью оптимизации тестов на столкновение (т. Е. Альтернативой BSP) является квадродерево. В любом случае, в основном вы разбиваете сцену на зоны, а затем сначала проверяете, в какой зоне находится персонаж, а затем проверяете столкновение с каждым объектом в этой зоне. Таким образом, если уровень огромен, вы не проверяете каждый объект на уровне; Вы можете отбросить все объекты, которые слишком далеко от игрока, чтобы иметь значение.

3) Я бы подчеркнул, что Angry Birds использует физический движок для обработки своих столкновений. Хотя проверки расстояния и ограничивающие рамки подходят для большинства 2D-игр, Angry Birds явно не использовали ни один из этих простых методов, а вместо этого полагались на обнаружение столкновений из своего физического движка. Я не знаю, какой физический движок используется в этой игре, но Box2D широко используется и имеет открытый исходный код.

1 голос
/ 06 сентября 2011

Это один из тех, на которые сложно ответить на вопросы здесь, но вот очень простой пример в 2D, как очень базовый пример, в псевдокоде.

for-each sprite in scene:
  for-each othersprite in scene:
    if sprite is not othersprite & sprite.XY = othersprite.XY
       collision = true;
    else
       collision = false;

Надеюсь, чтодолжно быть достаточно, чтобы ваши мыслительные мышцы работали!

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

Что касается теории 3D, я дам вам статью, которую я недавно читал:

http://www.euclideanspace.com/threed/animation/collisiondetect/index.htm

...