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

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

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

Через Attribute Paint нарисуем маску, выделив часть геометрии, на которой должны располагаться всполохи пламени.
Зададим выделенной части геометрии цвет, для того чтобы ограничить область применения будущего эффекта. Поверхность, окрашенная в белый, будет удалена, а та часть геометрии, которая будет иметь черный цвет, и станет основной рабочей поверхностью. Создав ноду Color, необходимо выбрать Group Type: Primitives. В графе Attribute укажем ранее созданную маску «mask». В Attribute Ramp окрасим левый ползунок в белый цвет, а правый — в черный.
Через ноду Blast удалим ненужную часть геометрии, применив к точкам выражение «@Cd>0».

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

Внутри ноды применим к направляющим vellum-симуляцию.
Для создания геометрии вдоль полученных направляющих создадим ноду Hair Generate.

Так как всполохи пламени у линии роста волос должны быть короче, чем на макушке, необходимо создать дополнительную маску «mask_length».
Через ноду Hair Generate создадим направляющие.
Внутри ноды добавим Guide Process, выбрав тип операции Set Length. В качестве параметра, определяющего длину направляющих, добавим Skin Attribute и укажем созданную маску «mask_length».

Для того чтобы гайды были направлены вверх, создадим через Guide Process параметр Set Direction.
Основные этапы создания груминга
II. Настройка формы «всполохов» огня
Создадим цикл, позволяющий сформировать геометрию вдоль каждой направляющей грума. На входе получим единичную кривую. Создадим ноду Resample, для того чтобы задать атрибут curveu.

Внутри первого цикла создадим еще один, позволяющий настроить форму геометрии каждого всполоха пламени.
При помощи атрибута pscale определим длину лент, используя рампу, зависящую от маски.
Добавим ноду Polyframe, для того чтобы создать атрибуты N и up, необходимые для просчета вектора нормали.

Настроим параметр offset_spline, определив отклонение кончиков лент. Для этого в Attribute Wrangle укажем выражение:
vector n = normalize (cross (v@N, v@up)); v@P -= n * chf ('offset') * chramp ('mask', f@curveu) * chramp ('mask_length', f@mask_length);
В качестве основы будущих всполохов создадим кривую.

Используя атрибут curvev, добавим маску для управления шириной через рампу.
Copy to points, skin, reverse, normal


Для того чтобы сделать ленты выпуклыми в центре, используем ранее созданную маску «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), необходимая для управления общим объемом направляющих.

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

Для того чтобы всполохи пламени не распадались при симуляции, а образовывали единую форму, добавим еще один параметр — set_stretchstiffness. Для этого через Attribute Wrangle напишем выражение, которое позволит управлять параметром через рампу:
f@stretchstiffness = chramp ('mask', f@curveu);
Добавим Vellum Constraints типа Cloth.
Добавим Vellum Constraints типа Pin to Target.
Настроим параметры vellum-солвера. Для более динамичного движения «язычков» пламени на концах, добавим симуляцию их движения, ограничив подвижную область. Для этого создадим ноду Vellum Rest Blend, используя атрибуты «stretch» и «bend», созданные через Cloth Vellum Constraints.
Добавим силу, действующую на геометрию всполохов, настроив параметры ноды POP Wind.



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