Ограничивающие прямоугольники в октреях


9

Я видел, что октреи часто используются для таких вещей, как отбраковка усеченного конуса и обнаружение столкновений в 3D. Но я просто не уверен, как работает алгоритм вообще. Конечно, весь принцип октодерева нарушается, когда вы пытаетесь использовать ограничивающие блоки, потому что любой данный блок может храниться в одном узле, но фактически перекрывать пространство, представленное другим узлом. Кроме того, я не уверен, как это может сработать при поиске ограничивающих рамок, а не точек, потому что, опять же, вы можете застрять, просматривая практически все узлы, побеждая цель.

Так как же октреи справляются с ограничивающими рамками?

Ответы:


12

Октодерево (3D) использует те же самые концепции как квадрадерево (2D). Если вы прочитаете и поймете статью в Википедии о Quadtrees, вы сможете применить те же концепции в 3D.

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

Основная концепция заключается в том, что мировое пространство делится на «ведра»: квадраты для 2D или кубы для 3D. С пустым миром вы начинаете с одного квадрата или куба, который охватывает весь мир. Когда вы добавляете объекты в мир, вы начинаете с корневого узла и прокладываете путь к дереву в зависимости от местоположения и размера объекта. Если целевое ведро достигает емкости, вы делите его, разбивая квадраты на 4 меньших квадрата (квадри) или разделяя кубы на 8 меньших кубов (октри). Каждый объект, который вы добавляете в мир, вставляется в дерево только настолько глубоко, насколько он может физически вписаться в границы ковша. Если объект не помещается в границы текущего сегмента, вы должны переместить объект в наименьший родительский сегмент, внутри которого он полностью помещается.

Обратите внимание, что использование Quadtree или Octree является излишним, если в вашем мире мало объектов. Есть также решения с открытым исходным кодом для обоих.


Я думаю, он знает это. Я считаю, что путаница заключается в том, как обрабатывать том, который не вписывается в подразделение.
ClassicThunder

2
Я упоминаю, что «Если объект не помещается внутри границ, он должен храниться на один уровень выше». И это также звучало так, будто ФП был немного озадачен тем, как Октри работал в целом, основываясь на его втором предложении.
Джон Макдональд

Разве это не нарушает фундаментальное ограничение октодов, что в каждом узле только семь или меньше?
DeadMG

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

@DeadMG, «Октябрь», как в восьмерке (Октагон, Октан и т. Д.). Когда корневой узел разделяется, у него будет 8 дочерних элементов: северо-восток вверх, северо-восток вниз, NWU, NWD, SEU, SED, SWU и SWD, всего 9 узлов, включая. корень. Если один из этих дочерних узлов разделяется, этот узел также будет иметь 8 подузлов, по одному для каждого квадранта, как и раньше, что в сумме составит 8 + 8 + 1 = 17 узлов. Если все ваши объекты помещаются прямо на границе корневого узла и не помещаются ни в один из 8 квадрантов, да, это будет O (N), и вам придется проверять каждый объект, и вы не сможете сохранить какие-либо Сравнивает, на самом деле это будет стоить.
Джон Макдональд

3

n-деревья - самая известная, но не единственная доступная система пространственного разбиения. Есть много, много других. Немного больше информации о данных, которые у вас есть, во многом поможет найти лучший выбор. Ваши коробки меняют размер или передвигаются? Насколько они большие? Сколько их там? У вас много вставок / удалений?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.