Создание 2D-дождя (и гидродинамика)

11

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

Это видео наглядно демонстрирует это: http://imgur.com/gallery/CKCGKbG

Я знаю, как заставить дождь падать и проверять, где он падает на землю, но вот где я застреваю. Мой вопрос: как это могло быть создано? И как можно так идеально моделировать поток воды, не снижая производительность?

Заранее спасибо!

Pandaqi
источник
1
Ключ - система гидродинамики. Я подозреваю, что когда капля дождя падает на землю, она генерирует небольшое количество воды в этом положении, которое затем обрабатывается системой гидродинамики, как обычно. На плоских поверхностях этому препятствует испарение, но когда склоны заставляют воду концентрироваться в области, приток сильнее, чем испарение, и начинают образовываться лужи.
Филипп

Ответы:

9

Водная система 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 полной единицы воды в своей плитке, если под ней нет сплошной плитки. Но тогда вы прячете поток воды. Вместо того, чтобы скрывать это, вы должны будете определить, как течет вода, а затем нарисовать соответствующий водяной спрайт на его месте.

jgallant
источник
2
Чтобы добавить к факту, что частицы дождевой капли имитируют эффект падения воды: небольшие брызги капель на поверхности также не связаны с фактическими частицами дождя, а являются отдельным эффектом. Комбинация заставляет это выглядеть, как будто капли делают брызги.
Felsir
Вау, это именно то, что я искал. Я думал, что мне придется прибегнуть к какой-то слишком сложной жидкостной системе, основанной на частицах, но сеточные системы, похоже, работают так же хорошо. Хотя, чтобы добавить давление воды, я думаю, вам просто нужен второй массив, в котором хранятся значения давления и потоки от высокого давления до мест низкого давления? Если так, то это все равно не должно быть слишком сложно для компьютера.
Пандаки,
Нет, все, что вам нужно сделать с давлением, это добавить правило, например, плитке разрешено содержать более 1 полной единицы жидкости. Если эта плитка содержит более 1 полной единицы жидкости и не может течь в соответствии с обычным набором правил - тогда заставьте ее течь вверх. Отрегулируйте так, чтобы это позволяло большему количеству воды течь на основе значения давления этой плитки.
jgallant
3

Есть множество способов приблизиться к этому. Как всегда «это зависит»

И поэтому я предполагаю, что один из способов был бы таким: учитывая произвольное «погружение в землю», наложите «водяной ящик», который его ограничивает. Грунт и водяной бокс отображаются слоями, поэтому сначала отображается земля, а после - водяной бокс.

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

Допустим, размер водяного ящика составляет 32х32 пикселя. Добавьте одну линию акварели от 0,31 до 31,31. Еще 10 капель нарисуйте линию от 0,30 до 31,30. Так как капли накапливаются, вы строите водяную камеру от дна до ее полного заполнения.

Надеюсь, что это имеет смысл.

RobM
источник