自動まばたき

最終更新: 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ではガベージコレクションに解放を任せる方針のため、破棄の手続きは不要です。

この記事はお役に立ちましたか?
はいいいえ
この記事に関するご意見・
ご要望をお聞かせください。