
В Houdini существует набор Pyro-инструментов, позволяющих создавать реалистичные эффекты дыма, огня и различных взрывов. Основной объем материи создается при помощи векторного поля, обладающего значениями скорости перемещения масс, плотности и температуры. Помимо этого, можно управлять параметрами расширения/сжатия газа, внутреннего давления и коллизий.

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

Так, Pyro Solver был применен при первых тестах эффекта. Однако полученный результат оказался не удовлетворительным. Подобный огонь выглядит излишне реалистично, а также представляет собой единую массу, не разделенную на всполохи.
Оптимальным решением для создания стилизованного эффекта является сочетание нескольких различных технологий. Так, рассматриваемый далее пайплайн включает процедурную генерацию геометрии, служащей основой для «всполохов» пламени, и настройку vellum-симуляции, имитирующей динамику огня.
I. Подготовка к созданию эффекта
Для работы над эффектом была создана упрощенная трехмерная модель персонажа, повторяющая основные пропорции и формы, изображенные на концепт-артах. Одной из важных характеристик геометрии является плотность сетки, так как от нее зависит количество и расположение направляющих для груминга.
Так как геометрия персонажа будет в дальнейшем заменена, для этой модели был создан упрощенный риг с автоматическим распределением весов. Так же было добавлено несколько готовых анимаций из библиотеки Mixamo, позволяющих определить корректность работы эффекта при движении и перемещении в пространстве персонажа.

Для начала работы создадим новую Geometry-ноду в Houdini. В ней будет храниться геометрия персонажа. Внутри geo-контейнера добавим ноду «FBX Character Import». В строке «FBX File» укажем путь к статичной геометрии, а в «Animation FBX File» — путь к аналогичной 3д-модели с ранее созданной анимацией.
Для работы с грумингом персонажа потребуется статичная версия геометрии в Т-позе. Для этого добавим null к первому выходу ноды «FBX Character Import», переименуем его в «GEO_rest» (использование заглавных букв в названии поможет быстрее находить необходимую геометрию).
Импорт геометрии персонажа в SOP-контексте
Помимо статичной позы для дальнейшей работы также потребуется VDB-геометрия (не имеющая полых областей внутри), необходимая для отработки коллизий. После null’а добавим ноду «VDB From Polygons». Чем меньше будет значение параметра Voxel size, тем детальнее будет производится просчет симуляции.

Для того чтобы персонаж начал двигаться, необходимо добавить ноду «Bone Deform».
Для удобства работы можно зациклить имеющуюся анимацию. Для этого добавим ноду Extract Locomotion, которая помогает извлечь информацию о перемещении и ориентации в пространстве персонажа. В качестве Locomotion Joint необходимо выбрать одну из ключевых групп костей, например Hips. Затем при помощи ноды MotionClip просчитаем положение скелета для каждого кадра анимации. Используя MotionClip Cycle, сделаем движение персонажа непрерывным. В строке Cycles After необходимо указать номер кадра, начиная с которого анимация будет повторяться. Для плавности перехода во вкладке Blend необходимо выбрать метод Overlap Sequences, а в качестве параметра Blend Frames указать количество кадров, в течение которых будет происходить наложение двух циклов.
II. Подготовка основы для эффекта
Инструмент Groom в Houdini позволяет создавать направляющие, служащие основой для генерации волос и шерсти. Информация о форме, ориентации и положение направляющих в пространстве используется для упорядочивания внешнего вида прически или меха.
Так как всполохи огня необходимо расположить на голове персонажа, подобно волосам, создание направляющих через Guide Groom станет оптимальным решением для формирования основы эффекта. Однако, в отличие от стандартного процесса груминга, направляющие будут использоваться не для генерации волос, а лишь в качестве источника информации о расположении и деформации геометрии лент всполохов.
Для формирования основного объема прически создадим направляющие. Для этого в новой geo-ноде «groom_source» экспортируем геометрию персонажа через Object Merge, указав путь к статичной модели.
Настройка груминга на obj-уровне
Через Attribute Paint нарисуем маску, выделив часть геометрии, на которой должны располагаться всполохи пламени. Красным цветом обозначается активная зона, где будут генерироваться направляющие, а фиолетовым — область с нулевым влиянием.
Создав Guide Groom, во вкладке Guide Creation необходимо для параметра Density указать Skin Attribute и выбрать созданную ранее маску. Таким образом направляющие будут созданы только в выделенной области геометрии персонажа.
Настройка длины и формы направляющих внутри Guide Groom
Так как всполохи пламени у линии роста волос должны быть короче, чем на макушке, необходимо создать дополнительную маску «mask_length», которая позволит управлять параметром длины лент огня.

Добавим Guide Process, выбрав тип операции Set Length. В качестве параметра, определяющего длину направляющих, добавим Skin Attribute и укажем созданную маску «mask_length».
Для того чтобы геометрия всполохов огня была направлена вверх, создадим через Guide Process параметр Set Direction. В качестве Lift Amount Attribute так же укажем маску, для того чтобы в зоне линии роста волос направляющие чуть меньше прилегали к голове.
Так как колебание всполохов огня должно быть более интенсивным на концах, при помощи операции Frizz можно сделать основание всполохов менее подвижным. Для этого в качестве Frequency Attrib необходимо использовать маску curvemask.

Для того чтобы будущая геометрия всполохов огня корректно деформировалась при движении персонажа, необходимо создать симуляцию направляющих. Для этого после Guide Groom добавим Guide Deform. Помимо этого, создадим новый geo-контейнер, содержащий информацию об анимации геометрии, назовем его «groom_anim». Через Object Merge укажем путь к трехмерной модели персонажа с анимацией. Подсоединим «groom_anim» ко второму входу Guide Deform.
Для симуляции направляющих добавим ноду Guide Simulate. В качестве источника информации о деформации гайдов создадим новую geo-ноду, назовем ее «guide_sim».
Внутри ноды применим к направляющим vellum-симуляцию. Для этого добавим Vellum Constraints и Vellum Solver.
II. Настройка формы «всполохов» огня

Для формирования геометрии вдоль полученных направляющих создадим ноду Hair Generate.
Добавим цикл For-Each Connected Piece, позволяющий сформировать геометрию вдоль каждой направляющей грума. На входе получим единичную кривую. Создадим ноду Resample, для того чтобы задать атрибут curveu.

Настроим параметр offset_spline, определив отклонение кончиков лент. Для корректной работы условия добавим ноду Polyframe, для того чтобы создать атрибуты N и up, необходимые для просчета вектора нормали. После в Attribute Wrangle укажем выражение:
vector n = normalize (cross (v@N, v@up)); v@P -= n * chf ('offset') * chramp ('mask', f@curveu);
После создания параметра необходимо удалить созданные ранее атрибуты N и up через Attribute Delete.
Придать направляющим форму лент можно через ноду Sweep, указав в Surface Shape тип геометрии «Ribbon». Через параметр Width можно управлять шириной лент. А во вкладке Scale, активировав Apply Scale Along Curve, при помощи рампы можно задать необходимую форму.
Так как всполохи, находящиеся на висках, должны быть меньше, через Attribute Wrangle можно задать дополнительный параметр, который позволит управлять их размером. Используем ранее созданную маску «mask_length»:
@pscale = chf («scale») * chramp («scale_mask», f@mask_length);
Для того чтобы использовать значения маски, необходимо перенести атрибут с геометрии (вход Skin), используя Attribute Transfer.


Для того чтобы сделать ленты выпуклыми в центре, используем ранее созданную маску «mask»:
v@P += v@N * chf ('offset') * f@mask * chramp ('mask', f@curveu);
Через PolyExtrude можно задать толщину лепесткам, что может добиться коллизии между всполохами во время настройки симуляции.

Основная геометрия всполоха готова, осталось скорректировать uv-развертку, добавив выражение:
v@uv = set (f@uu, f@curvev * chf ('uv'), 0);
III. Настройка симуляции движения
Для анимации полученной геометрии всполохов можно использовать Vellum Solver. Этот инструмент позволяет создавать различные виды симуляций.
Для создания эффекта пламени будет использоваться несколько видов vellum-симуляции: имитация ткани (Cloth), позволяющая управлять пластичностью геометрии всполохов, и симуляция волос (Hair), необходимая для управления общим объемом направляющих.

Внутри цикла необходимо создать группу точек, которые будут оставаться неподвижными относительно головы персонажа при симуляции
Группа точек «pin_points»
Добавим атрибуты, необходимые для vellum-симуляции. Через ноду Attribute Wrangle для ранее созданной группы точек «pin_points» напишем следующее выражение:
i@disableexternal = 1; i@disableself = 1;

Для того чтобы всполохи пламени не распадались при симуляции, а образовывали единую форму, добавим еще один параметр — set_stretchstiffness. Для этого через Attribute Wrangle напишем выражение, которое позволит управлять параметром через рампу:
f@stretchstiffness = chramp ('mask', f@curveu);

Для того чтобы всполохи огня сохраняли форму при интенсивном движении персонажа, добавим Blend Shapes. Эта нода позволит добиться плавного перехода от статичной геометрии к деформированной при резком перемещении персонажа.
Деформация до и после применения Blend Shapes
Добавим Vellum Constraints типа Cloth.
Добавим Vellum Constraints типа Pin to Target.
Настроим параметры vellum-солвера. Для более динамичного движения «язычков» пламени на концах, добавим симуляцию их движения, ограничив подвижную область. Для этого создадим ноду Vellum Rest Blend, используя атрибуты «stretch» и «bend», созданные через Cloth Vellum Constraints.
Добавим силу, действующую на геометрию всполохов, настроив параметры ноды POP Wind.

Для движения общей массы пламени создадим второй солвер. Значение гравитации по оси Y сделаем равным -5, это позволит передать движение огня в направлении снизу вверх. Добавим силу, действующую на геометрию в вертикальном направлении, через ноду POP Wind.