Процедурная генерация реки или дороги для бесконечной местности

28

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

Я ищу метод для создания процедурных дорог / рек в извилистой манере, но я хочу сделать это для бесконечной системы типов местности. Точно так же, как шум perlin генерирует капли, я хочу генерировать отрезки линий произвольной длины (возможно, бесконечной длины).

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

Я не хочу требовать, чтобы ландшафт был сформирован заранее. Это включает в себя карту высот (например, используется для моделирования дождя или аналогичного). Я также не хотел бы требовать начальной / конечной точки.

Есть ли такой алгоритм или настройка алгоритма шума, о котором кто-то может знать, чтобы выполнить то, что я пытаюсь объяснить?

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

Вот картина того, что у меня пока есть в 2D, но с очень высокой частотой, чтобы показать больше деталей:

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

Mythics
источник
поскольку реки «текут», можно легко определить реки, просто используя шум для определения точки происхождения, после этого просто используйте исходные данные карты высот для определения пути.
Война
Дороги могут быть немного более сложными, хотя, я подумал построить дороги на основе использования, если игрок / все игроки регулярно ходят по какой-то местности, это станет дорогой.
Война
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

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

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

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

После этого шага вы можете искать пути в сети, которые являются действительными.

Для правильных путей теперь вы можете создавать дороги (у них есть острые края).

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

Если вам не нужны острые ребра, вы можете вычислить среднюю точку каждого соединения и использовать направление как касательную для интерполяции Безье между двумя ребрами в графе.

Об использовании Вороного-Диаграммы

Для архивирования городов, таких как дорожные структуры, точки из псевдослучайной функции могут быть выровнены на сетке, поэтому пути имеют форму прямоугольника.

Для большего количества графства как дороги пункты должны быть более неупорядоченными.

диаграмма из википедии

О псевдослучайной функции для генерации позиций точек для диаграмм Вороного

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

Quonux
источник
У вас есть примеры хеш-функции? У меня та же цель (бесконечный мир, который использует вороной для дорог), но я не могу понять, как это сделать. Каждая найденная вороной библиотека ожидает координаты ограничительной рамки, которая сразу же побеждает цель.
BotskoNet
Нет, хеш-функция предназначена только для назначения начального семени ячейке. Может быть чем-то таким же тривиальным, как x * prime1 + y * prime2 + z * prime3. Там, где простые числа не равны друг другу и в идеале велики, вы должны рассчитывать здесь с 64-битными целыми числами / без знака. Это не проблема, если библиотека использует ограничивающий прямоугольник, потому что для каждой ячейки вам просто нужно собрать все точки в ячейке плюс все точки соседних ячеек (которые являются 8 соседними ячейками).
Quonux
Вероятно, вы столкнетесь с проблемами точности с одинарной точностью, если в lib используется одинарная точность или если вы используете одинарную прецизионность. Чтобы обойти проблему, если библиотека просто использует одинарную точность, а вы не делаете следующее: перед преобразованием позиций в одинарную точность вычтите из них глобальную позицию центральной ячейки, затем поместите это как число с плавающей точкой в ​​библиотеку, а затем преобразуйте результаты обратно.
Quonux
Я на самом деле никогда не реализовывал этот алгоритм, но хеш-функция действительно может быть тривиальной.
Quonux
8

Для создания дороги (и города) лучшая бумага, которую я нашел, является этой:

Процедурное моделирование городов Y Parish и P Müller

Это использует L-систему, и это может генерировать дорожные схемы США и ЕС. Если вы не хотите создавать дороги для всего города, вы можете просто создать основные дороги. Это может быть карта высот, карта воды и карта плотности населения.

Rak
источник
+1 только потому, что мне понравилась статья. На самом деле не вписывается в то, как я хочу попытаться создать дороги / тропы / реки, в то время как динамически генерировать ландшафт.
Мифы
6

http://vterrain.org/Culture/Roads/ В разделе «Создание 3D-дорог» содержится некоторая информация о создании дорог .

Проблема с дорогами состоит в том, что они соединяют ориентиры (хотя они часто следуют по местности, вместо того, чтобы идти прямо от А к В).

Лично я бы создал местность, затем разместил бы реки (возможно, используя эрозию, см. Http://vterrain.org/Water/ в разделе «гидрогеология»), а затем разместил бы города в местах, где это имеет смысл (например, рядом с рекой или другим источник воды, или в месте, где вода может быть доставлена ​​с использованием акведуков или водонапорных башен и труб) и, наконец, создать дороги между городами.

Чтобы сделать это более простым в использовании в процедурном мире, вы можете создать промежуточные точки на местности, где дороги будут наиболее вероятны, если они будут созданы в этом месте, а затем соединить промежуточные точки, если дорога в этом месте действительно создается.

Exilyth
источник
4

Во-первых, реки и дороги очень разные. Дороги, как правило, следуют по изолинии (одинаковая / подобная высота) - причина в том, что гораздо легче путешествовать по дорогам, которые не поднимаются и не сильно падают. Реки, с другой стороны, движутся перпендикулярно изолинии / изоклинам (спуск). Реки образуются в бассейнах (совокупности гор, которые текут вниз в данную долину) и имеют тенденцию образовывать древовидные структуры. Кроме того, дороги часто проходят перпендикулярно рекам, чтобы образовать логические мосты. Лучшая идея - сначала создать реки, а затем создать логические дороги (то есть дороги между городами). У меня нет времени вдаваться в подробности, к сожалению, но, надеюсь, это поможет вам выбрать правильный путь.

Это может показаться очевидным, но посмотрите на карты Google на различные типы местности и дорог; вы получите лучшее представление о том, как они должны выглядеть.

Гаван Вулери
источник
1
Я снова изменил вопрос, чтобы понять, что меня интересует не столько реалистичность, сколько то, как должен работать алгоритм. Тем не менее, я ценю ответ, хотя в основном для некоторых используемых терминов. Попытайтесь думать о моем желании больше как бесконечные загогулины произвольной длины, которые можно сгенерировать с минимальными необходимыми данными (например, карта высот).
Мифы