Я экспериментирую с погодными условиями в моей игре, и я был впечатлен тем, как Starbound справился с дождем. В основном, когда дождь падает на землю, он либо рассеивается по горизонтали (и поглощается землей), либо создает кучи воды (когда капли дождя падают внутрь отверстия в земле).
Это видео наглядно демонстрирует это: http://imgur.com/gallery/CKCGKbG
Я знаю, как заставить дождь падать и проверять, где он падает на землю, но вот где я застреваю. Мой вопрос: как это могло быть создано? И как можно так идеально моделировать поток воды, не снижая производительность?
Заранее спасибо!
2d
water
fluid-dynamics
Pandaqi
источник
источник
Ответы:
Водная система Starbound на самом деле является 2D-клеточным автоматом. Каждая плитка на экране, которая не содержит передний слой плитки, способна удерживать воду. Количество воды рассчитывается с помощью клеточных автоматов.
Подробнее об этой технике здесь:
http://www.gamasutra.com/view/feature/134736/an_intro_to_cellular_automation.php
http://www.jgallant.com/2d-liquid-simulator-with-cellular-automaton-in-unity/
Что касается капель дождя, то это частицы. Они служат главным образом для того, чтобы имитировать, что на самом деле вода падает с неба. Вода накапливается только потому, что игра знает, что сейчас идет дождь. Отдельные капли не имеют ничего общего с фактическим образованием водных бассейнов.
То, как они заставляют его накапливаться, определяется тем, где есть отверстия в верхнем слое земли. Если есть область, которая может накапливать воду, клетки в этой области увеличивают свои уровни воды соответственно.
Starbound также имеет дело с давлением воды, и их техника рендеринга довольно удивительна. У них лучшая двумерная реализация физики моделирования воды с использованием клеточных автоматов, которую я когда-либо видел.
Вот примитивный вид движка физики жидкости, использующего вышеупомянутую технику клеточных автоматов. Часть рендеринга становится немного более сложной, так как ваша вода представлена числовым значением.
http://www.jgallant.com/images/pressuretest.gif
В этом примере очень простым улучшением было бы скрытие водяных ячеек, которые имеют менее 1 полной единицы воды в своей плитке, если под ней нет сплошной плитки. Но тогда вы прячете поток воды. Вместо того, чтобы скрывать это, вы должны будете определить, как течет вода, а затем нарисовать соответствующий водяной спрайт на его месте.
источник
Есть множество способов приблизиться к этому. Как всегда «это зависит»
И поэтому я предполагаю, что один из способов был бы таким: учитывая произвольное «погружение в землю», наложите «водяной ящик», который его ограничивает. Грунт и водяной бокс отображаются слоями, поэтому сначала отображается земля, а после - водяной бокс.
каждый раз, когда капля воды падает на землю, добавляйте ее в водяную камеру. Когда ящик с водой достигнет магического числа, добавьте линию воды. Так скажем, 10 капель земли в провале, это добавляет одну линию в водяную камеру.
Допустим, размер водяного ящика составляет 32х32 пикселя. Добавьте одну линию акварели от 0,31 до 31,31. Еще 10 капель нарисуйте линию от 0,30 до 31,30. Так как капли накапливаются, вы строите водяную камеру от дна до ее полного заполнения.
Надеюсь, что это имеет смысл.
источник