Какой метод следует использовать, чтобы обрезать 2d проверки столкновений? - PullRequest
14 голосов
/ 06 января 2009

С самого начала обнаружение столкновений ощущается как проблема O (n ^ 2).

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

Вот пример моей простой программы, над которой я работаю:

alt text

Если у вас есть 1000 шаров, то, если вы пошли с наивным обнаружением столкновений, у вас было бы 1000 ^ 2 проверок сбора (миллион)! Эта проверка столкновения быстро стала узким местом в моем приложении. Мне нужно , чтобы реализовать широкое сокращение фазы.

Какие приемы следует использовать для сокращения проверок столкновений при работе с двумерными объектами? Я читал о QuadTrees, BSP, пространственном хешировании и т. Д., Но трудно разобраться, какой метод наиболее подходит для этого варианта использования.

Кто-нибудь знает, что может работать лучше?

Ответы [ 3 ]

7 голосов
/ 06 января 2009

Пространственное хеширование. См. Страницу Уго Элиаса об этом .

6 голосов
/ 06 января 2009

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

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

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

2 голосов
/ 06 января 2009

Я второй метод Grid. Двухмерное моделирование шаров не принесет пользы от QuadTrees (которые обычно используются, когда у вас сложная геометрия, такая как персонажи и здания) или BSP (которые вы должны выбрать, если у вас очень неравномерное распределение / концентрация объектов, например, с высокой концентрацией зоны и зоны с низкой концентрацией в многопользовательской или стратегической игре)

...