Я должен сказать, что пути, а не дороги, как я думаю, более средневековые Также не ищу реализма. Ответ, который я ищу, будет соответствовать форме, которую я описываю, а не реализму.
Я ищу метод для создания процедурных дорог / рек в извилистой манере, но я хочу сделать это для бесконечной системы типов местности. Точно так же, как шум perlin генерирует капли, я хочу генерировать отрезки линий произвольной длины (возможно, бесконечной длины).
Мне известны такие стратегии, как предлагаемый ответ, найденный здесь , однако он основывается на заданной начальной и конечной точке работы, у меня нет указанной начальной и конечной точки. Я хотел бы иметь возможность просто вызывать функцию, используя произвольные координаты, и возвращать, являются ли конкретные координаты частью реки / дороги.
Я не хочу требовать, чтобы ландшафт был сформирован заранее. Это включает в себя карту высот (например, используется для моделирования дождя или аналогичного). Я также не хотел бы требовать начальной / конечной точки.
Есть ли такой алгоритм или настройка алгоритма шума, о котором кто-то может знать, чтобы выполнить то, что я пытаюсь объяснить?
Самое близкое, к чему я дошел, - это многоконечные фракталы, если я правильно использую название. Я просто беру абсолютное значение значения шума (при условии, что оно масштабируется от -1 до +1) и устанавливаю порог. Моя основная проблема в этом заключается в том, что линии слишком часто перекрываются, в основном круглые, иногда сходятся, образуя большие озера, которые аккуратны, но нежелательны, и часто толщина линий меняется слишком сильно.
Вот картина того, что у меня пока есть в 2D, но с очень высокой частотой, чтобы показать больше деталей:
источник
Ответы:
Просто моя идея заархивировать то, что вы хотите, без (большого) предварительного вычисления и возможности для бесконечного мира.
Первая часть алгоритма - использование диаграмм Вороного . Вы делите свой мир на сетки, каждая сетка имеет адрес в форме (xgrid, ygrid). Для каждой ячейки, в которой вам нужно создать дороги, вы помещаете переменные xgrid и ygrid в хеш-функцию, которая возвращает число CellSeed . Вы используете CellSeed в качестве начального числа для генератора случайных чисел, который генерирует координаты точек для диаграммы Вороного.
Теперь вам нужно найти края диаграммы и узлы, где сталкиваются несколько ребер. Вы также можете хранить информацию в графике для более удобного доступа.
После этого шага вы можете искать пути в сети, которые являются действительными.
Для правильных путей теперь вы можете создавать дороги (у них есть острые края).
Примечание . Вам также необходимо сгенерировать координаты диаграммы Воронио для всех соседних ячеек, чтобы у вас не было границ по краям ячейки.
Если вам не нужны острые ребра, вы можете вычислить среднюю точку каждого соединения и использовать направление как касательную для интерполяции Безье между двумя ребрами в графе.
Об использовании Вороного-Диаграммы
Для архивирования городов, таких как дорожные структуры, точки из псевдослучайной функции могут быть выровнены на сетке, поэтому пути имеют форму прямоугольника.
Для большего количества графства как дороги пункты должны быть более неупорядоченными.
О псевдослучайной функции для генерации позиций точек для диаграмм Вороного
Это может быть нормальная случайная функция или множество Хаммерсли для более равномерного распределения точек без комков.
источник
Для создания дороги (и города) лучшая бумага, которую я нашел, является этой:
Процедурное моделирование городов Y Parish и P Müller
Это использует L-систему, и это может генерировать дорожные схемы США и ЕС. Если вы не хотите создавать дороги для всего города, вы можете просто создать основные дороги. Это может быть карта высот, карта воды и карта плотности населения.
источник
http://vterrain.org/Culture/Roads/ В разделе «Создание 3D-дорог» содержится некоторая информация о создании дорог .
Проблема с дорогами состоит в том, что они соединяют ориентиры (хотя они часто следуют по местности, вместо того, чтобы идти прямо от А к В).
Лично я бы создал местность, затем разместил бы реки (возможно, используя эрозию, см. Http://vterrain.org/Water/ в разделе «гидрогеология»), а затем разместил бы города в местах, где это имеет смысл (например, рядом с рекой или другим источник воды, или в месте, где вода может быть доставлена с использованием акведуков или водонапорных башен и труб) и, наконец, создать дороги между городами.
Чтобы сделать это более простым в использовании в процедурном мире, вы можете создать промежуточные точки на местности, где дороги будут наиболее вероятны, если они будут созданы в этом месте, а затем соединить промежуточные точки, если дорога в этом месте действительно создается.
источник
Во-первых, реки и дороги очень разные. Дороги, как правило, следуют по изолинии (одинаковая / подобная высота) - причина в том, что гораздо легче путешествовать по дорогам, которые не поднимаются и не сильно падают. Реки, с другой стороны, движутся перпендикулярно изолинии / изоклинам (спуск). Реки образуются в бассейнах (совокупности гор, которые текут вниз в данную долину) и имеют тенденцию образовывать древовидные структуры. Кроме того, дороги часто проходят перпендикулярно рекам, чтобы образовать логические мосты. Лучшая идея - сначала создать реки, а затем создать логические дороги (то есть дороги между городами). У меня нет времени вдаваться в подробности, к сожалению, но, надеюсь, это поможет вам выбрать правильный путь.
Это может показаться очевидным, но посмотрите на карты Google на различные типы местности и дорог; вы получите лучшее представление о том, как они должны выглядеть.
источник