呼吸

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

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