Внедрение QuadTree Terrain на планете (Geomipmapping)

У меня есть QuadTree, который можно разделить, поместив объекты в узлы. Еще у меня есть планета, сделанная в OpenGL в виде Quad Sphere. Проблема в том, что я не знаю, как их собрать. Как QuadTree хранит информацию о планете? Сохраняю ли я вершины в листовых узлах Quad Tree? И если да, то как мне разделить данные вершин на 4 набора, не испортив текстурирование и нормали. Если это так, я использую вместо этого индексы?

Итак, мой вопрос вкратце:

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

Я прочитал много статей, и большинство из них не освещают этот вопрос. Quadtree — одна из самых важных вещей для моего приложения, поскольку она позволит мне визуализировать множество планет одновременно, сохраняя при этом хорошее разрешение на суше. Красивое изображение моей планеты и солнца HD: Красивое изображение моей планеты и солнца HD!

Видео с планетой также можно найти здесь.

Мне удалось реализовать простое четырехугольное дерево на плоской плоскости, но я продолжаю получать огромные дыры, так как думаю, что неправильно понимаю позиции. Это последний пост здесь - http://www.gamedev.net/topic/637956-opengl-procedural-planet-generation-quadtrees-and-geomipmapping/ и там же можно получить src. Есть идеи, как это исправить?


person Vangoule    schedule 27.01.2013    source источник


Ответы (2)


Вам нужен алгоритм наподобие ROAM (оптимально адаптирующаяся сетка в реальном времени), который возможность увеличить или уменьшить точность вашей модели в зависимости от расстояния до камеры. Тогда алгоритм будет использовать ваше дерево квадрантов.

Ознакомьтесь с этой серией на gamasutra о том, как визуализировать процедурную вселенную в реальном времени.

Редактировать: причина, по которой вы должны использовать дерево квадрантов с этими методами, заключается в том, чтобы свести к минимуму количество вершин в областях, где детализация не требуется (например, плоская местность). Определение quadtree в википедии довольно хорошее, вы должны использовать его в качестве отправной точки. Цель состоит в том, чтобы создать дочерние узлы для вашего дерева квадрантов, где у вас есть изменения в вашей «высоте» (вы можете сгенерировать стороны своего куба, используя карту высот), пока вы не достигнете предопределенной глубины. Возможно, в качестве первого прохода вы должны попытаться избежать дерева квадрантов и использовать простую сетку. Когда вы заработаете, вы «оптимизируете» свой процесс, добавив quadtree.

person emartel    schedule 27.01.2013
comment
Моя конечная цель — процедурная вселенная в реальном времени. Однако после поиска в Интернете кажется, что способ достижения ROAM заключается в использовании адаптивного четырехъядерного дерева из-за того, что мой ландшафт состоит из куба. Пример того, откуда я получил эту информацию: acko.net/ blog/making-worlds-1-of-spheres-and-cubes Я хотел бы решать проблемы шаг за шагом. Как будто я даже не могу понять, как поместить свои данные в дерево квадрантов, я, вероятно, не смогу реализовать ROAM... - person Vangoule; 28.01.2013
comment
Можете ли вы направить меня к чему-нибудь, что на самом деле объяснит, как хранить данные в QuadTree и как разделить данные при разделении Quad Tree. - person Vangoule; 28.01.2013
comment
После осмотра ROAM кажется, что ему нужны структуры данных, такие как двоичное дерево треугольников. Что по-прежнему оставит меня с той же проблемой. Как и то, что все высоты генерируются в шейдере. Если я могу просто разделить ландшафт на большее количество вершин, шейдер вычислит высоту, которую я считаю, и, следовательно, создаст более четкое изображение и сглаженные края. - person Vangoule; 28.01.2013
comment
Я также только что наткнулся на алгоритм Diamond Square. Как вы думаете, что будет лучше для такой планеты? - person Vangoule; 28.01.2013
comment
Извините, я немного занят в данный момент, я попытаюсь обновить свой ответ позже, но лучший совет, который я мог бы вам дать, это начать с фиксированной сетки, соответствующей уровню mip n, а ЗАТЕМ оптимизировать с помощью изменение представления треугольника - person emartel; 28.01.2013
comment
Что мне действительно нужно, так это то, как на самом деле заполнить четырехугольное дерево и разделить вершины. Я думаю, что я могу работать остальные из статьи. - person Vangoule; 28.01.2013
comment
Например — как я могу изменить это, чтобы его можно было использовать на местности — github.com/veeableful/Adaptive_Quadtree_Minimal - person Vangoule; 28.01.2013
comment
Я проверю вашу ссылку позже, но прочитаю ответ Адмирала: gamedev.net/topic/ - person emartel; 29.01.2013
comment
Таким образом, каждый узел будет иметь «сетку», эквивалентную определенному количеству треугольников, которая остается неизменной повсюду. Следовательно, если я разделю его, количество треугольников в этой области увеличится в 4 раза? Как на самом деле разделить массив вершин. - person Vangoule; 29.01.2013
comment
Другой вопрос... Начать ли мне с максимальной детализации моего куба, а затем поместить его в Quadtree, или начать с низкой детализации моего куба, чтобы увеличить время загрузки и сгенерировать вершины в каждом подразделении. - person Vangoule; 29.01.2013

Чтобы понять, как данные дерева квадрантов и ландшафта работают вместе для достижения рендеринга на основе LOD, прочитайте эту статью. Легко понять с наглядными примерами.

Однажды я реализовал LOD на сфере. Идея состоит в том, чтобы начать с простой Дипирамиды, где верхняя пирамида представляет северную сферу, а нижняя — южную. Основания пирамид совпадают с экватором, вершины находятся на полюсах. Затем вы делите каждый треугольник на 4 меньших сколько хотите, соединяя середины ребер треугольника. Столько, сколько вы хотите зависит от ваших потребностей, расстояния до камеры и размещения объектов могут быть вашими триггерами для разделения.

person hkn    schedule 30.01.2013