Учусь программировать. Процедурная вода 2D. Пробую флюиды.

Nov 24, 2014 17:40

ч. 6 Учусь программировать. Алгоритм авторазметки или подсчет отдельных объектов на поле.

Все никак руки не доходят, чтобы взяться за Octree, хотя с квадродеревом (QuadTree) уже разобрался пару недель назад и выложил видео и сорсы, но писать про них буду чуть позже :).

А сегодня, опишу что же эта за процедурная вода такая. ВО первых слово процедурная - уже означается что это вода полностью программная, а не замоделенная или анимированная, то есть все подчиняется некоему программному алгоритму. По производительности такая вода, как оказалось, весьма ресурсоемкая, но весьма функциональна.

В своих реализациях я стараюсь минимизировать насколько это возможно постороннуюю работу и использовать исключительно код. Если взять в качестве примера несколько популярных песочниц, размер исходных файлов игры находится в пределах 40-80 мб, но при этом своими возможностями они превосходят многие игры на нескольких ДВД дисках. Помню в 90-х игры уже выходили размером с CD, а это около 600 мб.

Самая маленькая 3Д игрушка под названием .kkrieger (ссылка на википедию, возможно там есть ссылка на игру), в которую я играл весила всего 96 кб, и работала на чистых алгоритмах. Это полноценный 3Д шутер с несколькими видами оружия и монстров. Помню как запустив ее, я офигел, потому что гиг оперативки был отожран практически за пару секунд, то есть окружение строилось на ходу, а графика на (2004 год) была весьма впечатляющей. Это то, к чему стоит стремиться :).

Итак вернемся к воде.

В каких же играх присутствует такая вода ? например во всем известном MineCraft, Terraria, StarBounds, ну и конечно в ряде последних песочниц BlockScape и VoxelFarm (видео на которые есть в первой или второй части повествования).

Вот пример функционала такой воды


Началось все естественно с поисков, на которые было убито несколько часов. Просмотрев несколько статей и видео со ссылками на исходный код, максимум что их них можно было взять это лишь недоработанный вариант (по видео, что выше по ссылке, автор не предоставляет исходников). Недоработанность заключается в том, что вода заполняет пространство исключительно с верху вниз, если поле разделено на 2 части стеной и заполняется только одна часть, то во второй половине вода не поднимается, как это по идее должно быть.

Наглядный пример с 40 секунды:

image Click to view



Такой ущербный вариант я смог реализовать самостоятельно за пару часов без чужих исходников. Но этот вид больше похож на заполнение пространства твердыми предметами, например кучей золота, но никак не жидкости.
Поискав еще некоторое время я наткнулся на вот эту статью Simple Fluid Simulation With Cellular Automata. Чтобы попоробовать демку пришлось дополнительно скачать компилятор Anduino (честно я так и не понял какой ЯП он использует) :):). Это был именно тот нужный вариант с подъемом, к тому же прилагался исходный код.

Начав читать статью я понял, что используется алгоритм какого то клеточного автомата, весьма любопытная штука, но углубляться в детали я не стал.

Как оказалось, чтобы "вода" поднмиалась, нужно было учитывать т.н. компрессию, то есть сжатие воды в зависимости от того, сколько ее находится выше.
Код в принципе не сильно отличается от синтаксиса C#, поэтому я его частично переписал, но работать так как в демке мой вариант отказывался. Полученная вода дергалась, пропадала и вообще вела себя неадекватно. Еще некоторое время было потрачено на эксперименты с исходником, и разгадка нашлась вот в этой строчке "Flow = constrain( Flow, 0, min(MaxSpeed, remaining_mass) );", как оказалось это была встроенная в тот ЯП функция сравнения, которую я посчитал изначально ненужной. Найдя ее описание, и отредактировав код, а также добавив еше некоторые исправления и дополнения, я наконец то получил более менее вменяемый вариант.

На видео моя текущая реализация. Синяя субстанция ведет себя практически как вода, подчиняясь некоторым законам физики жидкостей. Даже уровень выравнивается практически полностью.

image Click to view



Теперь уже полявляется допольно большой набор конструкций, которые уже можно начинать объединять во что то целостное. Чем я и буду заниматься в ближайшее время :).

water 2d, fluids water, учусь программировать, procedural water, дневник разработчика

Previous post Next post
Up