Як я можу генерувати рельєфний стиль?


48

Я працюю над грою в стилі «Вормс» і хочу процедурно створити певну місцевість. Раніше я багато робив місцевість, використовуючи перлин-шум, і саме це я почав використовувати для цієї гри. Єдина проблема з цим полягає в тому, що це занадто просто і нудно, що дає мені пагорби, але не складність, яку я хочу. Я хотів би мати такі особливості, як печери та висячі гори, і я не проти плаваючих островів і подібних. Щось подібне, але навіть божевільніше було б нормально:

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

Я подумав спочатку створити місцевість за допомогою класичного перлинського шуму, потім просто видалити деталі для створення печер, а що ні, але у мене виникають проблеми з керівництвом видаленням цих частин. Чи є альтернативи для генерації такої місцевості?


Чи червоний являє собою печери чи це лише частина місцевості?
Річард Марскелл - Дракір

Це частина місцевості. Мені саме Google це зображення було найближчим до того, що я хочу досягти. "Печерна" частина може бути тією маленькою діркою праворуч, якби вона була продовжена більше всередині місцевості зліва.
Xeon06

@Drackir редагував зображення.
Xeon06

Пов’язано: gamedev.stackexchange.com/questions/6721/… (але не дублікат, оскільки, здається, фокусується на впровадженні проти алгоритмів генерації).
Джош

@JoshPetrie справді. Мені добре з руйнуванням. З цим поколінням я маю проблеми.
Xeon06

Відповіді:


51

Я б запропонував почати з 2D Perlin-шуму. Щось на зразок цього:

перлин-шум

Потім застосуйте поріг до зображення, щоб ви отримали кілька ізольованих островів, як показано тут:

перлін шум з порогом

Я вибрав поріг 0,04, все над порогом було б кольоровим синім кольором. Решта залишилися чорними. Потім після цього настав час визначити, які «острови» тримати, а які викинути.

Можливим підходом було б пробігати зображення зліва направо на різних висотах та вибирати пересічні «острови» з певною вірогідністю. На прикладі зображення найнижча лінія має ймовірність 100%, тому кожен острів, який він перетинає, буде обраний (заповнений білим кольором). Другий рядок має ймовірність 50%, а верхній рядок - 10%.

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

розширені острови

І можливий пейзаж.

"Деталізація" шуму визначає, наскільки дрібними будуть деталі у вашому світі. Тому, мабуть, найкраще експериментувати з цими значеннями.

Крім того, де і з якою ймовірністю розміщуються ваші "лінії вибору", результат буде абсолютно іншим. Якщо у верхній частині зображення є лінія з високою ймовірністю «вибору» острова, то ви можете побудувати якийсь печеристий пейзаж тощо.


Дякую велику за чудову детальну та ілюстровану відповідь! Це саме те, що я буду робити.
Xeon06

Чи мали би ви якісь поради щодо генерації такого шуму перлин, з таким рівнем деталізації та таким? Я намагався цілий вечір і нікуди не дістаюсь.
Xeon06

@ Xeon06 Я просто використовував функцію шуму Perlin, яку надає спалах . Параметри були 24для baseXі baseY, 1 октава, і я вибрав для виведення шум у сірі та відключений "фрактал". Якою мовою ви це реалізуєте?
bummzack

Я реалізую його JavaScript. Я бив в Інтернеті гарну реалізацію, яка б дала подібні результати протягом тижня, але нічого не можу знайти.
Xeon06

Я зробив ще одне питання , що відноситься до шуму Перлина частини gamedev.stackexchange.com/questions/20880/fast-noise-generation
Xeon06

6

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


О, я думаю, я зараз зрозумію. Мені потрібно використовувати 2D перлін-шум, а не 1Д. Не могли б ви детальніше розглянути фільтрування?
Xeon06

2
Я не можу розміщувати фотографії зараз, але я просто говорю про простий пороговий фільтр à-la, якщо (0,3> pixelValue> 0,5) KeepIt () ;. Біт "обережно" полягає в тому, щоб отримати 0,3 і 0,5 правильно. Ви також можете мати лінійний (або ні) градієнт, починаючи з високої альфа вгорі, поступово добираючись до 0 внизу, так що у вас є місце для неба, а земля в основному заповнена. Сподіваюся, що це допомагає.
Равачол

@Ravachol Якщо ви опублікуєте посилання на фотографію, хтось із більшою кількістю представників може додати його до вашого повідомлення.
Річард Марскелл - Дракір

"якщо (0,3> pixelValue> 0,5)", я думаю, це просто помилка друку, але це може заплутати те, що у вашому дописі є суперечливі речі ... Чи можете ви редагувати це?
jcora

Я не можу редагувати коментар. Читайте "if (0.3 <pixelValue <0.5)", очевидно.
Равахол

4

Я фактично реалізував це, починаючи з відмінної відповіді bummzack.

Ось такі кроки я закінчив:

  1. Створіть зображення за допомогою шуму Перліна
  2. Заливайте там, де ви хочете трохи місцевості
  3. Дилатація + ерозія для видалення заглиблень, які занадто малі
  4. Видаліть решту фонових областей всередині місцевості
  5. Згладжування

І ось приклад результату: приклад генерованої місцевості

Я написав докладну статтю про весь процес тут і код (JavaScript) є відкритим вихідним кодом, перевірте його , якщо ви хочете що - то повній готовності до використання;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.