Как использовать квадро/октавное дерево для блочного мира

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

Вот некоторые идеи, о которых я думал:

1) Вы используете квадро/октавное дерево, чтобы разделить заданный куб (10x10x10) и разделить его до тех пор, пока хотя бы один лист не станет однородным; затем вы удаляете все другие листы, которые не являются однородными, давая вам различные размеры куба.

2) Вы делите точку в пространстве (x, y, z) до тех пор, пока не получите куб, имеющий хотя бы один лист одинакового размера или достигший глубины узла, и используйте все эти позиции (x, y,z) в качестве позиции для разных типов блоков.

Может ли кто-нибудь объяснить логику использования октодерева или квадродерева при построении такой трехмерной среды? Он основан на x, y, z или на постоянном кубическом измерении? Я очень не уверен, как поступить.


person User    schedule 16.07.2012    source источник
comment
Размер и глубина октодерева примерно такие же, как размер листовых узлов, они обратимы. Октодерево размера (x, y, z) с 10 разбиениями будет иметь размер листа (x, y, z)/2^10.   -  person David    schedule 16.07.2012


Ответы (2)


Octree действительно помогают вам сосредоточиться на разделении кусков кубического мира на равные части. Хитрость, которую они используют, заключается в том, что по мере того, как вы продолжаете вводить кубы в ветви октодерева, вы автоматически подразделяете их на части, которые вы можете позже извлечь на основе близости (например, Chunk01 (128,0,0) Chunk02 (256,0,0). ) и т.д..)

Когда вы сохраняете кубы в октодереве, вы также определяете их «тип» (материал или какое-то перечисление, которое их описывает). Делая это, вы также позволяете Octree группировать эти кубы вместе, если они становятся соседями (например, трава, камень, песок и т. д.). Затем это позволяет алгоритму октодерева обрабатывать некоторые сведения о том, как свернуть / сжать их в 1x больший примитив квадрата / прямоугольника, что позволит вам уменьшить количество кубов.

В конце концов, у вас есть два подхода к кубическому миру: во-первых, вы хотите, чтобы конечный пользователь поверил, что вы создали мир 1x куб за раз, но на самом деле вы фактически объединяете количество мешей/вершин, чтобы получить эта иллюзия в виде куска поверхности на самом деле представляет собой всего лишь 1x большую сетку, а не 100 кубов. Только когда пользователь взаимодействует с кубом (то есть удаляет/добавляет), вы пересчитываете свою сетку и воплощаете иллюзию множества кубов в реальность... но затем вы сразу же заменяете ее обратно на гигантскую консолидированную сетку.

После того, как вы запустили свое октодерево и у вас есть консолидация фрагментов в единую форму сетки (путем подачи массива вершин в буфер графического процессора), вам также нужно выполнить некоторую дополнительную работу вне октодерева, связанную с отбраковкой. Есть целая куча способов, которыми вы можете это сделать, объемная отбраковка (трассировка лучей), как правило, является тем, что я считаю наиболее рекомендуемым, но я думаю, что это можно было бы сделать лучше.

В моем примере здесь: https://vimeo.com/71330826 я в основном подхожу к этому по-другому, в том, что я знаю где находится центральная точка камеры, и я также отслеживаю, в каком направлении смотрит камера, а затем в основном использую это как отбраковку, ориентированную на близость, при которой, если рассматриваемый фрагмент находится за камерой, я уничтожаю их, уменьшая нагрузку на мой GPU по мере продвижения.

Также вы заметите, что каждый «кусок» по-прежнему имеет лицо, видимое снаружи, поскольку я отбрасываю внутреннюю часть каждого куска от создания, но, учитывая, что каждый фрагмент обрабатывает свою собственную рабочую нагрузку, я все еще визуализирую фактические «стены» фрагмента. под камерой... что я позже исправил, также отслеживая глубину Z пользователя и границы камеры

person Scott Barnes    schedule 03.08.2013

Quadtrees являются двумерными, поэтому не имеет смысла использовать их для представления трехмерного пространства.

Существует множество способов использования октодеревьев. Реализация, безусловно, упрощается, если вы используете фиксированное количество кубов постоянного и одинакового размера. Однако это почти наверняка не самая эффективная реализация, а quad/octrees — это эффективность.

person Matt Ball    schedule 16.07.2012
comment
Quadtrees в основном 2D, они могут быть 2.5D (также сохраняют высоту). Я действительно хочу использовать hextree, но трудно уложить в голове это 4-е измерение. Вы больше не можете это визуализировать, но оно по-прежнему имеет математический смысл. - person David; 16.07.2012