自動まばたき
最終更新: 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秒から設定時間の2倍までのランダム性があります。
// 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ではガベージコレクションに解放を任せる方針のため、破棄の手続きは不要です。