Процедурные планеты, карты высот и текстуры


19

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

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

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

Оставляя плитку очевидной.

Может ли кто-нибудь посоветовать мне лучший маршрут?

Любой вклад будет высоко ценится.

Ответы:


18

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

Что говорит о том , что вы хотите , чтобы преобразовать из произвольного (x, y, z)к (u, v)координате, которая тривиальна. Кубическая карта не нужна.

альтернативный текст

альтернативный текст

  1. Каждый (u, v)тексель имеет высоту (карту высот RGB = height) и позицию (x, y, z) = pos.
  2. Найти и нормализовать позицию NORMAL(x, y, z) = N.
  3. Новая вершина = pos+N*height.

Это будет работать лучше с более высокой тесселяцией. Также используйте правильное libnoiseсферическое отображение для вашей карты высот, которое будет выглядеть примерно так (но черно-белое):

альтернативный текст



1

Хорошее место для начала - отображение высоты смещения в средней точке. ОП, почему вы думаете, что нет?

OP хорошо моделировать поверхность планеты как кубическую карту, потому что любая плоская карта (например, проекция меркатора) будет иметь уродливые и сложные искажения в математическом плане.

Если бы я был OP, я бы сначала позабыл о крупномасштабной геометрии планеты. Я бы сделал кубическую карту, где каждая грань имеет размер 2 ** N + 1 пикселей (2,3,5,9,17,33 ...), а каждый тексель кодирует высоту [0..N), где 0 - высота ожидаемая самая низкая траншея, а N - это высота ожидаемой самой высокой горы на планете.

Затем я вычислял случайные высоты для восьми вершин куба и распространял их на шесть квадратов карты куба, чтобы каждая вершина появлялась три раза.

Так как я рекурсивно генерирую фрактальные высоты для середин ребер, я обязательно распространю вершины ребер грани на другую грань, которая их разделяет.

Как только я закончу, у меня есть кубическая карта, где все краевые тексели удваиваются, а все угловые тексели утраиваются. Нет необходимости конвертировать его в карту нормалей - я бы использовал алгоритм из статьи Мортена Миккельсена для визуализации нормалей непосредственно из карты высот во время выполнения.

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


1

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

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