Окружающая Среда. Как Создать Реалистичную Реку, Не Зная Заранее Всей Карты?

  • Автор темы Constantin
  • Обновлено
  • 23, Oct 2024
  • #1

Введение

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

Краткая информация о карте

В моей игре, когда игрок приближается к краю сгенерированной карты, на сервер загружаются новые фрагменты (небольшой квадратный фрагмент карты). Если для запрошенного местоположения не найдены фрагменты, они генерируются с использованием того же начального числа, которое используется в других частях карты. На данный момент ограничений на размер карты или общее количество генерируемых фрагментов нет. Я использую шум Перлина для создания карты. Я рассматриваю это как карту высот, где каждое поле имеет диапазон значений, которые оно занимает, например. Мелководье начинается от 0 inclusive ending on -0.12 эксклюзив.

Я уже читал о том, как сделать реку реалистичной:

Вопрос

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

Сходства

Похожий сценарий (думаю) есть и в Майнкрафте. Здесь карта также генерируется по мере движения игрока с использованием семени, и есть реки, которые продолжают бурлить, пока карта генерируется. К сожалению, я не знаю используемой там техники.

Скрин из игры

окружающая среда. Как создать реалистичную реку, не зная заранее всей карты?

окружающая среда. Как создать реалистичную реку, не зная заранее всей карты?

Загрузка чанка временно отключена, чтобы показать границы:

окружающая среда. Как создать реалистичную реку, не зная заранее всей карты?

#окружающая среда #география #процесс построения мира #реки

Constantin


Рег
24 Feb, 2016

Тем
85

Постов
225

Баллов
680
  • 26, Oct 2024
  • #2

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

Есть несколько альтернатив, которые могут сделать эту работу:

ЛОД и физика:

Вы можете суб- и супер-сэмплировать шум Перлина для создания карт с разными разрешениями. Если в ваших тайлах 1 тайл на 1 метр, вы можете создать всю карту на более управляемом уровне, скажем, 1 тайл на 1 км, рассчитать реалистичные точки источника и бурный путь реки, а затем разделить вниз, скажем, 1 тайл на 100 м - на этом уровне вы знаете, где река течет с точностью до 10 плиток, определяете, где река течет по этому пути, а затем рекурсивно, где река течет через эти меньшие плитки, и т. д., пока не достигнете полного уровня детализации.

Лучше заранее рассчитать это и сохранить, если это возможно. Вы по-прежнему можете запускать это по требованию, но писать код не так уж и просто.

LOD и 1D перлин

Как указано выше, на карте низкого разрешения найдите высшую точку, откуда может исходить источник, найдите ближайшую точку на уровне моря, нарисуйте прямую линию. Теперь используйте 1D-шум Перлина, чтобы сделать ветер на реке перпендикулярным линии.

Это гораздо проще кодировать — могут быть некоторые нереалистичные артефакты, но в такой 2D-игре вы вряд ли их заметите.

Подделай это

Иметь 2 стиля рек. Кто-то идет «в гору», кто-то «в гору». Создайте плитки, показывающие, как река вытекает из источника и превращается в полноводную реку, а также плитку, показывающую полноводную реку, впадающую в небольшой подземный объект.

Если значение шума Перлина для прибрежной зоны является очень точным значением, то это порождает реку «в гору». Это перемещается к самой высокой точке края плитки, которая не граничит с исследованной плиткой, а затем, когда загружается следующая плитка, переходит к следующей самой высокой точке. Если он обнаружит, что достиг локального максимума (нет более высокой точки) или все соседние плитки уже исследованы, вернитесь примерно к середине, поместите плитку, на которой изображена река, выходящая из пещеры, источника или чего-то еще под землей, поэтому пользователь не видит реку, начинающуюся с вершины небольшого холма.

Если значение шума Перлина для горы является очень точным значением, то оно порождает «нисходящую» реку, следуя до самой нижней другой границы неисследованного тайла, и если оно достигает локального минимума или участка без неисследованных соседей , поместите плитку, на которой изображена река, исчезающая под землей.

Обычно этого достаточно для тайловой 2D-игры.

2 (или более) перлин-канала

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

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

Если вы запустите его дважды — я бы предложил влажность и высоту. Если вы запустите его 3 раза, я бы предложил размер объекта (песок/камень, лед/снег или голая местность -> луг -> кустарник -> деревья), влажность (пустыня -> плодородная -> река -> болото) и высота (вода -> равнины -> холмы -> горы). 4 раза, возможно, тоже будут включать температуру.

Вместо того, чтобы сосредотачиваться на том, чтобы река текла «под гору», попробуйте пропустить ее там, где влажность находится в пределах определенного контурного диапазона. Хотя река не будет «реально» течь вниз по склону, в игре с плитками, такой как та, которую вы показываете, высота скрыта, вам лучше убедиться, что деревья растут рядом с реками, реки не граничат с пустыней, а земля возле рек плодородные сельскохозяйственные угодья.

 

Makarovleha


Рег
08 Apr, 2020

Тем
71

Постов
204

Баллов
579
  • 26, Oct 2024
  • #3

Как добавить реки на карту, если я не знаю, как все карты

выглядит как? Если я не знаю, где находятся горы, я не смогу определить

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

  2. Вы не можете сделать это полностью в рамках куска. Если вы находитесь на краю фрагмента и кажется, что существует локальный минимум, у вас есть два варианта.

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

 

Alletr2005


Рег
13 Jan, 2005

Тем
76

Постов
178

Баллов
578
  • 26, Oct 2024
  • #4

Несколько лет назад я написал алгоритм для ролевой игры, который работал аналогичным образом.
Вспомните «Сапер». Когда вы обнаружите горный квадрат, с вероятностью x% там будет вода. Но этот квадрат влияет на вероятность того, что кусок рядом с ним окажется горой. Какие влияют на внешний вид воды. Для каждой карты вы можете указать источники воды. Карта запускается из выбранного числа в диапазоне 0-100. Это количество источников воды. Чем больше карта не затенена, тем больше вероятность появления воды.

Теперь, чтобы помочь вам, природа пришла с этой изящной штукой: ручьи появляются, а затем просачиваются в трещины и исчезают. Сегодня, благодаря современным технологиям, мы можем проследить, куда он возвращается, но на этапе «открытия» один источник может отображаться как 3 или 4 разных ручья. ТАК, они не обязательно должны быть одной непрерывной линией от обнаруженного источника до «куда-то». Это может закончиться после 4 или 5 кусков.

Таким образом, вы можете просто прекратить создание кусков воды, когда игрок встретит уже обнаруженный «сухой» кусок.
ИЛИ

Внесите забавные изменения в свою карту. Со временем (ход игрока) сухой кусок становился мокрым, когда генератор пытался связать самую большую водную «лужу» (если она была ниже). Генератор также может иметь вероятность создания ручья, поэтому он не будет идти по прямой линии.

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

 

Janinv


Рег
30 Sep, 2010

Тем
84

Постов
182

Баллов
622
  • 26, Oct 2024
  • #5

Самый простой алгоритм заключается в том, что реки «привязываются» к горной долине всякий раз, когда существующая река находится на некотором пороговом расстоянии (и, возможно, под углом) к долине, отвечающей минимальным требованиям.

Допустим, у вас есть река, сгенерированная любым алгоритмом, который вы используете. Существующего источника пока нет, и он заканчивается в «тумане войны» на вашей карте. Но игрок движется, чтобы раскрыть это, и вы используете алгоритм, чтобы снова сгенерировать недостающие части.

Предполагая, что ваш алгоритм время от времени генерирует горы, если горы/долины создаются на расстоянии n единиц от «конца» реки и под любым углом менее +/- 45 градусов касательной реки, то сгенерируйте путь реки из этого укажите на горную долину и поместите там ледник.

Если конечная точка реки находится дальше, чем на n единиц, начните генерировать ее путь, и если этот путь проходит в пределах n единиц долины, сделайте то, что описано выше.

Нужно было бы сначала сгенерировать горы, а затем наложить реку поверх такой карты.

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

Это, конечно, основано на схеме создания карты, состоящей из двух частей, где генерируется большинство объектов карты, а поверх них «рисуются» реки. Например, это сработает для Minecraft, который, я считаю, делает это. Если бы ваша игра была более сложной и использовала высоту для определения путей рек, это было бы нежизнеспособно.

 

Noruen


Рег
22 Dec, 2006

Тем
78

Постов
191

Баллов
591
Похожие темы Дата
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно