Симуляция грязи в Blender 3d. Часть первая- База

Сегодня рассмотрим такую проблему как симуляция жидкости повышенной вязкости в Блендере. К такому роду жидкости можно отнести грязь, сироп, мед. Дополнительно рассмотрим коллизию объектов с подобной жидкостью и проблемы, которые у вас могут возникнуть.

В качестве примера возьмём сцену из моего фильма, где меч с размаха падает в лужу грязи (26:34) — https://youtu.be/89e-tS94zDs или https://rutube.ru/video/de06e9cac5946816a47927f2378dd843/? r=plwd

d42383cfdcef266d5394dd178063868a.png

База

Вся симуляция в Блендере с целью оптимизации ограничивается заданным объемом называемым доменом. Домен симуляции жидкости должен содержат как минимум эмиттер- это объект создающий в пространстве домена жидкость. Также домен может иметь объекты коллизии, которые будут взаимодействовать с жидкостью и силы (Force) воздействия на поток.

Вся анимация жидкости состоит из двух этапов. На первом этапе формируются частицы, которые взаимодействуют друг с другом, объектами коллизии и силами, на их основе и создаться симуляция. На втором этапе по координатам этих части и их объему формируется полигональная сетка которая позволяет уже рендерить и видеть частицы как жидкость.

Создадим новую сцену и выберем дефолтный куб, зайдите в его настройки физики и выберете Жидкость (Fluid). В типе выберем Domain

46591ceea624d534fa052526b25f1dc0.png

Домен.

Domain type — указывает что именно мы планируем симулировать газ или жидкость, выберем жидкость fluid.

Resolution Division — разрешение домена, чем оно больше тем детализированией будет симуляция и более реалистичной, чем больше это значение тем медленней будет рассчитываться анимация жидкости. Для предпросмотра анимации я обычно ставлю 80, для финальной анимации от 160. Визуально можно увидеть размер расчетной единицы (далее ячейки) как небольшой куб в нижнем углу домена- его размер соответствует размеру ячейки симулируемой жидкости.

Слева на скрине поток жидкости с меньшим разрешением равным 32, справа с большим равное 80. Видно что жидкость с большим разрешением ведет себя более реалистично.

6dc64d4fd00a808a8229a5adc8768c62.png

Time Scale — позволяет ускорять или замедлять время внутри симуляции, например для густой жидкости можно уменьшить это значение что даст видимость большой вязкости.

CFL Number — Максимально возможное ускорение на одну частицу. Этот параметр определяет ускорение максимума для частиц, также он косвенно влияет на шаг симуляции. Чем больше это значение, тем меньше будет шагов и быстрее будет рассчитываться симуляция, но тем менее она будет реалистичная. Советую диапазон значений от 1 до 4.

Timestep Maximum/Minimum- Для увеличения реалистичности анимации используется расчеты не только на каждый кадр, но и расчеты между кадрами. Например, в нашей сцене удара мечем по грязи скорость меча настолько большая что длиться всего несколько кадров при начальном ударе и если мы не будет рассчитывать его коллизию между кадрами (фреймами) то получим просто рваную симуляцию, однако чем больше будет расчетов между фреймами тем больше будет промежуточных шагов симуляции и тем более реалистичный результат мы получим на выходе, но и более долгий расчет. Важно просто понять что если в симуляции есть быстро движущееся объекты колизии то необходимо увеличивать Timestep Maximum до 10 и более, также увеличивайте если видите что вода, падающая из эмиттера имеет ступенчатую структуру. Данный параметр указывает Блендеру сколько максимально и минимально он может сделать расчетов между кадрами. Поскольку на каждый кадр Блендер будет сам решать какое количество расчетов сделать автоматически (если вы не сняли галку с Use Adaptive Time Steps) вы все равно можете указать ему минимально допустимое количество расчетов через параметр Timestep Minimum. Для грязи подойдет 20/1

Слева на скрине можно видеть более плавный поток жидкости за счет большего значения Timestep Maximum = 4, а справа ступенчатый поток из-за меньшего значения.

d36c3000aa09d55cb9f2066fc86d8a9a.png

Delete in Obstacle — если ваша жидкость попадет внутрь объекта колизии например когда он резко появляется в объеме жидкости то благодаря включению этой галочки жидкость внутри этого объекта будет удалена. Это позволяет избежать кучи ошибок в симуляции.

b25954b4f6673c411dc7edbc7f3a4d43.png

Border Collisions — указывает какие из сторон домена будут пропускать через себя жидкость, а какие нет.

Simulation Method — Блендер поддерживает два метода расчета симуляции жидкости FLIP и APIC. Первый создает больше брызг, второй дольше держит любые завихрения воды, но и более спокойное поведение частиц. Если вы хотите брызги шампанского ставим FLIP если хотим спокойную воду в кружке ставим APIC. В нашем случае для грязи везде будем использовать APIC, но есть нюанс о нем позже.

На скрине слева FLIP справа APIC при равных настройках

9853d3f701e08c0576f4ba32f96c2dae.png

System Maximum — указывает на максимальное количество частиц используемых при симуляции. Значение 0 указывает Блендеру автоматически высчитать это значение. Ограничивать это значение имеет смысл только в целях ускорения расчетов при этом сильно пострадает реализм симуляции.

На скрине слева ограничение в расчетов на 2000 частиц, с право без ограничений.

b1d9fc6622b97b77a19115e7fb181f32.png

Particles Radius — значение определяет радиус частицы воды. Чем оно меньшее, тем больше будет использоваться частиц для заполнения одного и того же объема. Это позволит сделать жидкость более отзывчивой на коллизию и сделать ее более тонкой. Однако сильно маленькое значение заставит солвер удалять всплески и брызги. Рекомендую оставить дефолт 1.

На скрине слева двойной диаметр частиц а, справа 0.7

fbd2e9f1b39208f5c472205d6a096cec.png

Sampling — указывает Блендеру о коэффициенте заполненности частицами объема жидкости. При большом значении мы получим меньше всплесков и брызг и более ламинарное течение жидкости, также заполнение объема будет идти быстрее.

На скрине слева заполнилось (=1) меньше чем справа (=5) для грязи можно ставить 3 и более.

f158deda512ed0fff0b38a72e51d6412.png

Randomess- значения случайности заполнения и движения частиц. Чем больше тем меньше брызг и распада на струи. Для грязи поставим 0.8.

Слева значение 0 справа 10

cb0904dbdc98fc782c2e7e9abb0ff971.png

Предвидя вопрос «почему слева в динамики вода более хаотична » отвечу:

f351729117913459fd037d71af257992.png

Particles Maximum/Minimum — указывает сколько на одну ячейку симуляции задаваемую в разрешении домена будет использоваться минимально и максимально частиц. Опять таки при большом количестве частиц получаем более ламинарный поток с минимумом завихрений и брызг, при малом значении жидкость с более активной жизненной позицией. Для грязи оставим все по дефолту

На скрине слева в три раза меньше частиц на ячейку чем справа.

df0cd260be24c4a041dde92aaa6d21fe.png

Fraction Obstacles — Указывает силу гидрофобного эффекта у объектов колизии. Чем оно больше тем сильнее вода будет отталкиваться от объекта. При этом можно через Obstacles Distance регулировать увлечение дистанции при которой произойдет отталкивание а, настройка Treshold позволит настроить как много объема жидкости может быть в ячейки.

На скрине слева гидрофобия включена, справа выключена.

55f103c25b88bf1fdf89c6297fd489ac.png

Deffusion — Включение в симуляцию жидкости еще двух параметров: вязкости и поверхностного натяжения. Благодаря этим параметрам мы и будет делать из воды грязь. Причем вязкость в Блендере задается через два параметра Базу/Base и Экспоненту. При чем в Блендере подразумевается кинематическая вязкость т.е. отношение вязкости динамической к плотности жидкости. Вот таблица соотношений:

Жидкость

Динамическая вязкость cP

Кинематическая вязкость м2

Вода (20 °C)

1.002×100 (1.002)

1.002×10–6 (0.000001002)

Масло

5.0×102 (500)

5.0×10–5 (0.00005)

Мед (20 °C)

1.0×104 (10,000)

2.0×10–3 (0.002)

Сироп шоколадный (такой чтоб попа слиплась)

3.0×104 (30,000)

3.0×10–3 (0.003)

Кетчуп

1.0×105 (100,000)

1.0×10–1 (0.1)

Расплавленное стекло

1.0×1015

1.0×100 (1.0)

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

Я в детстве пару раз сидел в грязи и могу утверждать экспертным мнением , что грязь ближе всего к сиропу — то есть база 3, а экспонента 3. Ну или еще более вязкая.

dcbc7481971d1fa00e082ccf3ff9ab4d.png

На скрине слева жидкость с большей вязкостью, справа с меньшей

9b375a3a0fb70c3623a73f8e6a513cae.png

Surface Tension -Поверхностное натяжение увеличивает гидрофобные свойства объектов колизии.

И вот вы наконец запекаете анимацию и ведите, что наша грязь все еще ближе к воде чем к густому сиропу, а добавлять базы к вязкости уже нельзя, тогда на помощь нам придет солвер (обработчик) высоковязкой жидкости- High Viscosity Solver (HVS). Его единственный параметр сила действия и чем она больше тем больше вязкости. У этого солвера есть как плюсы так и существенные недостатки. О минусах и как их обойти позже. Для грязи я выбрал значение силы 0.2 Важно понимать что при включение данного солвера часть настроек жидкости рассмотренных ранее будет автоматически негласно скорректирована Бледнером.

На скрине справо без HVS, справо с HVS

defb98b8eaa01e6fb37f234da1782dda.png

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

Mesh — указывает о необходимости формирования полигональной сетки рендеринга. Собственно это уже этап визуализации жидкости.

Вторая часть на подходе — там мы рассмотрим оставшиеся параметры и начнем создавать сцену.

© Habrahabr.ru