Bounding Spheres, вероятно, поможет вам со многими движущимися объектами; Вы вычисляете квадрат радиуса объекта и отслеживаете его от его центра. Если квадрат расстояния между центрами двух объектов меньше суммы квадратов радиусов двух объектов, то у вас есть потенциальное столкновение. Все сделано с квадратными расстояниями; без квадратных корней.
Вы можете сортировать ближайших соседей по минимальному квадрату расстояния между вашими объектами. Разумеется, обнаружение столкновений может быть сложным, и с объектами несферической формы Bounding Spheres не обязательно будут получать информацию о столкновениях, но они могут обрезать ваше дерево объектов, которое вам нужно сравнивать на предмет столкновений довольно хорошо.
Вам, конечно, нужно будет отслеживать ЦЕНТР вашего объекта; и в идеале вы хотели бы, чтобы каждый объект был жестким, чтобы избежать необходимости пересчитывать размеры ограничивающей сферы (хотя пересчет не является особенно сложным, особенно если вы используете дерево жестких объектов, каждый из которых имеет собственную ограничивающую сферу для объектов, которые не являются жесткими, но это становится сложным).
По сути, чтобы ответить на ваш вопрос о структурах данных, вы можете хранить все свои объекты в главном массиве; У меня будет набор массивов «region», которые состоят из ссылок на объекты в массиве master, в которые можно быстро отсортировать объекты на основе их декартовых координат; массивы "region" должны иметь перекрытие, определенное как минимум в 2 раза больше самого большого радиуса объекта в вашем массиве мастер-объектов (если это возможно; очевидно, возникает вопрос о масштабировании ограничивающей сферы объекта в зависимости от количества объектов).
Как только вы это получите, вы можете выполнить быстрый тест на столкновение, сравнивая расстояния между всеми объектами в регионе друг к другу; Опять же, именно здесь определение региона становится важным, потому что вы делаете значительный компромисс между количеством регионов и количеством сравнений. Однако это немного проще только потому, что ваши сравнения расстояний сводятся к простым вычитаниям (и, конечно же, операциям abs ()).
Конечно, тогда вы должны выполнить фактическое обнаружение столкновений между вашими несферическими объектами, и это может быть нетривиальным, но в этот момент вы значительно сократили число потенциальных сравнений.
По сути, это двухуровневая система; Во-первых, это массив регионов, посредством которого вы делаете грубую сортировку на вашей сцене. Во-вторых, у вас есть сравнение расстояний между регионами; при этом вы будете выполнять базовое обнаружение столкновений и пометку столкновений на объектах, которые столкнулись.
Вероятно, в этом алгоритме есть место для использования деревьев при динамическом определении региона, чтобы выровнять размеры вашего региона, чтобы гарантировать, что размер вашего региона не будет расти слишком быстро с "переполненными" регионами; Однако подобные вещи нетривиальны, потому что с объектами разных размеров ваш вид по плотности становится ... сложным, если не сказать больше.