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. Выбор просчитываемой шейпы
- Нажимаем на Create nCache
- После просчета снимаем плейбласт, смотрим на результат симуляции
- После просчета всех динамических элементов, включаем группу output в display layer, все остальные отключаем
-
- Если все хорошо, паблишим вариант
-
-
- В Ftrack ставим статус pending review, и ждем фитбека по задаче
- После паблиша проверяем кеш в usdview
Нет комментариев