CFX cимуляция одежды, волос, твёрдых и мягких тел


CFX Введение

Роль и функционал отдела CFX

___________________________________________________________________________________________________________________________________________

Отдел CFX — это команда, которая отвечает за всё, что связано с движущейся динамикой персонажей и их окружения. Если коротко,  зона ответственности отдела — это одежда, волосы, ремни, сумки и всё то, что должно правдоподобно двигаться, колыхаться или деформироваться вместе с персонажем.

Отдел CFX работает на стыке нескольких направлений: анимации, технического пайплайна и VFX. Главная задача — сделать так, чтобы персонажи выглядели живо и органично в кадре.

В зону ответственности отдела CFX на проекте входит:
— Симуляция одежды (от плащей и юбок до шарфов и мелких аксессуаров)
— Симуляция волос 
— Симуляция мягких тел (жир, кожа, мускулатура)
— Симуляция твёрдых тел (например, тяжелые элементы костюмов или броня)

___________________________________________________________________________________________________________________________________________

CFX Зоны ответственности

Зоны ответственности

___________________________________________________________________________________________________________________________________________

Отдел CFX отвечает за все задачи, связанные с динамическими элементами на персонажах и их окружении. Работа строится по следующим направлениям:

Симуляция одежды

Сюда входит работа с плащами, юбками, рубашками, шарфами и любыми другими тканевыми элементами костюмов. Симуляция проводится с учётом одобренной анимации и особенностей материала.

Симуляция волос

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

Симуляция мягких тел

Работа с мягкими тканями тела персонажей — кожа, мышцы, жир, отдельные части лица или тела, которые требуют дополнительной деформации через симуляцию.

Симуляция твёрдых тел

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

Финальный кеш и передача данных

Ответственность отдела — подготовка симуляции к публикации и передаче в рендеринг. Это включает экспорт кешей, проверку соответствия стандартам пайплайна и публикацию в Ftrack.

___________________________________________________________________________________________________________________________________________

CFX Программное обеспечение

Используемое программное обеспечение

___________________________________________________________________________________________________________________________________________

• Maya 2023.3

• Houdini 20.0.751

• Ziva 2.1.0

• Qualoth

• Python/MEL

___________________________________________________________________________________________________________________________________________

Maya 2023.3

Основной инструмент для работы отдела. Через Maya собираются рабочие сцены, настраивается симуляция одежды, волос и других динамических элементов.
Используются стандартные инструменты Maya (nCloth, nHair) и дополнительные плагины. Для ускорения процессов применяются кастомные Python и MEL скрипты.

Houdini 20.0.751

Применяется для специализированных задач, где требуются процедурные-симуляции или нестандартные эффекты, которые сложно или нецелесообразно реализовать в Maya. Чаще всего используется для сложных FX, например, разрушений, сложных ассетов, или процедурной динамики.

Ziva Dynamics 2.1.0

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

Qualoth

Плагин для симуляции одежды. Основной инструмент для задач, где требуется быстрый и стабильный результат, например для плащей и длинных элементов одежды. 

CFX Пайплайн работы отдела

Получение и сборка динамических сцен

___________________________________________________________________________________________________________________________________________

___________________________________________________________________________________________________________________________________________

Настройка  сцены симуляции
___________________________________________________________

На этом этапе добавляются нужные компоненты: 
  1. - Создание преролла
  2. - Мердж преролла с существующим кешем анимации 
  3. - Подключение референса динамического рига в сцену 
  4. - Подключение динамического рига к кешу персонажа

___________________________________________________________________________________________________________________________________________

Симуляция и принятие работы

___________________________________________________________________________________________________________________________________________

___________________________________________________________________________________________________________________________________________

 

CFX Взаимодействие с другими отделами

__________________________________________________________________________________________________________________________________________

Работа отдела CFX тесно связана с несколькими ключевыми департаментами. Для стабильного пайплайна важно соблюдение общих стандартов и своевременная коммуникация.

___________________________________________________________________________________________________________________________________________

Перечень отделов с высокой вероятностью взаимодействий 

___________________________________________________________________________________________________________________________________________

Анимационный отдел

Риг отдел

Моделинг отдел

Чекинг отдел 

VFX (по необходимости)

CFX Технические требования и ограничения

___________________________________________________________________________________________________________________________________________

Требования к геометрии

Требования к анимации

___________________________________________________________________________________________________________________________________________

CFX Работа с сценой симуляции-динамики

________________________________________
Пошаговый урок: Подготовка сцены и симуляция CFX
________________________________________

Шаг 1. Открываем задачу через Ftrack

Открываем Ftrack и переходим в нужный шот.

Нажимаем кнопку Open — сцена откроется в Maya.

Untitled-1.png

Шаг 2. Проверяем сборку сцены

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

Если один или несколько персонажей отсутствуют, используем скрипт:

from inhouse.usd.assets.asset_factory import AssetFactory
from inhouse.usd.changes import UsdChanges
from pxr import Usd
from pxr import Sdf, Usd
from inhouse.usd.tools.maya_utils import getSceneStage
from inhouse.ftrack.publishing import publish_asset
import time
from pxr import Ar

def iter_root_prims(stage, rigged = True):
    for prim in stage.TraverseAll():
           vset = prim.GetVariantSet('representation')
           if not vset.IsValid():
               continue
           if rigged:
               vname = vset.GetVariantSelection()
               if vname != 'rig':
                   continue
           yield prim


af = AssetFactory()

context = af._app.context
asset = context.asset
alink = af.getAssetLink(asset)
lo_link = alink.link('Layout Layer')
changes = UsdChanges(asset)
changes.load()

project_path = Ar.GetResolver().Resolve(lo_link) 
changes.checkIn(lo_link)
changes.apply(update=False)

local_path = changes.path(lo_link)

lo_stage = Usd.Stage.Open(local_path)

layer = lo_stage.GetEditTarget()

for rp in iter_root_prims(lo_stage, rigged=False):
    prim_path = str(rp.GetPath())
    prim_spec = layer.GetPrimSpecForScenePath(prim_path)
    if prim_spec is None:
        continue
    prim_spec.variantSelections.clear()
    if len(prim_spec.variantSets)>0:
        variants = prim_spec.variantSets[0].variants
        if 'rig' in variants:
            prim_spec.variantSets[0].RemoveVariant(variants['rig'])
            lo_stage.RemovePrim(prim_path+'/rig')
            print(prim_spec.GetAsText())
print(lo_stage.GetRootLayer().ExportToString())
lo_stage.Save()
product = alink.getProductByLink('Layout Layer')
print(product['name'])
asst_name = product['name']
version_id = publish_asset( asset['id'], asset_name=asst_name,
                                asset_type='bsc',
                                components=[
                                   dict(name='usd', path=local_path)
                                ],
                                version_id=None
                               )

changes.checkOut(lo_link)
changes.apply(update=False)
counter = 0
while Ar.GetResolver().Resolve(lo_link) == project_path:
    time.sleep(3)
    counter+=1
    if counter>10:
        break
scene_stage = getSceneStage()
scene_stage.Reload()


Шаг 3. Подготовка сцены к симуляции

  1. Открываем инструмент DSA (Dynamic Scene Assembling).
    • Находится в верхнем меню Maya, раздел Animation.

Untitled-2.png


Untitled-3.png

Шаг 4. Выбор персонажа и динамического рига

  1. В интерфейсе DSA выбираем нужного персонажа для симуляции.
  2. Определяем состояние персонажа (Dinocostume, bag, Dirty)
  3. Подбираем динамический риг, соответствующий этому состоянию.

Untitled-5.png

Шаг 5. Создаем преролл

  1. Нажимаем кнопку preroll в интерфейсе DSA.Untitled-6.png
  2. Проверяем корректность преролла: анимация должна иметь плавный заход, без резких движений в начале.
  3. Если нужно, редактируем параметры преролла (добавляем или убираем кадры, меняем ключи анимации).
  4. Если всё корректно, нажимаем Cache.

    image.png



Шаг 6. Подгрузка динамического рига и подключение

  1. Нажимаем кнопку Reference — нужный динамический риг подгрузится в сцену.Untitled-7.png
  2. Проверяем, чтобы риг подгрузился корректно.
  3. Нажимаем кнопку Connect для привязки рига к сцене и анимации.

image.png


Шаг 7. Тестовый просчет симуляции

  1. Настраиваем базовые параметры симуляции (по необходимости).
  2. Запускаем тестовый (lowres) просчет, чтобы проверить поведение симуляции в целом.
  3. Смотрим на результат — оцениваем работу динамики перед финальным просчетом.

Шаг 8. Выбор просчитываемой шейпы

  1. Выбираем в outliner требуемые шейпы одеждыimage.png
  2. Включаем отображение в display layers 

    image.png


  1. Нажимаем на Create nCache Untitled-8.png
  2. После просчета снимаем плейбласт, смотрим на результат симуляцииUntitled-9.png
  3. После просчета всех динамических элементов, включаем группу output в display layer, все остальные отключаем

    image.png

  4.  

    Снимаем плейбласт с финальной аутпутной группой Untitled-9.png
  5. Если все хорошо, паблишим вариант
  6.   Untitled-10.png
  7.  

  8. В Ftrack ставим статус pending review, и ждем фитбека по задаче
  9. После паблиша проверяем   кеш в usdview
  10. Untitled-12.png
  11. image.png

CFX Настройки nCloth

ЗНАЧЕНИЕ НАСТРОЕК CLOTH

___________________________________________________________________________________________________________________________________________

Настройки nCloth (Maya)

Stretch Resistance

Что это: сопротивление растяжению ткани. Чем выше значение, тем меньше ткань тянется.
По-человечески: отвечает за то, насколько легко ткань «тянется» при движении персонажа. Если сделать слишком низким — ткань будет как резинка.

stretchResistance.gif

Compression Resistance

Что это: сопротивление сжатию ткани. Чем выше, тем сильнее ткань сопротивляется тому, чтобы стать «мятой».
По-человечески: защищает от того, чтобы ткань не слипалась или не «скукоживалась» слишком легко.compressionResistance.gif

Bend Resistance

Что это: сопротивление сгибанию ткани. Большие значения сделают ткань жестче при попытках согнуть.
По-человечески: регулирует мягкость ткани — как легко она ложится складками.

bendResistance.gif

Shear Resistance

Что это: сопротивление сдвигу слоёв ткани друг относительно друга (как врезание ткани под углом).
По-человечески: влияет на стабильность формы ткани при сложных деформациях, например при скручивании.shearResistance.gif

Input Mesh Attract

Что это: сила, с которой симуляция пытается тянуть nCloth к исходной (анимированной) геометрии.
По-человечески: «липкость» к ригу — чем выше значение, тем ближе ткань будет пытаться оставаться к анимации без сильного отрыва.

inputMeshAttract.gif

Damp

Что это: глобальное затухание движений ткани (демпфирование).
По-человечески: уменьшает «дребезг» ткани и помогает быстрее остановить колебания.

damp.gif

Lift

Что это: параметр, определяющий подъём ткани при обтекании воздухом.
По-человечески: ткань как бы парусит — влияет на то, насколько легко она будет «надуваться» и подниматься в воздух.

lift.gif

Drag

Что это: сопротивление ткани воздуху (аналог аэродинамического сопротивления).
По-человечески: отвечает за то, как быстро ткань будет останавливаться в воздухе. Большое значение — будет тормозить даже при лёгких движениях.


Настройки nucleus

Substeps

Что это: количество внутренних шагов симуляции на каждый кадр.
По-человечески: чем выше значение, тем стабильнее симуляция и меньше артефактов, но дольше просчёт. Нужно повышать при быстрой или сложной анимации.

Max Collision Iterations

Что это: сколько раз ядро будет пересчитывать коллизии на одном кадре.
По-человечески: влияет на качество расчёта столкновений. Больше итераций — меньше шансов, что ткань «провалится» сквозь объект.

Gravity

Что это: сила гравитации в симуляции. По умолчанию стоит -9.8 (в метрах, как в реальной жизни).
По-человечески: насколько сильно ткань будет падать вниз.

Space Scale

Что это: масштаб симуляции. Должен совпадать с реальными размерами сцены.
По-человечески: если сцена в сантиметрах — оставляем значение по умолчанию (1.0), если в метрах — ставим меньше, например 0.01.

Time Scale

Что это: общая скорость симуляции.
По-человечески: можно замедлить или ускорить поведение ткани — влияет на динамику всей симуляции.

Wind Speed

Что это: глобальная сила ветра.
По-человечески: добавляет постоянный ветер во всей сцене.

Air Density

Что это: плотность воздуха, влияет на drag и lift.
По-человечески: чем выше значение, тем сильнее воздух будет влиять на ткань.

Динамика на волосы и одежду

Основные этапы работы динамики

1.       Выгонка USD кешей персонажей с Т-позой и камеры из анимационной сцены c межкадрами

2.       Загрузка кешей в сцену с динамическим билдом персонажа

3.       Просчет динамики одежды и волос. Отдельно считается каждая группа в том порядке что и в аутлайнере (кэши на шейпы в одной группе записываются вместе)

image.png

4.       Необходима выгрузка кеша в отдельный от анимации слой, для понимания того на какой стадии возникают проблемы (на анимации или на динамике)

Необходимые функции для работы отдела динамики

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

Кнопки:

·         Create cache (создающая папку под кеш динамического просчета)

·         Delete cache (удаляющая этот кеш)

·         Кнопка экспорта USD (выгружающая кеш из папки OUTPUT_GRP в слой выше анимационного)

image.png

·         Кнопки деформеров (blandshape, cluster, rivet, delta mush, texture deformer)

Соблюдение нейминга при экспорте кеша (E01_SQ010_SH010_Cloth_Phil_Cache)

Нейминг деформеров (с чего кидается на что кидается (pants_PRX_blandshape_pants_geo)

Необходима возможность паблиша и загрузки в сцену с кешом билдов персонажей

CFX Пошаговые инструкции

CFX Пошаговые инструкции

Инструкция 1.

Использование mute на nucleus

___________________________________________________________________________________________________________________________________________

1. Выделяем два параллельных эйджа

Это два эйджа (edges) на геометрии, которые будут использоваться как база для rivet-а.
Они должны быть соседними и лежать на одном участке поверхности (например, рядом на коже, ткани, волосах).

📸 Скриншот:
Снимок экрана 2025-03-27 144208.png

2. Используем следующий скрипт для  rivet

📸 Скриншот:

Untitled-1.png

3. Переименовываем rivet в Translater

Чтобы в будущем использовать его как драйвер трансформа, нужно дать понятное имя:
rivet1Translater (или rivet_translate_ctrl, rivet_driver, и т.п.)

📸 Скриншот:
Untitled-2.png

4. Выделяем Translater_rivet и объект

Cначала выбираем rivet ,к которому  должен привязаться объект.
А потом геометрию или объект который мы хотим перемещать.

 

📸 Скриншот:
Untitled-3.png

         

5. Выбираем Constraint → Parent

Rigging меню → ConstraintParent Constraint

🔹 Открываем окно опций:
Rigging > Constraint > Parent (с коробочкой справа от названия)

📸 Скриншот:
Untitled-4.png

Очень важно!
Снимаем ✓ Maintain Offset, чтобы объект точно следовал движению Translater, а не сохранял своё смещённое положение.

Жмём apply

6. Запускаем симуляцию

Всё готово! Теперь Translater (rivet) двигается вместе с поверхностью, а привязанный объект точно следует за ним — можно запускать симуляцию.

 

CFX Пошаговые инструкции

Инструкция 2.

Использование деформеров

___________________________________________________________________________________

___________________________________________________________________________________________________________________________________________

CLUSTER image.png

___________________________________________________________________________________________________________________________________________

Cluster — это деформер, который позволяет управлять выбранными вертексами и объектами (или CV) объекта через трансформ-ноду, как будто это контроллер.
Очень удобно, если нужно:

1. Выделяем нужные точки на geo

В режиме Vertex (F9 или ПКМ → Vertex), выдели одну или несколько вершин на геометрии, за которые ты хочешь тянуть или крепить объект.

image.png

2. Создаём Cluster

Untitled-4.png

image.png

3.Теперь можно активировать pivot cluster, нажав W и сдвинуть точки 

image.png

4.Ставим ключ на деформер

Т.к мы работаем из рестовой позиции персонажа, мы должны любые деформеры выключать в -30 кадре, что бы сохранить корректный силует одежды. 

Поэтому мы идем в -30 кадр и выключаем наш cluster и ставим ключ

Правая кнопка мыши key selected

image.png

image.png

Далее в -10 кадре включаем cluster в 1 

___________________________________________________________________________________________________________________________________________

DELTA MUSH image.png

___________________________________________________________________________________________________________________________________________

Delta Mush — это деформер, который плавно разглаживает деформации, сохраняя при этом форму оригинального меша.
Он отлично помогает, когда:

1. Выдели геометрию, к которой хочешь применить сглаживание

Это может быть:

2. Назначь на геометрию DeltaMush

Untitled-5.png

2.1 Настроим параметры:
Параметр Что делает
Smoothing Iterations Кол-во сглаживающих проходов (рекомендуется 10–30)
Smoothing Step Насколько сильно сглаживать (0.5–1.0 — норм)
Pin Border Vertices Закрепить граничные точки, чтобы они не сползали
Envelope Масштаб влияния (как у всех деформеров)

3.Красим вес DeltaMush

___________________________________________________________________________________________________________________________________________

BLANDSHAPE image.png

___________________________________________________________________________________________________________________________________________Blandshape — это деформер в Maya, который позволяет плавно смешивать форму одного меша в другой.
Работает на основе индексов вершин, то есть:
«вот исходный меш, вот целевая форма — двигай вертексы от A к B».

Шаг 1: Подготовка объектов

  1. Выбери объект, который этот объект станет источником Blend Shape (Source Object).

  2. Выбери объект на который назначаешь blandshape. Этот будет служить целью деформации (Target Object).1.png

Шаг 2: Создание Blend Shape

  1. В меню выберите:

    • Deform → Blend Shape ☐ (с опциями).

  2. В открывшемся окне настроек Blend Shape:

    • Убедитесь, что отмечены опции "World" и "Check Topology".

    • Нажмите кнопку Create.2.png

Шаг 3: Проверка созданного Blend Shape

  1. Выделите Target Object.

  2. Откройте панель атрибутов (Attribute Editor).

  3. Найдите вкладку blendShape, убедитесь, что Blend Shape создан и отображается корректно.3.png

Шаг 4: Подготовка к покраске весов (Weight Painting)

  1. Кликните правой кнопкой мыши на Target Object.

  2. В контекстном меню выберите пункт:

    • Paint → BlendShape → (название созданного blendShape) → baseWeights4.png

Шаг 5: Покраска весов

  1. Используя кисть, окрасьте необходимые области модели, регулируя степень влияния BlendShape на выбранные участки.5.png

 

CFX Пошаговые инструкции

Инструкция 3

Создание и покраска BLANDSHAPE
_________________________________________________

Шаг 1: Подготовка объектов

  1. Выбери объект, который этот объект станет источником Blend Shape (Source Object).

  2. Выбери объект на который назначаешь blandshape. Этот будет служить целью деформации (Target Object).1.png

Шаг 2: Создание Blend Shape

  1. В меню выберите:

    • Deform → Blend Shape ☐ (с опциями).

  2. В открывшемся окне настроек Blend Shape:

    • Убедитесь, что отмечены опции "World" и "Check Topology".

    • Нажмите кнопку Create.2.png

Шаг 3: Проверка созданного Blend Shape

  1. Выделите Target Object.

  2. Откройте панель атрибутов (Attribute Editor).

  3. Найдите вкладку blendShape, убедитесь, что Blend Shape создан и отображается корректно.3.png

Шаг 4: Подготовка к покраске весов (Weight Painting)

  1. Кликните правой кнопкой мыши на Target Object.

  2. В контекстном меню выберите пункт:

    • Paint → BlendShape → (название созданного blendShape) → baseWeights4.png

Шаг 5: Покраска весов

  1. Используя кисть, окрасьте необходимые области модели, регулируя степень влияния BlendShape на выбранные участки.5.png