Как работает 3D обнаружение столкновений / объектов? - PullRequest
54 голосов
/ 25 декабря 2009

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

Не может быть прослушиватель событий для каждого объекта? Итерации тоже не годятся? Мне просто интересно, как это на самом деле сделано.

Ответы [ 6 ]

59 голосов
/ 25 декабря 2009

На этот вопрос нет единого ответа, но большие миры часто разбиваются на пространства, используя что-то вроде quadtree или kd-tree , что приводит к поиску ближайших соседей. ниже линейного времени (дробная мощность или в худшем случае O (N ^ (2/3)) для 3D-игры). Эти методы часто называют BSP для разделения двоичного пространства.

Что касается обнаружения столкновений, то с каждым объектом обычно связан ограничивающий объем сетка (набор многоугольников, образующих выпуклый корпус), связанный с ним. Эти очень упрощенные сетки (иногда просто куб) не рисуются, а используются для обнаружения столкновений. Самый элементарный метод - создать плоскость, перпендикулярную линии, соединяющей средние точки каждого объекта с плоскостью, пересекающей линию в средней точке линии. Если ограничивающий объем объекта имеет точки по обе стороны от этой плоскости, это столкновение (вам нужно проверить только один из двух ограничивающих объемов относительно плоскости). Другой метод - улучшенный алгоритм расстояния GJK . Если вы хотите, чтобы учебное пособие прошло, ознакомьтесь с уроком NeHe Productions 'OpenGL # 30 .

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


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

9 голосов
/ 25 декабря 2009

Quadtrees и Octrees , еще одно quadtree , являются популярными способами, использующими разбиение пространства для достижения этой цели. В последнем примере показано снижение обработки на 97% по сравнению с поиском столкновений методом перебора парой.

4 голосов
/ 25 декабря 2009

Обычная техника в движках игровой физики - это метод сметания и сокращения. Это объясняется в примечаниях SIGGRAPH Дэвида Бараффа (см. Главу «Движение с ограничениями»). Havok определенно использует это, я думаю, что это вариант в Bullet, но я не уверен насчет PhysX.

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

Как только развертка обнаружит перекрытие между AABB, вы можете выполнить более детальную проверку объектов, например, сфера против коробки. Если при детальной проверке обнаруживается коллизия, вы можете разрешить коллизию, применяя силы, и / или вызвать игровое событие или воспроизвести звуковой эффект.

2 голосов
/ 25 декабря 2009

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

см. Как мои игровые сущности должны знать о вещах вокруг них?

1 голос
/ 22 декабря 2010

Я бы хотел порекомендовать солидную книгу Кристера Эриксона по обнаружению столкновений в реальном времени. В нем представлены основы обнаружения столкновений и даны ссылки на современные исследования.

Обнаружение столкновений в реальном времени (серия Моргана Кауфмана в интерактивной трехмерной технологии)

1 голос
/ 25 декабря 2009

Существует много вариантов оптимизации. Во-первых, любой объект (например, с индексом i) ограничен кубом с координатами центра CXi, CYi и размером Si Во-вторых - обнаружение столкновений работает с оценками:

а) Найти все пары кубов i, j с условием: Abs(CXi-CXj)<(Si+Sj) AND Abs(CYi-CYj)<(Si+Sj)

б) Теперь мы работаем только с парами, попавшими в а). Мы вычисляем расстояния между ними более точно, что-то вроде Sqrt(Sqr(CXi-CXj)+Sqr(CYi-CYj)), объекты теперь представляются в виде наборов из нескольких чисел простых фигур - кубов, сфер, конусов - и мы используем геометрические формулы для проверки пересечения этих фигур.

в) Объекты из б) с обнаруженными пересечениями обрабатываются как столкновения с физическими вычислениями и т. Д.

...