Процедурна генерація річки чи дороги для нескінченної місцевості


28

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

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

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

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

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

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

Ось малюнок того, що я маю до цих пір у 2D, але з дуже високою частотою, щоб показати більше деталей:

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


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

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

1
@ user19142 Гаразд, не дублікат. Можливо, ви знайдете користь і з цього питання / відповіді: gamedev.stackexchange.com/questions/53400/… І попередні посилання я знову включу як "пов'язані" gamedev.stackexchange.com/questions/45403/… gamedev. stackexchange.com/questions/29044 / ... gamedev.stackexchange.com/questions/31263 / ...
MichaelHouse

4
Я думаю, що дороги будуть не дуже правдоподібними, якщо їх створити шум. Дороги створюються інтелектом, а не фізикою та часом. Хоча вони часом можуть нагадувати один одного, вони досить відрізняються, що ви, ймовірно, не могли використовувати один і той же алгоритм для обох.
MichaelHouse

1
Дороги в цьому проекті були контурними лініями, які слідували певній висоті, тож ви могли їх генерувати локально. Він працював там, але карти висоти не генерувалися за допомогою шуму Перліна.
amitp

Відповіді:


11

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

Перша помилка алгоритму - використання Voronoi-Diagramms . Ви ділите свій світ на сітки, кожна сітка має адресу у вигляді (xgrid, ygrid). Для кожної комірки, в якій вам потрібно створити дороги, ви ставите змінні xgrid та ygrid у хеш-функцію, яка повертає число CellSeed . Ви використовуєте CellSeed як насіння для генератора випадкових чисел, який генерує координати точок діаграми Вороного.

Тепер вам потрібно пошукати краї діаграми та вузли, де стикаються кілька ребер. Ви також можете зберігати інформацію у графіку для більш легкого доступу.

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

Для дійсних шляхів ви тепер можете створити дороги (вони мають гострі краї).

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

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

Про використання Voronoi-Diagramms

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

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

схема із вікіпедії

Про функцію псевдослучайності для формування положень точок для діаграм Вороного

Це може бути звичайна випадкова функція або набір Хаммерслі для більш рівномірного незграбного розподілу точок.


Чи є у вас приклади хеш-функції? У мене така ж мета (нескінченний світ, який використовує вороной для доріг), але я не можу зрозуміти, як це робити. Кожен voronoi lib я можу знайти очікує координати обмежувальної коробки, яка негайно перемагає мету.
BotskoNet

Ні, хеш-функція призначена лише для присвоєння початкового насіння клітині. Може бути щось настільки тривіальне, як x * prime1 + y * prime2 + z * prime3. Якщо прайми нерівні один одному і в ідеалі великі, вам слід обчислити тут 64-бітні цілі числа / без знака. Це не є проблемою, якщо lib використовує обмежувальний ящик, тому що для кожної комірки потрібно просто узгодити всі точки в комірці плюс усі точки сусідніх комірок (а це 8 комірок сусідства).
Quonux

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

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

8

Для створення доріг (і міста) найкращий документ, який я знайшов, - це такий:

Процедурне моделювання міст за допомогою парафії Y та P Müller

Для цього використовується система L та вона може генерувати схеми доріг США та ЄС. Якщо ви не хочете генерувати дороги для цілого міста, ви можете просто створити основні дороги. Він може взяти карту висоти, карту води та карту щільності населення.


+1 просто тому, що мені сподобався папір. Дійсно не вписувався в те, як я хочу спробувати генерувати дороги / доріжки / річки, КОЛИ динамічно генерує місцевість.
Міфіки

6

http://vterrain.org/Culture/Roads/ в розділі "Генерування 3D-доріг" є деяка інформація про генерацію доріг .

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

Особисто я створив би місцевість, потім розміщував би річки (можливо, використовуючи ерозію, див. Http://vterrain.org/Water/ розділ "гідрогеологія"), а потім розміщував міста в місцях, де це має сенс (наприклад, біля річки чи інших джерелом води або в місці, де воду можна транспортувати за допомогою акведуків або водонапірних веж і труб) і, нарешті, генерувати дороги між містами.

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


4

По-перше, річки і дороги дуже різні. Дороги, як правило, слідують за ізолініями (однакова / аналогічна висота) - тому набагато простіше подорожувати дорогами, які не піднімаються чи сильно падають. Річки, навпаки, рухаються перпендикулярно до ізоліній / ізокліній (під гору). Річки утворюються в басейнах (сукупності гір, які всі стікають вниз до певної долини) і, як правило, утворюють деревоподібні структури. Крім того, дороги часто рухаються перпендикулярно річкам, щоб утворити логічні мости. Найкраща ідея - спочатку генерувати річки, а потім створити логічні дороги (тобто дороги між містами). На жаль, я не встигаю детальніше розібратися, але, сподіваюся, це приведе вас на правильний шлях.

Це може здатися очевидним, але подивіться на карти Google на різних типах місцевості та доріг; ви отримаєте краще розуміння того, як вони повинні виглядати.


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