自动眨眼

最終更新: 2022年10月6日

识别用于眨眼的参数

您可以使用自动眨眼效果功能,将随机眨眼动作应用于模型。
执行以下处理以应用自动眨眼效果。

·与应用.model3.json文件中描述的自动眨眼效果值的参数相关联

· 设置眨眼时间间隔并调用更新处理。

其中,.model3.json文件中描述的自动眨眼效果和参数相关的信息可以通过实装ICubismModelSetting接口的CubismModelSettingJson类获取。

// C++
csmInt32 eyeBlinkCount = _modelSetting->GetEyeBlinkParameterCount();
for (csmInt32 i = 0; i < eyeBlinkCount; i++)
{
   CubismIdHandle eyeblinkParameter = _modelSetting->GetEyeBlinkParameterId(i);
}
// TypeScript
let eyeBlinkCount: number = _modelSetting.getEyeBlinkParameterCount();
for(let i: number = 0; i < eyeBlinkCount; i++)
{
    let eyeBlinkParameter: CubismIdHandle = _modelSetting.getEyeBlinkParameterId(i);
}
// Java
int eyeBlinkCount = _modelSetting.getEyeBlinkParameterCount();
for(int i = 0; i < eyeBlinkCount; i++) {
    CubismId eyeBlinkParameter = _modelSetting.getEyeBlinkParameterId(i);
}

请确认“眨眼设置”以将定义放入.model3.json文件中。
如果在Editor上设置了自动眨眼和口形同步并输出,则.model3.json文件将描述如下。

{
    ... 省略 ...
       "Groups": [
                {
                        "Target": "Parameter",
                        "Name": "LipSync",
                        "Ids": [
                                "ParamMouthOpenY"
                        ]
                },
                {
                        "Target": "Parameter",
                        "Name": "EyeBlink",
                        "Ids": [
                                "ParamEyeLOpen",
                                "ParamEyeROpen"
                        ]
                }
        ]
}

使用CubismEyeBlink

使用CubismEyeBlink类来实际眨眼。
这个类通过ICubismModelSetting接口,
针对.model3.json文件中描述的眨眼参数,
提供随机间隔的眨眼动作。

创建CubismEyeBlink副本

要创建CubismEyeBlink副本,请使用Native(C++)的CubismEyeBlink::Create函数、Web(TypeScript)、Java的CubismEyeBlink.create函数。
通过将CubismModelSettingJson副本传递给参数,将自动获取.model3.json文件的设置。
如果省略,则不指定眨眼ID。

// C++
if (_modelSetting->GetEyeBlinkParameterCount() > 0)
{
    _eyeBlink = CubismEyeBlink::Create(_modelSetting);
}
// TypeScript
if(_modelSetting.getEyeBlinkParameterCount() > 0)
{
    _eyeBlink = CubismEyeBlink.create(_modelSetting);
}
// Java
if(_modelSetting.getEyeBlinkParameterCount() > 0) {
    _eyeBlink = CubismEyeBlink.create(_modelSetting);
}

眨眼设置

可以通过Native(C++)的CubismEyeBlink::SetBlinkingInterval函数、Web(TypeScript)、Java的CubismEyeBlink.setBlinkingInterval函数、Native(C++)的CubismEyeBlink::SetBlinkingSettings函数、Web(TypeScript)、Java的CubismEyeBlink.setBlinkingSettings函数指定眨眼时间。
SetBlinkingInterval函数设置的眨眼间隔时间具有随机性,从0秒到设置时间的两倍。

// C++
	_eyeBlink->SetBlinkingInterval(6.0f);
    _eyeBlink->SetBlinkingSettings(0.8f, 0.2f, 0.8f);
// TypeScript
	_eyeBlink.setBlinkingInterval(8.0);
	_eyeBlink.SetBlinkingSettings(0.8, 0.2, 0.8);
// Java
    _eyeBlink.setBlinkingInterval(8.0f);
    _eyeBlink.setBlinkingSetting(0.8f, 0.2f, 0.8f);

此外,通过Native(C++)的CubismEyeBlink::SetParameterIds函数、Web(TypeScript)、Java的CubismEyeBlink.setParameterIds函数、Native(C++)的CubismEyeBlink::GetParameterIds函数、Web(TypeScript)、Java的CubismEyeBlink.getParameterIds函数,您可以稍后更改眨眼参数。

// C++
csmVector<CubismIdHandle> eyeBlinkList = _eyeBlink->GetParameterIds();
 
// 排除右眼开闭(ParamEyeROpen)的参数
CubismIdHandle removeTarget = CubismFramework::GetIdManager()->GetId("ParamEyeROpen");
for (csmUint32 i = 0; i < eyeBlinkList.GetSize(); ++i)
{
    if(eyeBlinkList[i] == removeTarget)
    {
        eyeBlinkList.Remove(i);
        break;
    }
}
 
// 追加第三个眼睛开闭(ParamEyeThirdOpen)参数
eyeBlinkList.PushBack(CubismFramework::GetIdManager()->GetId("ParamEyeThirdOpen"));
 
// 覆盖眨眼参数。 右眼不再开闭,新的第三个眼睛眨眼。
_eyeBlink->SetParameterIds(eyeBlinkList);
// TypeScript
let eyeBlinkList: csmVector<CubismIdHandle> = _eyeBlink.getParamterIds();
 
// 排除右眼开闭(ParamEyeROpen)的参数
let removeTarget: CubismIdHandle = CubismFramework.getIdManager().getId("ParamEyeROpen");
for(let i: number = 0; i < eyeBlinkLIst.getSize(); ++i)
{
    if(eyeBlinkList[i] == removeTarget)
    {
        eyeBlinkList.remove(i);
        break;
    }
}
 
// 追加第三个眼睛开闭(ParamEyeThirdOpen)参数
eyeBlinkList.pushBack(CubismFramework.getIdManager().getId("ParamEyeThirdOpen"));
 
// 覆盖眨眼参数。 右眼不再开闭,新的第三个眼睛眨眼。
_eyeBlink.setParameterIds(eyeBlinkList);
// Java
List<CubismId> eyeBlinkList = new ArrayList<CubismId>(_eyeBlink.getParameterIds());
 
// 排除右眼开闭(ParamEyeROpen)的参数
CubismId removeTarget = CubismFramework.getIdManager().getId("ParamEyeROpen");
boolean isRemoved = eyeBlinkList.remove(removeTarget);
 
// 如果右眼开闭参数存在且被正确删除,则添加第三只眼睛开闭参数(ParamEyeThirdOpen)
if (isRemoved) {
    eyeBlinkList.add(CubismFramework.getIdManager().getId("ParamEyeThirdOpen"));
}
 
// 覆盖眨眼参数。右眼不再开闭,新的第三个眼睛眨眼。
_eyeBlink.setParameterIds(eyeBlinkList);

适用于模型

要应用眨眼,请使用Native(C++)的CubismEyeBlink::UpdateParameters函数、Web(TypeScript)、Java的CubismEyeBlink.updateParameters函数,第一个参数输入目标模型,第二个参数输入与上一次更新之间的时间差。

// C++
if (_eyeBlink != NULL)
{
    _eyeBlink->UpdateParameters(_model, deltaTimeSeconds); 
}
// TypeScript
if(_eyeBlink != null)
{
    _eyeBlink.updateParameters(_model, deltaTimeSeconds);
}
// Java
if(_eyeBlink != null) {
    _eyeBlink.updateParameters(_model, deltaTimeSeconds);
}

放弃

您还需要在模型释放时,放弃CubismEyeBlink副本。

// C++
CubismEyeBlink::Delete(_eyeBlink);
// TypeScript
CubismEyeBlink.delete(_eyeBlink);

Java不需要放弃过程,因为政策是将释放留给垃圾回收。

关于本报道,敬请提出您的意见及要求。