Як генерувати печери, схожі на ті, що у Minecraft?


34

Я деякий час працюю над 3D-процедурним світом і хочу почати додавати печерні системи. В даний час я використовую 2D / 3D Perlin шум для генерації місцевості в поєднанні з маршовими кубиками для більш гладкої місцевості. Я просто заїдаюся, коли йдеться про довгі печери, що з'єднуються між собою.

Я сподіваюся отримати щось більше, як печерні системи Minecraft. Вони, здається, дуже пов’язані між собою, відводяться навмання майже в будь-якому напрямку, і майже будь-яка точка печери мала б досить круговий вигляд з досить рівним радіусом на всьому протязі (не найкраща редакція, але не зовсім впевнений, як інакше це поставити) .

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

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

Хороший приклад: введіть тут опис зображення


5
Погляньте сюди і прокрутіть униз.
Вільям Маріагер

За останні 24 місяці вийшов журнал розробників ігор, який глибоко обговорював, як робити те, що ви намагаєтеся зробити. Я б потрапив на їхній сайт.
Джої Грін

@JoeyGreen Як називається журнал? Або у вас є посилання на їхній сайт?
jumpnett

1
Це називається журнал розробників ігор. gdmag.com . Ви можете отримати передплату та отримати pdf версії журналу за останні 10+ років. Якщо ви зареєструєтесь, є спосіб пошуку попередніх випусків та пошуку потрібної проблеми.
Joey Green

Відповіді:


30

Печери Майнкрафта породжуються методом "перлінових червів". Генератор зміюється по місцевості і проганяє тунель. Minecraft не використовує 3D-перлін-шум для створення печер, оскільки він має тенденцію залишати непоєднані кишені в місцевості. Печери Minecraft не створюються через 3d Perlin-шум з дуже ранніх версій Alpha.

Ось печери в Gnomescroll, породжені методом "перлінового хробака".

Gnomescroll Печерна система Перша особа 1

Gnomescroll Печерна система Перша людина 2

Перегляд третьої особи Gnomescroll Cave System 2

Це лібеоз "Перлінові хробаки" з підручника з лібноїзу. Техніка ретельно відтворює печери, сформовані в Minecraft.

Підручник Ліноаз Перлін

Параметри змія впливають на якість печерної системи і визначають, наскільки вертикальні печери і як швидко вони змінюють напрямок. Печери в гілках шахти і радіус печерного тунелю змінюються по довжині печер.

Minecraft генерує печери на шматках. Необхідний підхід складний, і ніхто ще не має ідеально зворотного проектування печерного генератора Minecraft, незважаючи на інтерес серверних модерів.

Найбільш вірогідний підхід породжує шматки печери, що зміяються, коли нескінченна карта генерується і розширюється назовні. Печери на нинішньому фрагменті - це функції насіння печери на найближчих N шматках для деякого N. Використовуючи генератор випадкових чисел, який є функцією координат фрагмента для висівання печер, можна обчислити печери на поточному відрізку для нескінченна карта, лише оцінюючи шматки в межах кінцевого радіуса.


3
Чи можете ви додати якусь інформацію чи ресурси, щоб дізнатись про цю річ "перлинські черви"?
Девід Гувейя

1
Це підручник з "перліновими хробаками" libnoise.sourceforge.net/examples/worms/index.html
HaltingState

Не потрібно, але якщо ви могли б детальніше розглянути останній абзац, я дуже вдячний. Щоб створити хробака, я припускаю, що вам потрібна відправна точка на черв'яка, яка повинна знаходитися в межах N шматочків будь-якого гравця, де N - максимальна довжина хробака.
Міфіки

3
Саме так. Кожен черв’як має вихідну точку і закінчується, якщо він блукає поза певним радіусом шматка. Існує генератор випадкових чисел, який детерміновано генерує псевдо випадкову послідовність чисел, яка є функцією координат фрагмента. Ці випадкові числа визначають, де і скільки хробаків походять у цьому вузлі. Черви можуть також розгалужуватися. Обчислювальне навантаження зменшується, якщо черви більш "локальні" і не можуть ризикувати більшим за малий радіус шматка.
Припиненнядержави

Можливо, не саме те, що я хотів почути, але те, що я очікував. Ще раз дякую HaltingState. :)
Міфіки

7

Я б створив хмару точок всередині областей, де місцевість тверда - ви можете експериментувати з різною щільністю. Тоді я використовував би такий алгоритм, як мінімальне дерево, що охоплює, щоб з'єднати всі точки - це забезпечить доступ до кожної області. Потім просто намалюйте великі порожнисті (складені з повітря) ділянки від вузла до вузла (тобто товста лінія вокселів).


Я, можливо, просто не розумію, що саме ви маєте на увазі під цим, але як би я це зробив на шматках, коли світ породжує?
Міфіки

Одним із можливих способів є генерування мінімального розгалуженого дерева в межах кожного шматка окремо, а потім з'єднати кожен фрагмент, знайшовши найближчі два вузли між двома шматками. Після того, як шматок буде заповнений вашим алгоритмом рельєфу місцевості за замовчуванням, ви зможете його заглибити навколо дерева мінімального розміру.
Gavan Woolery

1
Ще одне (простіше) рішення, хоча і менш ефективне і, ймовірно, «шумніше», - використовувати броунівський рух, щоб викреслити шлях (такий, як мураха, який копає навмання).
Гаван Вулері

2

Випуск журналу Game Developer Magazine у ​​квітні 2011 року детально розглядає це питання з ітераційними шумовими функціями Perlin - див. Статтю Творця світів, починаючи з сторінки 21.


Вони показують скріншоти для кожного кроку (функції) та показують варіанти
kvantpotato

1

Використовуйте функцію шуму, щоб призначити значення для кожного шматка, щоб визначити, чи є в ньому тунелі чи ні, а потім використовуйте їх, щоб визначити, де розмістити печери. Якщо ви хочете тунелів, просто використовуйте більше функцій шуму (з різними насінням) і використовуйте їх значення, щоб визначити, чи є тунелі. Після цього використовуйте звичайні функції "малювання" для створення тунелів. Щоб зробити все більш реалістичним, використовуйте більше шуму, щоб зробити випадкове переміщення для точок початку зазначених печер / тунелів.

Якщо ви не хочете використовувати кілька функцій шуму, ви можете зондувати на більших відстанях - наприклад, замість того, щоб робити шум 3d (2,2,2) для шматка при (2,2,2) робити шум3d (2,2, 16) і використовуйте (2,2,16) для одного значення, (2,2,17) для другого значення і т. Д. .... тоді просто налаштуйте свою частоту відповідно, щоб або зробити всі значення незалежними, або співвіднести в коротких масштабах.

Щоб змінити щільність печери в усьому світі, використовуйте іншу функцію нижчої частоти, яка впливатиме на ці значення.

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

Я не впевнений, чи може Minecraft робити печери подібними (хоча, я думаю, це є), але це рішення повинно дати задовільні результати.


-5

ось

Хоча більшість печер, таких, як описано вище, використовують черв'яка Перліна , деякі люди вважають за краще це робити вручну. Таким чином вони можуть зробити це так, як вони хочуть, щоб він саме блокував для блоку. Печера, виготовлена ​​за допомогою хробака Перліна, може бути неточною і може зробити печеру лише висотою 5 футів і шириною 6 футів, це може бути неточно, оскільки ви можете зробити це висотою 10 футів і шириною 15 футів.

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