Перейти к основному контенту

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