Ограничивающие сферы, вероятно, помогут вам со многими движущимися объектами; вы вычисляете квадрат радиуса объекта и отслеживаете его из центра. Если квадрат расстояния между центрами двух объектов меньше суммы квадратов радиусов двух объектов, то у вас есть потенциальное столкновение. Все сделано с квадратными расстояниями; нет квадратных корней.
Вы можете отсортировать ближайших соседей по минимальному квадрату расстояния между объектами. Разумеется, обнаружение столкновения может быть сложным, и с объектами, не имеющими сферической формы, Bounding Spheres не обязательно будет получать информацию о столкновениях, но это может сократить ваше дерево объектов, которое вам нужно сравнить для столкновения довольно хорошо.
Вам понадобится, конечно, отслеживать ЦЕНТР вашего объекта; и в идеале вы хотели бы, чтобы каждый объект был жестким, чтобы избежать необходимости пересчитывать размеры ограниченной сферы (хотя перерасчет не является особенно сложным, особенно если вы используете дерево жестких объектов, каждый со своей собственной ограничивающей сферой для объектов, которые являются нежесткими, но они усложняются).
В принципе, чтобы ответить на ваш вопрос о структурах данных, вы можете сохранить все свои объекты в главном массиве; У меня будет набор «региональных» массивов, которые состоят из ссылок на объекты в главном массиве, которые вы можете сортировать объекты быстро, основываясь на их декартовых координатах; массивы «региона» должны иметь перекрытие, определяемое по крайней мере в два раза наибольшим радиусом объекта в вашем массиве основных объектов (если это возможно, вопрос о масштабировании сферы, ограничивающей сферу объекта, и количество объектов, очевидно, появляется).
у вас это есть, вы можете сделать быстрый тест на столкновение, сравнивая расстояния между всеми объектами в регионе друг с другом, и снова это определение региона становится важным, потому что вы делаете значительный компромисс между количеством регионов и цифрами Конечно, это немного проще, потому что ваши сравнения расстояний сводятся к простым вычитаниям (и абс(), конечно,).
Конечно, вам необходимо сделать фактическое обнаружение столкновений между вашими несферическими объектов, и это может быть не-t но вы значительно сократили количество возможных сравнений в этот момент.
В принципе, это двухуровневая система; первым является массив областей, в котором вы делаете грубую сортировку на своей сцене. Во-вторых, у вас есть расстояние между регионами; в котором вы собираетесь выполнять базовое обнаружение столкновений и помехи при столкновении на объектах, которые столкнулись.
Вероятно, есть место в этом виде алгоритма для использования деревьев в динамической области, чтобы выровнять размеры вашего региона, чтобы ваш регион не увеличивался слишком быстро с «переполненными» регионами; тем не менее, такая вещь нетривиальна, потому что с объектами разного размера ваш вид по плотности становится ... сложным, мягко говоря.
Я понимаю, что использование шаров сделает столкновение более быстрым и что использование областей разделяет пространство и ограничивает количество сравнений, НО вы должны перепроверить эти «регионы», и это медленно? Я ищу структуру данных, которая может быстро обновлять свои «регионы». – esiegel 2008-10-25 00:36:10