![]() |
Пуск рек на карте высот
Есть сгенерированная карта высот. Нужно из заданной точки пустить реку.
Моё решение (и как оказалось не только мое): 1) Набросать на карту случайно (но достаточно равномерно) много-много точек. Сразу же определить для каждой точки её соседей. Как делал я: точки ставятся в виде сетки, потом отодвигаются от своих позиций на небольшую величину. Находил способ с диаграммой Вороного, но результат лишь немного лучше получается. 2) Берем начальную точку. Задаем при необходимости угол, если необходимо. Ищем у точки соседей, с высотой меньше чем у данной. Стараясь сохранить угол течения, и течь на более низкую высоту, подбираем оптимальную точку. Опционально: высчитываем новый угол течения. В 80% случаев результат хороший. В остальных, речка, столкнувшись с возвышенностью может повернуть градусов на 120. Можно заюзать сглаживание ломаной прямой, но тогда река будет теч не там где её сказали. Можно ещё резать каналы в холмах, но это не правдоподобно. Пока писал понял, что можно просто отбраковывать неугодные реки. Но всё таки может кто-то сталкивался с такой задачей? (чуть позже будут |
Ответ: Пуск рек на карте высот
я пытался делать так:
на каждой точке карты 1 капля потом даю течь каплям к самой нижней из соседних точек, при каждом перемещении капли в новую клетку делаю в специальной карте +1 к этой точке. Потом рисую только те у которых набежавший счетчик больше какого то методом тыка подбираемого числа. Тоже ниче так выходит |
Ответ: Пуск рек на карте высот
ДЕМО
Пускается три реки из одних и тех же точек, отбраковываются только те, которые не дошли до океана, или переселись с другой рекой. Галочка что бы сделать карту ступенчатой, так лучше вроде реки получаются. Кнопка для обновления. UPD: часто ли у вас получаются ну уж совсем не правдоподобные карты? |
Ответ: Пуск рек на карте высот
манки?
|
Ответ: Пуск рек на карте высот
Цитата:
|
Ответ: Пуск рек на карте высот
![]() Эта река какая-то неправильная. |
Ответ: Пуск рек на карте высот
:-)
![]() |
Ответ: Пуск рек на карте высот
минус градиент?
|
Ответ: Пуск рек на карте высот
Цитата:
я только для заданной формулой умею :( |
Ответ: Пуск рек на карте высот
А можешь сделать с не столь разблуренной картой высот?
Как понимаю сперва мы считаем нормали изходя из карты высот (тот же подход как в нормалях для bump'а в шейдерах). Данные нормелей используются для определения течения. Далее даём каплям течь. Каждый раз когда капля где-то протекает она увеличивает степень протекаемости зоны по которой течёт. От степени протекаемости определяется радиус капли. Радиус капли нужен для определения направления течения, для вытекания при скоплении в одном водоёме. Получается капли текут и могуз застрять в низинке, тогда они там скапливаются тем самым увеличивая количество воды (степень в зоне), и каждый раз пытаются найти вектор вытекания исходя из векторов нормалей в радиусе. Имхо, нужно пробовать реализовать, но думаю таким образом у нас получяться широкие и менее реки, а также озёра. Естественно вода также теряет свою степень значимости со временем, т.к. проникает через почву. Что может по сути привезти к озёрам без рек с выходами если степень поглащения достаточно высокая чтобы не дать каплям разливаться. Удобно делать демки в JS - дал ссылку, и затестили. |
Ответ: Пуск рек на карте высот
Ну в общем, градиент численно можно реализовать оператором Собеля, например.
Для каждой точки вычисляется напряжение, как разность между гравитационными потенциалами точек (высотами). Каждая точка порождает потоки во все направления с отрицательными напряжениями (в точки с меньшей высотой), при этом скорость истечения (сила тока воды) распределяется пропорционально модулям напряжений (водопады, пороги, тихие долинные реки) - аналогично закону Ома. В случае попадания в локальный минимум (низину), образуется озеро, а следующей точкой истечения определяется наиболее низкий берег (это будет точка с наименьшим положительным напряжением относительно дна). Можно так же ввести модель сопротивления среды (тип дна) - по аналогии с сопротивлением в электрическом контуре. Управляемые плотины будут аналогом конденсаторов (озёра, с ручной регуляцией входного / выходного потенциала). Насосы, очевидно, будут источниками тока (воды): буду создавать заданную силу тока воды и обладать бесконечным внутренним сопротивлением. Можно подойти к задаче и со стороны CV: распознать контура на карте высот и от них плясать. С другой стороны, реальное русло ещё зависит от характера земной породы: вымывание грунта, подземные реки и прочее. Upd: поправил термниологию |
Ответ: Пуск рек на карте высот
Цитата:
а сильный блюр получается потому, что используется шум перлина. Цитата:
В принципе, если грамотно обработать карту высот (убрать мелкие ямки, округлить горы...) и увеличить масштаб раз эдак в 100, сделать высыхание луж воды, то может и получится, но это очень сложно (как в плане написания (я такое не осилю), так и в плане производительности) Цитата:
и озера не образуются да, я специально отбраковывал такие реки, следующим шагом как раз будут озера, но позже) |
Ответ: Пуск рек на карте высот
Цитата:
Цитата:
|
Часовой пояс GMT +4, время: 05:43. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot