Обнаружение столкновений между динамическими объектами в 2D-среде

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

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

Существуют ли какие-либо другие подходы к этой проблеме, кроме деревьев квадрантов? Есть ли способ улучшить подход quad-tree? Может быть, воссоздание дерева на каждом кадре не так затратно?


person Community    schedule 13.09.2012    source источник


Ответы (1)


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

person Gareth Rees    schedule 13.09.2012
comment
Если все частицы в квадроцикле медленнее нижнего предела, вы можете обновить этот квадроцикл через 2 или 3 кадра. Если все остановлено, то даже 5-кадровый апдейт неплох. Когда что-то входит в этот квадрат, конечно, это устанавливает логическое значение updateQuad в значение true. - person huseyin tugrul buyukisik; 14.09.2012