自动眨眼
最終更新: 2023年1月26日
识别用于眨眼的参数
您可以使用自动眨眼效果功能,将随机眨眼动作应用于模型。
执行以下处理以应用自动眨眼效果。
·与应用.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不需要放弃过程,因为政策是将释放留给垃圾回收。