模型计算顺序的重新排列功能

最終更新: 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派生类的构造函数中设置任意数值。

请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。