Я создал карту случайных высот, и теперь я хочу создать реки. Я создал алгоритм, основанный на *, чтобы реки текли от пиков к морю, и теперь я нахожусь в поиске элегантного алгоритма для их рендеринга.
Это 2D, квадрат, карта сетки. Ячейки, которые помещает река, имеют простое целочисленное значение в этой форме: rivernumber && pointOrder. Т.е.: 10, 11, 12, 13, 14, 15, 16 ... 1 + N для первой реки, 20,21,22,23 ... 2 + N для второй и т. Д. Это создается в время генерации сетки карты и выполняется один раз, когда генерируется мир.
Я хотел рассматривать каждую реку как вектор, но есть проблема: если у одной и той же реки есть ветви (потому что я создаю некоторый шум для создания ветвей), я не могу просто соединить точки по порядку.
Второй альтернативой является создание сложного алгоритма, в котором анализируется каждая точка, проверяется, не является ли следующая ветвь, если это так, запускается другой алгоритм, который заботится о ветке, затем возвращается к главной реке и т. Д. Очень сложный и неэлегичный.
Возможно, есть решение в алгоритме генерации мира или в алгоритме рендеринга, которое обычно используется в этих случаях, и я не в курсе.
Какие-нибудь советы? Спасибо!!
источник
Ответы:
Этот учебник / блог разработчика игр предоставляет отличный метод для генерации рек, и они очень хорошо рендерится. Я не уверен, может ли это быть эффективно применено в вашей ситуации, так как вы выбрали другой подход (и у вас есть карта на основе сетки), но это стоит посмотреть наверняка.
источник
Одна вещь, которую вы могли бы сделать, это заставить каждый отдельный узел обрабатывать себя. Сделайте проход через него после генерации, но перед отображением и дайте каждому квадрату реки список входов (меньшее число, та же река) и выходов (большее число, та же река).
Из этих данных вы сможете выяснить, где находятся вход (ы) и выход (ы) (возможно, поможет сохранение относительного местоположения), и вы можете оттуда визуализировать реку этого квадрата на основе связей. Самый простой способ сделать ветку - это соединить входы / выходы с центром квадрата.
Графическое представление этого может быть получено многими различными способами, и вы не дали достаточно информации о его использовании, чтобы я мог рекомендовать его напрямую; так что вместо этого я упомяну только в пути с участием particleish системы , где каждый сегмент воды протекает динамично «под горой».
Сделайте так, чтобы корневой квадрат начинал с некоторого количества «кусочков воды» на каждом из своих входов, и пусть они случайным образом выбирают из доступных выходов при создании. Когда он попадает в выход, возьмите один у плитки, которую он ударил, и верните кусок воды в начало своего квадрата. Так как он уже появился в следующем квадрате (делайте это только один раз для фигуры в квадрате), и вы уже знаете настройки и расчеты (не повторяйте случайность), вы можете позволить этому циклу фигуры в своем квадрате с очень небольшим Расчет, и если вы хотите, скорее всего, с помощью шейдера.
Это имеет то преимущество, что позволяет вашим рекам переходить в более мелкие реки после ветвей, и две получающиеся реки не обязательно должны быть одинакового размера. Потребуется некоторое время, чтобы река полностью заполнилась от верха до дна, но полученный эффект должен быть довольно приятным, так как вы могли бы получить нечто подобное, просто основываясь на том, какие узлы имеют реки.
Кроме того, в зависимости от начального числа и кода он будет выглядеть каждый раз по-разному, даже если размещение узла было одинаковым.
Надеюсь, что этот пример где-то в том направлении, которое вы ищете.
источник