Визуализировать реки в сетке

8

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

Это 2D, квадрат, карта сетки. Ячейки, которые помещает река, имеют простое целочисленное значение в этой форме: rivernumber && pointOrder. Т.е.: 10, 11, 12, 13, 14, 15, 16 ... 1 + N для первой реки, 20,21,22,23 ... 2 + N для второй и т. Д. Это создается в время генерации сетки карты и выполняется один раз, когда генерируется мир.

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

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

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

Какие-нибудь советы? Спасибо!!

Габриэль А. Зоррилья
источник
Я думаю, вы могли бы использовать некоторые алгоритмы, используемые для создания лабиринта, и просто вырезать несколько egdes, чтобы создать более реалистичную карту реки.
Ali1S232
1
У меня есть речной путь, но я не знаю, как обрабатывать ветви при их рендеринге, соединяя точки.
Габриэль А. Зоррилья
Есть точка в месте слияния (точка встречи двух рек), которая рассматривается как особый вид узла?
Коммунистическая утка
1
Однажды я увидел статью о том, как создавать дороги на плитке. Он выбрал плитки, на основе которых соседние плитки также имеют свойство дороги. он создал что-то около 16 различных плиток (включая все вращения). этот шаг был сделан только во время генерации сцены. не знаю, могли бы вы сделать то же самое или нет.
Ali1S232
4
Можете ли вы дать нам скриншот с несколькими набросками, чтобы лучше показать, что вы пытаетесь сделать?
AttackingHobo

Ответы:

1

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

dlras2
источник
Это действительно мило.
Тим Холт
1
Больше деталей, которые могут быть полезны: Реки в этом проекте текут из гор в океаны. Объем увеличивается по мере того, как он стекает вниз, а реки, которые объединяются, добавляют свои объемы. Ширина линии на карте - это квадрат объема. Каждое место в реке указывает на спуск; развилка в реке означает, что два или более мест указывают на одно и то же место для спуска. Я думаю, что это может быть использовано и на сетке.
amitp
0

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

Из этих данных вы сможете выяснить, где находятся вход (ы) и выход (ы) (возможно, поможет сохранение относительного местоположения), и вы можете оттуда визуализировать реку этого квадрата на основе связей. Самый простой способ сделать ветку - это соединить входы / выходы с центром квадрата.

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

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

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

10--10--6--6--2--2
    |      |     
    4--4   4
       |   |
       4---6--6--6
       |  
       2

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

Надеюсь, что этот пример где-то в том направлении, которое вы ищете.

Лунин
источник