Величезні процедурно породжені "пустелі" світи


76

Я впевнений, що ви всі знаєте про такі ігри, як Dwarf Fortress - масивна пустеля та земля, що створюються процедурами. Щось подібне, взяте з цієї дуже корисної статті.

Однак мені було цікаво, як я можу застосувати це до набагато більшого масштабу; на думку спадає масштаб Minecraft (чи не щось на кшталт 8x розміру земної поверхні?). Псевдо нескінченний, я думаю, найкращим терміном був би.

: D

У статті йдеться про фрактальний перліновий шум. Я не є експертом з цього питання, але я отримую загальну думку (це якийсь шум, який генерується випадковим чином, який є напівкогерентним, тому не просто значення випадкових пікселів).

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

З іншого боку, я не думаю, що я справді можу створити надмасивний лист шуму перлин. І це був би просто один великий острів, я думаю.

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


9
"призведе до величезної кількості островів" - Або це генерує землю з озерами, якщо ви просто поміняєте землю / воду.

3
Незважаючи на це, ви отримаєте велику кількість озер за досить стандартною схемою.
Качка комуністична

3
@Kylotan: Mincraft має нескінченний розмір (ну не дуже, але він справді великий ... загальний об'єм = довгий. MaxxValue x 128 x long.MaxValue). Тому він не генерує весь світ за один кадр, а також не зберігає всю карту в пам'яті. Він генерує області 16x128x16 блоків асинхронно, якщо вони не були відвідані раніше, інакше він завантажує їх з диска.
zfedoran

2
@ Комуністична качка: Так, це правда, така гра, як minecraft, може піти з використання приблизно 2 - 4 байт даних на блок, але потрібно зберегти лише байт після того, як його більше не видно (один байт описує тип блоку , інші байти описують освітлення та інші дані, які можна перерахувати пізніше). Ось де це стає цікавим, ви можете використовувати RLE для різкого зменшення збереженого розміру до лише кількох байт, оскільки блоки дещо узгоджені, як ви вже згадували.
zfedoran

4
"Дійсно великий" не є нескінченним, і ви не можете використовувати два терміни взаємозамінно. Якщо ви вирощуєте карту як і коли її виявляють, це обмежений розмір, який зростає на вимогу - зовсім інша пропозиція від нескінченності. Кожен шматочок зростання може бути створений у міру необхідності. Дані про місцевість у Minecraft дуже легко піддаються тривіальному стисненню, оскільки існує високий ступінь узгодженості даних. (напр. RLE, як згадувалося.)
Kylotan

Відповіді:


35

Я думаю, я краще розумію, про що ви зараз просите.

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

Ось спрощений приклад: використання синуса замість перлін-шуму для покоління висоти, і уявлення про світ нескінченний по осі X, але висотою лише 1 одиниця в осях Y і Z.

Формула така: height(x,y) = sin(x/20)

Гра починається, і ми генеруємо висоти для прилеглої області, тобто. (0,0) до (9,0):

[0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.34, 0.39, 0.43]

У нас пагорб, піднімається вгору праворуч. Скажімо, ми йдемо до кінця, і зараз нам потрібно генерувати значення від (10,0 до 19,0):

[0.48, 0.52, 0.56, 0.61, 0.64, 0.68, 0.72, 0.75, 0.78, 0.81]

Зверніть увагу, як пагорб постійно зростає, і що значення (10,0) добре випливає із значення в (9,0). Це відбувається тому, що функція синуса є безперервною, що в основному означає, що якщо ви будете годувати її двома суміжними номерами, ви отримаєте 2 сусідніх результату - для певного визначення сусіднього. Отже, якщо ви використовуєте ваші координати світу в якості параметрів функції, що визначає ваш світ, ви отримаєте безперервний пейзаж, який підходить разом, незалежно від того, скільки або мало його генеруєте одночасно. Коли ви генеруєте нові деталі, вони будуть витікати з існуючих деталей автоматично, оскільки висоти вже заздалегідь визначені.

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

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


Ви напевно допомогли прояснити речі, дякую. :) Але щось на зразок функції шуму не було б безперервним. І AFAICS, якщо це буде безперервно, я не отримав би "випадковий" світ. Або я щось тут пропускаю?
Качка комуністична

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

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

2
Що стосується випадковості, то кожен світ може мати своє значення насіння, яке використовується у розрахунках. напр. гріх (х + насіння) замість гріх (х), у моєму прикладі вище. Кожне різне насіння породжує інший світ. А щодо величезного аркуша ... я не впевнений, яке значення має. Не має значення, скільки і скільки ви генеруєте, чи коли це робите. Початковий стан світу визначається математичною формулою, і ви просто використовуєте цю формулу, щоб виявити цей стан як і коли вам це потрібно.
Килотан

32

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

alt текст

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


7
Чудові візуалізації!
zfedoran

3
Я пам’ятаю, як користувався цим підручником, роблячи мою дисертацію Майстра про моделювання природних явищ. Я використовував приклад "пагорба", щоб створити купол неба над своїм 3D-світом. Відмінний вступ до концепції генерації місцевості.
C.McAtackney

1
Божевільний, це приголомшливо! Я не знав, що ніхто ніколи не використовував це.
чудовий

1
О БОЖЕ МІЙ !!! Я використовував це і в попередньому проекті ... найпростіший спосіб генерування місцевості, який я коли-небудь натрапляв !!!
Війна

15

Щоб створити великий острів, не потрібно генерувати все це відразу. Я б будував регіони асинхронно, коли ви їх відвідуєте.

Замість використання маски для створення острова, як описано у статті, одне, що ви можете зробити, це грати з довжиною хвилі октави перлин шуму, щоб досягти вигляду, який ви збираєтеся. Зазвичай перша октава описує загальну форму місцевості. Усі октави після цього просто додають більш дрібну деталь зерна. Тому пограйте з довжиною хвилі першої октави, щоб контролювати, наскільки великі будуть ваші земельні масиви. Якщо ви хочете, щоб суша знаходилася в центрі, ви можете просто зменшити карту висоти, збільшуючи кількість, коли ви віддаляєтесь від центру, а потім нормалізуєте шум. Наприклад, уявіть, як об’єднати ці два, щоб створити свій острів:

перша октава деталі

Ця стаття повинна допомогти: http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

Якщо ви хочете дізнатися про нескінченні тривимірні світи та про різні хитрощі, якими ви можете скористатися, щоб змінити зовнішній вигляд місцевості, граючи із шумовим входом та виходом, ознайомтесь із цією статтею: http://http.developer.nvidia.com /GPUGems3/gpugems3_ch01.html

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


Такого ефекту, якого я хочу досягти, є щось на зразок 2d зверху вниз на карті Minecraft (а не гри) ... якби я просто використав меншу кількість октав, чи не все-таки мені потрібно генерувати масивний лист перлинського шуму? Чи я могла якось генерувати лише дуже, дуже малу кількість цього?
Качка комуністична

Я думаю, ви все ще можете трохи заплутатися в тому, як працює шум перліна. Ви можете генерувати шматки блоків 16x16 окремо, відправивши функцію зсуву координат x і y для шуму перлін. Зверніть увагу, як функція PerlinNoise_2D (float x, float y) приймає координати x і y. Іншими словами, він створює шум для деякого (x, y) положення. Також генерування меншої кількості октав не те саме, що зміна довжини хвилі октав. Менше октав => Менше дрібних деталей зерна. Більша довжина хвилі => більше масштабування.
zfedoran

Також ось стаття з кодом, яка показує вам, як реалізувати масштабування / довші хвилі: dreamincode.net/forums/topic/66480-perlin-noise
zfedoran


7

Шум Перліна і друзі - хороша відправна точка, але ви, мабуть, хочете зробити це на крок далі. Більшість популярних генераторів на основі шуму дадуть вам досить нецікаві результати. Для того, щоб зробити місцевість реалістичною, ви хочете подивитися на алгоритми, що імітують ерозійні ефекти. Один із найдосконаліших світових тренажерів для гри - Dwarf Fortress - робить ерозію як одне із кроків у світі.

Одне з досить класних рішень, які я бачив, було описано у статті "Розширене відкладення частинок" у статті "Ігри про програмування ігор 7." В Інтернеті доступно багато інших, тому є багато ресурсів (наприклад, 1 або 2 ) .

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