Как я могу создать местность в стиле Worms?

48

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

введите описание изображения здесь

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

Xeon06
источник
Красный представляет пещеры, или это только часть ландшафта?
Ричард Марскелл - Дракир
Это часть местности. Я просто Google это изображение, было ближе всего к тому, что я хочу достичь. «Пещерная» часть могла бы быть той маленькой дырой справа, если бы она продолжалась больше внутри местности слева.
Xeon06
@Drackir, отредактировал изображение.
Xeon06
Связанный: gamedev.stackexchange.com/questions/6721/…… (но не дубликат, так как он, кажется, фокусируется на реализации по сравнению с алгоритмами генерации).
Джош
@JoshPetrie действительно. Я хорошо с разрушением. Это поколение, с которым у меня проблемы.
Xeon06

Ответы:

51

Я бы посоветовал вам начать с 2D Perlin-noise. Что-то вроде этого:

Perlin-шум

Затем примените порог к изображению, чтобы вы получили несколько изолированных островков, как показано здесь:

шум перлина с порогом

Я выбрал порог 0,04, все, что выше порога, будет окрашено в синий цвет. Остальные остаются черными. Затем, после этого, пришло время определить, какие «острова» оставить, а какие выбросить.

Возможный подход заключается в том, чтобы проходить изображение слева направо на различных высотах и ​​выбирать пересекающиеся «острова» с определенной вероятностью. На рисунке в качестве примера самая низкая линия имеет вероятность 100%, поэтому будет выбран каждый остров, который она пересекает (закрашено белым). Вторая линия имеет вероятность 50%, а самая верхняя линия имеет вероятность 10%.

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

расширенные острова

И есть возможный пейзаж.

«Детализация» шума будет определять, насколько малы будут детали в вашем мире. Так что, вероятно, лучше всего поэкспериментировать с этими значениями.

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

bummzack
источник
Большое спасибо за отличный подробный и иллюстрированный ответ! Это именно то, что я собираюсь сделать.
Xeon06
Не могли бы вы дать какие-нибудь советы по созданию такого перлин-шума, с таким уровнем детализации и тому подобным? Я пробовал весь вечер и никуда не денусь.
Xeon06
@ Xeon06 Я просто использовал функцию шума Перлина, предоставляемую вспышкой . Параметры были 24для baseXа baseY, 1 октава и я выбрал вывод градаций серого и отключил «фрактал». На каком языке вы это реализуете?
Bummzack
Я реализую это JavaScript. Я искал сеть для хорошей реализации, которая дала бы подобные результаты в течение недели, но ничего не могу найти.
Xeon06
Я задал еще один вопрос, относящийся к части шума perlin gamedev.stackexchange.com/questions/20880/fast-noise-generation
Xeon06
6

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

Равашоль
источник
О, я думаю, я понял это сейчас. Мне нужно использовать 2D перлин шум, а не 1D. Не могли бы вы уточнить эту фильтрацию?
Xeon06
2
Я не могу публиковать изображения прямо сейчас, но я просто говорю о простом пороговом фильтре а-ля if (0.3> pixelValue> 0.5) KeepIt () ;. «Осторожно» немного о правильных 0,3 и 0,5. Вы также можете иметь линейный (или нет) градиент, начиная с высокой альфы в верхней части, постепенно достигая 0 в нижней части, так что у вас есть место для неба, и земля в основном заполнена. Надеюсь, это поможет.
Равачол
@Ravachol Если вы разместите ссылку на картинку, кто-то с большим количеством представителей может добавить ее в ваш пост для вас.
Ричард Марскелл - Дракир
«if (0.3> pixelValue> 0.5)», я полагаю, что это просто опечатка, но может быть непонятно, что в вашем посте есть противоречивые вещи ... Можете ли вы отредактировать это?
Jcora
Я не могу редактировать комментарий. Прочитайте «if (0.3 <pixelValue <0.5)», очевидно.
Ravachol
4

Я действительно реализовал это, начиная с отличного ответа bummzack.

Вот шаги, которые я закончил:

  1. Создать изображение с шумом Перлина
  2. Заливка там, где вы хотите местность
  3. Расширение + эрозия, чтобы удалить слишком маленькие впадины
  4. Удалить оставшиеся фоновые области внутри местности
  5. Сглаживание

И это пример результата: пример сгенерированной местности

Я написал подробную статью обо всем процессе здесь, и код (JavaScript) с открытым исходным кодом, проверьте его, если хотите что-то готовое к использованию;)

Джулиан Го
источник