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

________________________________________
Пошаговый урок: Подготовка сцены и симуляция CFX
________________________________________
Шаг 1. Открываем задачу через Ftrack
Открываем Ftrack и переходим в нужный шот.
Нажимаем кнопку Open — сцена откроется в Maya.
Шаг 2. Проверяем сборку сцены
Переключаемся на камеру шота (shot camera).
Проверяем наличие и корректность (они у нас должны быть в кеше) всех персонажей и окружения.
Если один или несколько персонажей отсутствуют, используем скрипт:
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. Подготовка сцены к симуляции
Открываем инструмент DSA (Dynamic Scene Assembling).
Находится в верхнем меню Maya, раздел Animation.
Шаг 4. Выбор персонажа и динамического рига
В интерфейсе DSA выбираем нужного персонажа для симуляции.
Определяем состояние персонажа (Dinocostume, bag, Dirty)
Подбираем динамический риг, соответствующий этому состоянию.
Шаг 5. Создаем преролл
Нажимаем кнопку preroll в интерфейсе DSA.
Проверяем корректность преролла: анимация должна иметь плавный заход, без резких движений в начале.
Если нужно, редактируем параметры преролла (добавляем или убираем кадры, меняем ключи анимации).
Если всё корректно, нажимаем Cache.
Шаг 6. Подгрузка динамического рига и подключение
Нажимаем кнопку Reference — нужный динамический риг подгрузится в сцену.
Проверяем, чтобы риг подгрузился корректно.
Нажимаем кнопку Connect для привязки рига к сцене и анимации.
Шаг 7. Тестовый просчет симуляции
Настраиваем базовые параметры симуляции (по необходимости).
Запускаем тестовый (lowres) просчет, чтобы проверить поведение симуляции в целом.
Смотрим на результат — оцениваем работу динамики перед финальным просчетом.
Шаг 8. Выбор просчитываемой шейпы
Выбираем в outliner требуемые шейпы одежды
Включаем отображение в display layers 
Нажимаем на Create nCache 
После просчета снимаем плейбласт, смотрим на результат симуляции
После просчета всех динамических элементов, включаем группу output в display layer, все остальные отключаем
 
Снимаем плейбласт с финальной аутпутной группой 
Если все хорошо, паблишим вариант
  
 
В Ftrack ставим статус pending review, и ждем фитбека по задаче
После паблиша проверяем   кеш в usdview