Один простой способ ускорить этот запрос - создать следующую однородную сетку структуру данных (часто называемую ячейками) в качестве шага предварительной обработки: поместите сетку n x n x n
(в 3d) на вашу сцену и для каждая ячейка сетки хранит указатель на все кубоиды, пересекающие эту ячейку. Теперь для точки запроса вы можете непосредственно вычислить, в какой ячейке она находится в равномерной сетке, а затем вам нужно проверить только кубоиды, связанные с этой ячейкой, а не все кубоиды.
В зависимости от того, насколько велико пространство и насколько различны размеры кубов, этот метод может быть не очень эффективным, поскольку вам может быть трудно выбрать хорошее разрешение n
для ускорения, достаточного и не требующего огромного количества ячеек. Чтобы преодолеть это, вы можете попытаться найти более адаптивные способы разделения пространства, такие как kd-trees (kd-trees в Википедии) , которые в основном являются разделением двоичных деревьев пространство с плоскостями, выровненными по оси: см. здесь пример, где красная плоскость делит прямоугольник на две части, а затем зеленый на более мелкие части, а затем синий ...
Запрос, использующий kd-дерево, сначала будет проходить вниз к листу kd-дерева, где находится точка запроса, а затем проверять локальные кубоиды в этой ячейке. Другая структура данных разделения пространства варианты можно найти здесь .
Другой вариант - использовать иерархии ограничивающих томов , которые группируют объекты в ограничивающие тома, а затем группируют ограничивающие тома в большие ограничивающие тома и т. Д., Чтобы получить иерархию ограничивающих томов. Они лучше адаптируются к сцене и могут легче обрабатывать сцены, в которых перемещаются объекты, но я думаю, что разделение пространства настроек может работать хорошо ... В любом случае, для получения более подробной информации см. главу этой книги .