Ура, ура, ура! Мигель Сеперо приступил к реализации воды в своём движке Voxel Farm, который, кстати, теперь имеет логотип. Почему я радуюсь? Потому что это напрямую связано с EverQuest Next, который построен на этом движке и который я с нетерпением жду. Tug тоже :)
В своём недавнем сообщении Мигель рассказывает о принципах, которыми руководствуется в создании столь ответственной части моделирования реального мира.
Существует веская причина, почему я откладывал с реализацией воды, и совсем не потому, что эта задача мне кажется трудной. Жидкости подчиняются более простым правилам, чем другие мной рассмотренные механизмы. Дело в другом.
Вода обладает меньшей плотностью, чем здания и грунт, её течение будет определяться дамбой или горой. По-моему, для начала нужны «тяжёлые вещи», а уже затем вода. Вы можете возразить, что она имеет значительное влияние на особенности рельефа и будете правы, но, как вы увидите далее в моём тексте, я думаю, что всё наоборот.
В любом случае, мне хотелось иметь лучшее воплощение идей строительства и ландшафта, и нельзя, чтобы вода мешала этому. Я думаю, что достиг того момента, когда стало возможным снова взглянуть на систему генерации воды.
Я больше думаю о создании больших объёмов воды, вроде рек и озёр, а не о том как она стекает вниз с холмов. Это две совершенно разные системы. Даже если вода будет выглядеть одинаково, она будет управляться разными частями кода. В идеале вы не должны заметить различий между озером и ведром воды. В реальности это так, но, к сожалению, нашему железу до этого как до Луны. Как обычно, нам потребуются искусные уловки.
Я сейчас испытываю такую систему:
Мы начинаем с карты высот. Ландшафт не обязательно должен быть основан на ней, он может состоять полностью из вокселей с пещерами, свесами и т.д. Карта высот лишь обозначает видимую поверхность для симулятора воды, она должна запечетлевать объемы земли. Карта выглядит вот так:
Ничего фантастического, это заурядная карта высот. Но важно то, как вы поделите её. Для кусочков карт я выбрал размер примерно 50 км шириной. Это означает, что все реки и озёра будут заключены в этот кусочек, и при таком подходе мы не получим стокилометровую реку. Если же нам это потребуется, то нужно увеличить размер куска. Пятьдесят километров в моём случае — хорошее начало.
Следующим шагом будет добавить источники воды. Не нужно расставлять их повсюду, лишь там, где высота земли достаточна. Для пятидесяти километровой карты я создал около 200 точек.
Следующим шагом мы ищем ближайший путь из каждой точки к низшей плоскости, которая будет считаться уровнем моря. Можно использовать любой алгоритм поиска пути, например A-star. Так получаются реки, показанные на картинке ниже голубым цветом. Морская вода окрашена в синий:
Красными точками отмечены источники воды. Как вы можете видеть, реки следуют по пути наименьшего сопротивления в поисках океана.
А ещё мне хотелось получить озёра, но я не знал простого способа как их сделать, до тех пор, пока однажды я не занялся отладкой поиска пути. Для того, чтобы найти баг (я уже забыл, что он из себя представлял), я заставил подсвечиваться те места, которые алгоритм «прощупывал» перед тем, как проложить свой курс. Я обнаружил, что «поиск пути» начинает «растекаться» всякий раз, когда натыкается на плоские поверхности. Это очень похоже на то, как в действительности ведёт себя вода.
Как только я добавил области, где алгоритм искал путь, я получил озёра!
Мне понравилось, что озёра появляются на разных высотах. Также, если вы рассмотрите значения высот на берегах озёр, вы заметите что они не сильно различаются. Это означает, что поверхность озера почти плоская. В реальности часто это не так потому, что озеро на самом деле тоже течёт.
Я закончу эту тему в следующем сообщении, где мы узнаем как получить действительную водную поверхность. А ещё мы выясним где должны пролегать водопады. У нас они обязаны быть.
26 комментариев
Хотя меня удивило, что в EQ взяли движок, в котором не было воды на тот момент. Возможно, поставили ему железное условие, чтобы добавил в ближайшее время…
Огромное спасибо за подробное описание технологии с картинками. Всякие груды формул с иллюстрациями приобретают гораздо больший смысл даже для понимающего человека.
Конечно, многие вещи неплохо бы уточнить. Например, вышеупомянутые дамбы. Если карта высот масштабируется, то рукотворные сооружения это делают не очень хорошо.
Если алгоритм ведёт расчеты по минимальному размеру вокселя, то он далеко не риалтаймовый. Если он приблизительный, то какая-нибудь местная «великая китайская стена» может в него и не вписаться.
И конечно же интересно, что будет происходить пре внесении катастрофических изменений игроками в ландшафт. Как-то формирование водохранилища, или наоборот, сброс воды на нём.
К примеру, дварф-фортресс я удалил, когда игра подвисла при перемещении реки в канал и формировании искусственного озера вокруг крепости. Довольно-таки простые желания для игроков, которые будут играть в подобную игру, не правда ли?
Обычно Мигель не даёт подробные описания своей работы, ограничиваясь объяснениями и терминами, которые может понять широкая публика.
Насколько я понял, он разделит воду в естественных водоёмах и ту, что будут использовать игроки. Если мы зачерпнём воду в ведёрко и выльем ее на холм, то за её поведение будет отвечать один алгоритм, а для рек и озёр вода будет обрабатываться en masse совсем другим алгоритмом. Но лучше всего будет подождать второй части статьи, где он напишет про водопады.
Я подозреваю, что именно там будут комбинироваться с помощью белых и черных дыр эти два способа.
Да, наверное проклятия, насылающие наводнения, учитывать ещё сложнее, чем дамбу)
Что, в принципе, логично)
Да, проблемы начинаются именно там, где игроки решают использовать водоёмы целиком)
Видимо будем ждать множество ведерок, что льются по картам нового предрассчитанного водоёма)
Что ж, подождём конечно статью про водопады. Потому что сами водопады кажутся решением тривиальным и статья будет явно не только про них)
Очень интересно, спасибо за статью. За процедурной генерацией будущее, имхо.
Купил год назад почти Воксельферму.
Так и не понимаю, как с ней работать.
Может кто помочь? На русском уроков нет, те что от разрабов мне как горохом об стенку.
Вообще непонятно, как делать мир в этом движке с нуля.
Очень прошу помочь.
Почта melomania@inbox.ru
Скайп Serious_Max_2010.
Заранее благодарен за любую помощь.
А т оя уже в печали, отвалил 3 косаря гринов за инди, и толку ноль.