模型计算顺序的重新排列功能
最終更新: 2026年4月2日
从Cubism 5.3 SDK for Native R5正式版及for Web R5正式版起,可以轻松变更模型的计算顺序。
主要修正内容是,之前在Sample中的LAppModel类的SetupModel()函数和Update()函数中进行的处理,已经逐类地转移到了Framework的Motion层次结构中。
Sample中LAppModel类中的SetupModel()函数会调用Framework/Motion中的各类,并且传统的处理是通过在Update()函数中批量调用更新处理来执行的。
处理顺序在Framework/Motion/ICubismUpdater类的CubismUpdateOrder中定义。
此外,关于通过Drag操作更新参数的功能,变更为在转移到Framework时,将输入值和对象参数变更为变量,并将名称从Drag变更为Look。
Cubism Framework内部处理
这是用于决定模型计算顺序的Framework的内部处理。
按照以下流程处理。
在模型原始化期间,创建与各功能(EyeBlink、Expression、Breath、Physics、LipSync、Pose、Look)对应的ICybismUpdater派生类的实例,并使用CubismUpdateScheduler::AddUpdatableList()进行注册。
注册完成后,调用CubismUpdateScheduler::SortUpdatableList()按执行顺序对列表进行排序。
void CubismUpdateScheduler::AddUpdatableList(ICubismUpdater* updatable)
{
_cubismUpdatableList.PushBack(updatable);
_needsSort = true;
}
void CubismUpdateScheduler::SortUpdatableList()
{
csmVectorSort::MergeSort(_cubismUpdatableList.Begin(), _cubismUpdatableList.End(), ICubismUpdater::SortFunction);
_needsSort = false;
}
当帧更新时,将调用CubismUpdateScheduler::OnLateUpdate()。调度器按注册的计算顺序升序排列注册的更新类,然后依次执行每个OnLateUpdate()并更新模型参数。
void CubismUpdateScheduler::OnLateUpdate(CubismModel* model, const csmFloat32 deltaTimeSeconds)
{
if (_needsSort)
{
SortUpdatableList();
}
for (csmUint32 i = 0; i < _cubismUpdatableList.GetSize(); ++i)
{
_cubismUpdatableList[i]->OnLateUpdate(model, deltaTimeSeconds);
}
}
计算顺序由CubismUpdateOrder枚举定义。数字越小,执行时间越早。
enum CubismUpdateOrder
{
CubismUpdateOrder_EyeBlink = 200,
CubismUpdateOrder_Expression = 300,
CubismUpdateOrder_Look = 400,
CubismUpdateOrder_Breath = 500,
CubismUpdateOrder_Physics = 600,
CubismUpdateOrder_LipSync = 700,
CubismUpdateOrder_Pose = 800,
CubismUpdateOrder_Max = INT_MAX
};
此外,您可以在ICybismUpdater派生类的构造函数中设置任意数值。