自動まばたき
[最終更新日:2019/01/18]
まばたきに使用するパラメータの特定
自動まばたきエフェクト機能を使用することで、モデルに対してランダムなまばたき動作を適用することができます。
自動まばたきエフェクトを適用するために以下の処理を行います。
・.model3.jsonファイルに記述された、自動まばたきエフェクトの値を適用するパラメータとの対応付け
・まばたきの時間間隔を設定し、更新処理を呼ぶ
このうち、.model3.jsonファイルに記述される自動まばたきエフェクトとパラメータを対応付ける情報は、
ICubismModelSettingクラスを継承するCubismModelSettingJsonクラスを利用することによって取得することができます。
1 2 3 4 5 6 |
// C++ csmInt32 eyeBlinkCount = _modelSetting->GetEyeBlinkParameterCount(); for (csmInt32 i = 0; i < eyeBlinkCount; i++) { CubismIdHandle eyeblinkParameter = _modelSetting->GetEyeBlinkParameterId(i); } |
1 2 3 4 5 6 |
// TypeScript let eyeBlinkCount: number = _modelSetting.getEyeBlinkParameterCount(); for(let i: number = 0; i < eyeBlinkCount; i++) { let eyeBlinkParameter: CubismIdHandle = _modelSetting.getEyeBlinkParameterId(i); } |
.model3.jsonファイルの中に定義を入れるには「まばたき設定」を確認してください。
Editor上でまばたき・リップシンク設定を行ってから出力すると、.model3.jsonファイルには以下のように記述されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ ... 省略 ... "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)のCubismEyeBlink.create関数を使用します。
引数にCubismModelSettingJsonインスタンスを渡すことによって、.model3.jsonファイルの設定を自動的に取得します。
省略した場合はまばたきのIDは未指定になります。
1 2 3 4 5 |
// C++ if (_modelSetting->GetEyeBlinkParameterCount() > 0) { _eyeBlink = CubismEyeBlink::Create(_modelSetting); } |
1 2 3 4 5 |
// TypeScript if(_modelSetting.getEyeBlinkParameterCount() > 0) { _eyeBlink = CubismEyeBlink.create(_modelSetting); } |
まばたきの設定
Native(C++)のCubismEyeBlink::SetBlinkingInterval関数、またはWeb(TypeScript)のCubismEyeBlink.setBlinkingInterval関数や
Native(C++)のCubismEyeBlink::SetBlinkingSettings関数、またはWeb(TypeScript)のCubismEyeBlink.setBlinkingSettings関数によってまばたきの時間を指定できます。
SetBlinkingInterval関数で設定するまばたきの間の時間は、0秒から設定時間の2倍までのランダム性があります。
1 2 3 |
// C++ _eyeBlink->SetBlinkingInterval(6.0f); _eyeBlink->SetBlinkingSettings(0.8f, 0.2f, 0.8f); |
1 2 3 |
// TypeScript _eyeBlink.setBlinkingInterval(8.0); _eyeBlink.SetBlinkingSettings(0.8, 0.2, 0.8); |
また、Native(C++)のCubismEyeBlink::SetParameterIds関数、またはWeb(TypeScript)のCubismEyeBlink.setParameterIds関数や
Native(C++)のCubismEyeBlink::GetParameterIds関数、またはWeb(TypeScript)のCubismEyeBlink.getParameterIds関数によって、
まばたきするパラメータをあとから変更することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 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); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 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); |
モデルへの適用
まばたきを適用するにはNative(C++)のCubismEyeBlink::UpdateParameters関数、またはWeb(TypeScript)のCubismEyeBlink.updateParameters関数を使用し、
第一引数に対象のモデル、第二引数に前回更新からの差分時間を入れます。
1 2 3 4 5 |
// C++ if (_eyeBlink != NULL) { _eyeBlink->UpdateParameters(_model, deltaTimeSeconds); } |
1 2 3 4 5 |
// TypeScript if(_eyeBlink != null) { _eyeBlink.updateParameters(_model, deltaTimeSeconds); } |
破棄
モデルが解放されるタイミングでCubismEyeBlinkインスタンスも破棄する必要があります。
1 2 |
// C++ CubismEyeBlink::Delete(_eyeBlink); |
1 2 |
// TypeScript CubismEyeBlink.delete(_eyeBlink); |