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