呼吸
最終更新: 2022年12月8日
OWでモデルに呼吸をさせるにはCubismBreathを利用します。
パラメータを周期的に動作させることができるので、呼吸に限らずさまざまなことに応用させることもできます。
適用するパラメータは任意で指定できます。
また、パラメータごとに周期、パラメータの値の範囲、値を適用する際のWeight値を指定することも可能です。
CubismBreathの利用
CubismBreathインスタンスの生成
CubismBreathインスタンスの生成にはNative(C++)のCubismBreath::Create関数、またはWeb(TypeScript)、JavaのCubismBreath.create関数を使用します。
// C++ CubismBreath* breath = CubismBreath::Create();
// TypeScript let breath: CubismBreath = CubismBreath.create();
// Java CubismBreath breath = CubismBreath.create();
パラメータの指定
呼吸を設定するパラメータを指定するには、Native(C++)の CubismBreath::BreathParameterData 構造体、またはWeb(TypeScript)、Javaの BreathParameterData クラスを利用します。
第1引数に設定するパラメータIDをCubismId* 型(SDK for Web, SDK for Javaの場合はCubismId 型)で渡します。
第2引数には周期動作のオフセット値を渡します。呼吸の周期動作の値は正弦波から設定しており、その開始位置を指定します。
第3引数には正弦波の最大値を設定します。
第4引数には正弦波の周期を設定します。
第5引数にはパラメータに値を適用する際のウェイトを設定します。
// C++ csmVector<CubismBreath::BreathParameterData> breathParameters; breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId("ParamAngleX"), 0.0f, 15.0f, 6.5345f, 0.5f)); breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId("ParamAngleY"), 0.0f, 8.0f, 3.5345f, 0.5f)); breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId("ParamAngleZ"), 0.0f, 10.0f, 5.5345f, 0.5f)); breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId("ParamBodyAngleX"), 0.0f, 4.0f, 15.5345f, 0.5f)); breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId("ParamBreath"), 0.5f, 0.5f, 3.2345f, 0.5f)); breath->SetParameters(breathParameters);
// TypeScript const breathParameters: csmVector<BreathParameterData> = new csmVector(); breathParameters.pushBack(new BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleX"), 0.0, 15.0, 6.5345, 0.5)); breathParameters.pushBack(new BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleY"), 0.0, 8.0, 3.5345, 0.5)); breathParameters.pushBack(new BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleZ"), 0.0, 10.0, 5.5345, 0.5)); breathParameters.pushBack(new BreathParameterData(CubismFramework.getIdManager().getId("ParamBodyAngleX"), 0.0, 4.0, 15.5345, 0.5)); breathParameters.pushBack(new BreathParameterData(CubismFramework.getIdManager().getId("ParamBreath"), 0.5, 0.5, 3.2345, 1)); breath.setParameters(breathParameters);
// Java List<CubismBreath.BreathParameterData> breathParameters = new ArrayList<>(); breathParameters.add(new CubismBreath.BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleX"), 0.0f, 15.0f, 6.5345f, 0 breathParameters.add(new CubismBreath.BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleY"), 0.0f, 8.0f, 3.5345f, 0. breathParameters.add(new CubismBreath.BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleZ"), 0.0f, 10.0f, 5.5345f, 0 breathParameters.add(new CubismBreath.BreathParameterData(CubismFramework.getIdManager().getId("ParamBodyAngleX"), 0.0f, 4.0f, 15.5345 breathParameters.add(new CubismBreath.BreathParameterData(CubismFramework.getIdManager().getId("ParamBreath"), 0.5f, 0.5f, 3.2345f, 0. _breath.setParameters(breathParameters);
モデルに値を適用
呼吸を適用するにはNative(C++)のCubismBreath::UpdateParameters関数、Web(TypeScript), Javaの
CubismBreath.updateParameters関数を使用します。
第1引数に対象のモデル、第2引数に前回更新からの差分時間を入れます。
// C++ if (breath != NULL) { breath->UpdateParameters(cubismModel, deltaTimeSeconds); }
// TypeScript if (this._breath != null) { this._breath.updateParameters(this._model, deltaTimeSeconds); }
// Java if (breath != null) { breath.updateParameters(cubismModel, deltaTimeSeconds); }
CubismBreathの破棄
モデルが解放されるタイミングでCubismBreathインスタンスも破棄する必要があります。
// C++ CubismBreath::Delete(breath);
// TypeScript CubismBreath.delete(breath);
Javaではガベージコレクションに解放を任せる方針のため、破棄の手続きは不要です。