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

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

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

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

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

[![Untitled-1.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/uEHpoRg5gZiM7acc-untitled-1.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/uEHpoRg5gZiM7acc-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](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/LsLu5V0cHGW98Ufo-untitled-2.png)

[![Untitled-3.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/zMxrPIQvwElZM8O7-untitled-3.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/zMxrPIQvwElZM8O7-untitled-3.png)

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

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

*[![Untitled-5.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/RmuREy7fuK1JsmUT-untitled-5.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/RmuREy7fuK1JsmUT-untitled-5.png)*

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

1. Нажимаем кнопку **preroll** в интерфейсе DSA.[![Untitled-6.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/Hg1oxWA9j29X6lwx-untitled-6.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/Hg1oxWA9j29X6lwx-untitled-6.png)
2. Проверяем корректность преролла: анимация должна иметь плавный заход, без резких движений в начале.
3. Если нужно, редактируем параметры преролла (добавляем или убираем кадры, меняем ключи анимации).
4. Если всё корректно, нажимаем **Cache**.  
    [![image.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/iA1lG6sfOCCZJ5B7-image.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/iA1lG6sfOCCZJ5B7-image.png)

---

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

1. Нажимаем кнопку **Reference** — нужный динамический риг подгрузится в сцену.[![Untitled-7.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/Z4Ooa6Sia56kCtLX-untitled-7.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/Z4Ooa6Sia56kCtLX-untitled-7.png)
2. Проверяем, чтобы риг подгрузился корректно.
3. Нажимаем кнопку **Connect** для привязки рига к сцене и анимации.

[![image.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/lN3VaY8yDzKz77xV-image.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/lN3VaY8yDzKz77xV-image.png)

---

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

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

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

1. Выбираем в outliner требуемые шейпы одежды[![image.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/AEz9td9ZsqtkZFmg-image.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/AEz9td9ZsqtkZFmg-image.png)
2. Включаем отображение в display layers [![image.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/adHtvOmkQ2G2K9vT-image.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/adHtvOmkQ2G2K9vT-image.png)

1. Нажимаем на Create nCache [![Untitled-8.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/Gdgrto8rSJ5YqHQr-untitled-8.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/Gdgrto8rSJ5YqHQr-untitled-8.png)
2. После просчета снимаем плейбласт, смотрим на результат симуляции[![Untitled-9.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/Q2dMYdrC6nGz7zkw-untitled-9.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/Q2dMYdrC6nGz7zkw-untitled-9.png)
3. После просчета всех динамических элементов, включаем группу output в display layer, все остальные отключаем [![image.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/2jfkKlvynDQb34Ys-image.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/2jfkKlvynDQb34Ys-image.png)
4. Снимаем плейбласт с финальной аутпутной группой [![Untitled-9.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/Q2dMYdrC6nGz7zkw-untitled-9.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/Q2dMYdrC6nGz7zkw-untitled-9.png)
5. Если все хорошо, паблишим вариант
6. [![Untitled-10.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/dsDQdfoRLR0B87nf-untitled-10.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/dsDQdfoRLR0B87nf-untitled-10.png)
7. 
8. В Ftrack ставим статус pending review, и ждем фитбека по задаче
9. После паблиша проверяем кеш в usdview
10. [![Untitled-12.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/bwFgtJDhnnRkw6t6-untitled-12.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/bwFgtJDhnnRkw6t6-untitled-12.png)
11. [![image.png](https://bookstack.yarko.com/uploads/images/gallery/2025-03/scaled-1680-/hihW1Po9xZvUpaHO-image.png)](https://bookstack.yarko.com/uploads/images/gallery/2025-03/hihW1Po9xZvUpaHO-image.png)