Який хороший алгоритм для процедурного плану міста, заснованого на фракталі?


19

Фон

Я запускаю сервер minecraft, де я збираюся створити місто-початківець досить великих масштабів. У мене є ряд речей, таких як правила знаків та клітки, які я хотів би розмістити там у будинках. Саме місто буде надзвичайно великим і розкинутим, бажано розміром до 1000 на 1000 блоків.

Самі будівлі матимуть кубічні або прямокутні сліди, які базуються на певному базовому кубі, як і всі кратні з 3 блоків. Вулиці та відстань між будинками будуть переважно шириною 5-11 блоків, залежно від важливості вулиці.

Коли я розпочну план міста, я точно буду знати, наскільки я хочу, щоб будівлі були і скільки їх буде.

Проблема

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

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

Питання

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

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

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

редагування Для того, щоб було зрозуміло, я просто шукаю макет на цьому етапі, оскільки будівлі будуть проектуватися та будуватися в грі.


3
Майнкрафт використовує фрактали? Я був під враженням, що він просто використовує функції безперервного шуму (я вважаю, Перлін або Симплекс).
Мартін Сойка

@Martin Sojka Perlin шум насправді є фрактал, так що.
Nevermind

1
@Nevermind: Визначальною характеристикою фрактала є самоподібність : якщо ви виберете його частину і масштабуєте її до розміру оригіналу, вона буде «подібною» (мати однакову структуру). Зокрема, частотний спектр фрактального сигналу інваріантний масштабу. Якщо ви зробите це з шумом Перліна, все, що ви отримаєте, - це масштабована область шуму Перліна; частотний спектр також зміститься.
Мартін Сойка

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

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

Відповіді:


20

Нещодавно я реалізував алгоритм для процедурного плану міста. Це ще дуже велика робота в процесі роботи, але здається мені перспективною. Поглянь:

процедурний приклад міста

Алгоритм, що використовується для створення цього макета, вільно базується на L-Systems . У мене базовий Elementклас, який має прямокутник, який позначає його місце на карті, і метод Grow, який створює інші Elementsвсередині прямокутника, та / або породжує деякі об’єкти на карті. Тоді є фактичні елементи, успадковані від цього базового класу: City, Street, і Buildingт.д.

Покоління починається з ряду "насіннєвих" об'єктів (у моєму випадку - лише один Cityелемент, випадковим чином розміщений на карті). Потім система перебирає всі елементи, викликаючи Grow, поки всі елементи не стають неактивними ( Growповертаються false) або проходить деяка велика кількість ітерації.

Місто на зображенні побудовано за допомогою лише кількох простих правил:

  • Cityстає Streetелементом, який десь розділяє область.
  • Усі Streetзростають на 0-3 бічні вулиці, ще більше розбиваючи площу.
  • Крім того, Streetбезперервно намагайтеся помістити випадковий розмір Buildingзбоку.

Результат не надзвичайно цікавий, але й непоганий. Систему можна легко розширити і досить просто зрозуміти, що відбувається (-8


Любіть простоту. Думаю, міста фактично органічні, оскільки вони контролюються органічною сутністю, яка прагне до досконалості, як бачить її розум, - що робить L-системи, мабуть, найкращим наближенням цього процесу.
Джонатан Дікінсон

Мені це подобається. =) Тепер для втілення в пігаму ...
Кен

8

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

Гуглінг "процедурні будівлі" чи "процедурне місто" також дасть вам ще чимало інших статей та статей на цю тему.


1

Я перебрав дуже хороший / детальний підручник для створення процедурних міст на той час. Є відео @ http://www.youtube.com/watch?v=-d2-PtK4F6Y Підручник знаходиться у блозі автора: http://www.shamusyoung.com/twentysidedtale/?p=2940 Сподіваюся, це допоможе ам


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