Я использовал квад-дерево в более крупном проекте, что хорошо для игровых объектов, которые не двигаются много (меньше удалений и повторных вставок). Тот же принцип применяется к октодам.
Основная идея заключается в том, что вы создаете рекурсивную древовидную структуру, в которой хранятся 4 (для четырехугольника) или 8 (октавные) дочерние объекты того же типа, что и корень дерева. Каждый узел в дереве представляет часть декартового пространства, например, -100 -> +100 на каждой применимой оси. каждый дочерний элемент представляет то же пространство, но подразделяется на половину (непосредственный дочерний элемент примера будет представлять, например, -100-> 0 по оси X и -100-> 0 по оси Y).
Представьте себе квадрат или плоскость с заданным набором размеров. Теперь проведите линию через центр на каждой оси, разделив эту плоскость на 4 меньшие плоскости. Теперь возьмите один из них и делайте это снова и снова, пока не дойдете до точки, когда размер сегмента плоскости примерно равен размеру игрового объекта. Теперь у вас есть дерево. Только объекты, занимающие одну и ту же плоскость, могут столкнуться. Когда вы определили, какие объекты могут сталкиваться, вы генерируете пары возможных столкновений из них. На этом этапе широкофазная фаза завершена, и вы можете перейти к узкофазному обнаружению коллизий, что и делает ваши более точные и дорогостоящие вычисления.
Цель Broadphase, состоит в том, чтобы использовать недорогие вычисления для генерации возможных коллизий и отбирать контакты, которые не могут произойти , тем самым сокращая работу, которую должен выполнять ваш узкофазный алгоритм, в свою очередь, делая весь алгоритм обнаружения столкновений более эффективен.
Итак, прежде чем идти вперед и попытаться реализовать такой алгоритм, как вы:
Сколько объектов в моей игре?
Если их много, мне, вероятно, нужна широкая фаза. Если нет, то Nnarrowphase должно быть достаточно.
Кроме того, я имею дело со многими движущимися объектами?
Древовидные структуры обычно замедляются движущимися объектами, так как они могут со временем менять свое положение в дереве, просто перемещаясь. Это требует, чтобы объекты были удалены и повторно вставлены каждый кадр (потенциально), что меньше, чем идеально.
Если это так, вам лучше использовать Sweep и Prune, которые поддерживают минимальные / максимальные кучи экстентов форм в вашем мире. Объекты не нужно повторно вставлять, но кучи нужно восстанавливать в каждом кадре, хотя обычно это происходит быстрее, чем по всему дереву, обход с удалением и повторной вставкой.
В зависимости от вашего опыта написания кода, один код может быть сложнее другого. Лично я обнаружил, что деревья более интуитивно понятны для кода, но менее эффективны и более подвержены ошибкам, так как они вызывают другие проблемы, например, что делать, если у вас есть объект, который находится непосредственно над осью или в центре корневого узла. Эту проблему можно решить с помощью рыхлых деревьев, которые имеют некоторое пространственное перекрытие, поэтому один дочерний узел всегда имеет приоритет над другими при таком случае.