Как удалить плавающий ландшафт при генерации с помощью 3D Perlin Noise?

10

В настоящее время я использую 3D Perlin Noise для генерации случайной местности в сочетании с марширующими кубами.

Кажется, моя проблема заключается в масштабировании функции шума, чтобы получить разумную высоту в моей местности. Если используется только одна октава, все точки относительно шума, очевидно, интерполируются, что приводит к довольно гладким данным. Однако, чтобы получить выступы / пещеры / неровную местность, я должен использовать несколько октав с разными амплитудами и / или масштабировать полученные значения до моей «максимальной» высоты, которую я хочу получить от карты.

Я мог бы что-то упустить, но, используя марширующие кубы с 3D-шумом перлина, я регулярно получаю плавающие куски ландшафта.

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

Спасибо за любую помощь, Mythics

Mythics
источник

Ответы:

9

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

  1. Подключен к базе.
  2. Подключен к вокселю, который подключен к базе.

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

Кроме того, существуют менее дорогостоящие способы минимизации, но не полного удаления плавающего ландшафта.

  • Смещение градиента : Вы можете сместить размещение твердых вокселей с градиентом. Функция градиента будет резко падать после того, как вы окажетесь выше «уровня земли». В этой статье рассказывается об использовании градиента и есть еще несколько полезных советов.

  • Шум карты высоты: вместо этого вы можете генерировать шум в виде карты высоты. Это позволит удалить выступы и пещеры, но вы можете смоделировать их с дополнительным вычитающим слоем шума.

  • Меньше шумного шума : используйте меньше октав в вашем ландшафте и генерируйте вычитающий шум, чтобы получить выступы и пещеры.

MichaelHouse
источник
Ландшафт может быть соединен только через примыкающий кусок, если он оттуда нависает.
Лорен Печтел
@Loren: Это прекрасно, хотя. Пока движок позволяет вам обращаться к блокам по полному индексу, он будет работать без проблем.
Фил
@LorenPechtel Я действительно говорю, что вы можете сделать это для каждого чанка, но вам нужно проверить соседние чанки, когда вы находитесь на краю чанка. Это может стать проблемой при создании нового ландшафта и не генерировать соседний кусок. Когда вы попадаете в ситуацию, когда у вас есть потенциальная плавающая местность, вы можете либо генерировать соседний фрагмент, либо использовать алгоритм шума для анализа вокселей, пока не найдете «основу» или известное соединение с текущим фрагментом.
MichaelHouse
0

может быть, уже слишком поздно, чтобы ответить, но я начинал сейчас с создания воксельных ландшафтов, с Perlin Noise, и я нашел способ создать ландшафт без этих плавающих фигур. Я думаю, что это может помочь вам. Итак, чтобы создать ландшафт, я сначала генерирую карту высот, а не считываю пиксели из этой карты высот. Теперь начинается интересная часть, я читаю значение «яркости» (на самом деле это оттенки серого) каждого пикселя на этой карте высот, и это дает мне высоту для этой конкретной части карты, а затем, чтобы создать ландшафт, я предполагаю, что эта карта высот моя местность, видимая сверху, поэтому, если значение пикселя в оттенках серого (после сопоставления с моим ландшафтом maxHeight) на этой карте высот, скажем, 30, это означает, что в этой конкретной точке моей местности я буду генерировать только 30 вокселей по оси Y, и это дает мне местность без плавающих частей. Если вам нужны пещеры и так далее, вы можете применить другой шум к оригиналу (под поверхностью), чтобы создать эти пещеры. Надеюсь, что это работает для вас.

Саммаэль
источник
1
Я считаю, что это похоже на второй пункт пули в моем ответе выше?
MichaelHouse