
Частичное погружение
примеры из кинематографа

«Aquaman» 2018 | behind the scene
Волосы, находящиеся одновременно в подводных условиях и на поверхности — сложный с технической точки зрения процесс. Чаще всего подобные сцены выбирают реализовывать без использования CG-волос, останавливаясь на мокрой прическе актера.
Однако в случае, когда герой является full-CG персонажем, приходится обращаться к грумингу.

«Alita: Battle Angel» 2019 | VFX breakdown
Студия Wētā FX (ранее Weta Digital) на отработке фильма «Алита: Боевой Ангел» выбрала производить симуляцию волос и симуляцию воды отдельно друг от друга ради оптимизации процессов. Таким образом, динамика и анимация прядей лишь создают иллюзию взаимодействия с поверхностью воды. И происходит это с помощью переключения между двумя симуляциями: привычной гравитации на поверхности и «невесомости» под водой.


«The Jungle Book» 2016 | VFX breakdown
Частый случай full-CG персонажа, требующего генерацию волос — животные. Так, в фильмах «Книга Джунглей» и «Муфаса: Король Лев» звери в некоторых сценах оказываются в тесном контакте с водой. Здесь VFX-артисты обращались к методу маскирования геометрии — выделяли зоны намокания и применяли к ним другую динамику, шейдер и стилизацию.
«Mufasa: The Lion King» 2024 | VFX breakdown
Однако метод комплексной flip-симуляции с коллизией шерсти тоже может быть использован, как например студией Wētā FX в фильме «Планета обезьян: Новое царство». Подобный способ крайне ресурсоемкий и сложный, однако окупается невероятной реалистичностью симуляции: грум намокает лишь при взаимодействии с частицами воды и отрабатывает анимацию исходя из физически корректных настроек капель. Таким образом, в фильме можно увидеть множество близких ракурсов с частично-мокрой шерстью.


«Kingdom of the Planet of the Apes» 2024 | VFX breakdown
Техническая реализация
погружение и выход
Принцип симуляции
до того, пока волосы не окажутся в соприкосновении с поверхностью воды, они будут подвержены одним правилам, после — другим. Поэтому следует разделить путь на два разных Vellum-солвера. Первый работает по стандартным законам гравитации с силой тяжести равной -9.8 по оси Y, второй — с силой 0.8 и дополнительными условиями.
obj > geo «contact_group»
В прошлой главе была рассмотрена симуляция, реализуемая через ноду Guide Simulation. Это комплексная нода, собранная специально для работы с волосами на базовом уровне. Однако симуляция погружения в воду и выхода из нее имеет более сложную структуру и для работы с ней нужно переходить на SOP-контекст.
Таким образом, создавая на Obj-Network гайды волос, нужно связать их с нодой Guide Deform и из нее подать OUT_GROOM в Object Merge на новом SOP-контексте (geo нода с названием contact_group).
распаковка OUT_GROOM из Guide Deform и подача в Vellum Constrains (Hair)
Задаем каждому примитиву (index_prim) и каждой точке гайдов (index_pt) индексацию через Enumirate.
И подаем анимированные гайды и анимированную геометрию в ноду Vellum Constrains (Hair) для дальнейшей симуляции.
подключение surface к ray | vellum-солверы
Создаем поверхность воды с помощью обычного grid в нуле координат по оси-Y (будет использоваться под названием surface) и с помощью Poly Extrude из плоскости достраиваем куб, имитирующий пространство воды (water_box).


демонстрация Surface и Water Box
анимация головы
Vellum Solvers

Далее нужно разблокировать редактирование солвера для сухих волос и найти dopnetwork, в котором создать группу точек «wet» с ограничением по water_box (в разделе bounding с SOP-path).
А в солвере мокрых волос в dopnetwork подключить ноду noise в gravity.
— ГРУППА WET группа точек, образующаяся при контакте с water_box и позволяющая контролировать смену одних условий симуляции на другие.
— NOISE добавляет хаотичность влияния гравитации на каждый волосок (можно регулировать амплитуду движения).
dopnet | сухие волосы, popgroup c группой wet


vellum solver сухие волосы | vellum solver мокрые волосы
SOP-контекст
Ray — нода, позволяющая переложить одну геометрию на другую с указанием осей. Таким образом, в качестве объекта коллизии используем surface, а отражающейся геометрии — подводную симуляцию из солвера. Значение -1 по оси Y позволяет задать условие, что при пересечении нуля координат в отрицательную сторону объект перестает отражаться на геометрии коллизии.
Это позволит создать эффект «натяжения» волос по поверхности воды и поможет в плавном переходе от одной симуляции к другой.
Подключая ноду Blend Shapes (в первый вход — сухая симуляция, во второй — мокрая), задаем ее влияние по группе wet и добавляем через «+» новый атрибут влияния. 1 в значении позволяет создать плавный переход от одной геометрии к другой при активации группы wet.
демонстрация blend shapes
Помимо переключения с динамики сухих волос на подводные, нужно реализовать утяжеление влажных волос после контакта с водой. И так как группа wet сохраняется и после выхода грума из объема water_box (отображается красным цветом), ее можно использовать для внесения новых условий симуляции.
Создаем атрибут Cd по группе wet, меняем его тип на Vector и выставляем значение по всем осям на 1. И дальше этот векторный атрибут переводим в целые числа (int) на VOP-контексте, чтобы вернуть его в качестве группы parm.


перевод атрибута Cd (Vector -> Int) через attribvop | VOP-контекст

Далее снова подаем surface как геометрию коллизии для ноды ray, но в качестве ограничивающей группы выбираем parm.
Параметр Lift регулирует силу, с которой будут тянуться вниз гайды грума.
Финальным этапом данного сетапа является подключение получившихся симуляций к Vellum Attach Constraints — к ноде, задающей новые правила крепления и фиксации к родительской геометрии.
Перед этим нужно скопировать группы wet и parm на output 1 из Vellum Hair с помощью group copy.
— 1 вход — output 1 из Vellum Hair — 2 вход — output 2 из Vellum Hair — 3 вход — комплексная симуляция
финальная часть нодовой системы
В последнем Vellum-солвере задаем сильную гравитацию (Vellum Forces -> ось Y = -12) и на последний вход подаем output 3 из Vellum Hair.
Корректность финальной симуляции напрямую зависит от настроек структуры волос (в обоих vellum constraints нодах) — в зависимости от упругости и растяжения гайдов их взаимодействие с поверхностью «воды» будет меняться. Так же важно правильно выбрать расположение отражений в обоих нодах ray, чтобы смена симуляций происходила на нужном уровне.


настройки Vellum Constraints (hair) | настройки Vellum Constraints (attach)
финальная симуляция