モデル表示直後の物理演算を即座に安定化させる

最終更新: 2022年9月8日

Cubism 4 SDK R5で物理演算を即座に安定化させる機能が追加されました。
Cubism SDKでモデルを表示したとき、パラメータの値が初期値でない場合は物理演算が激しく動作することがあり、これを即座に安定化させるために使用します。

物理演算を即座に安定化させるには、モデルの初期化直後または配置直後にNativeでは CubismPhysics::Stabilization()、WebではCubismPhysics.stabilization()、UnityではCubismPhysics.Stabilization()を呼び出します。

以下はCubism SDKのサンプルシーンを利用し、モデルの初期化直後に物理演算を安定化させるスニペットになります。

Native

モデルの最初のフレームだけ、物理演算処理の直前に安定化の関数を呼び出します。

bool isUpdateFirst = true;

void LAppModel::Update()
{
    ...

    // 物理演算の設定
    if (_physics != NULL)
    {

        if (isUpdateFirst)
        {

            // 初期化直後の物理演算を安定化
            _physics->Stabilization(_model);
          
            isUpdateFirst = false;
        }

        _physics->Evaluate(_model, deltaTimeSeconds);
    }

    ...

Web

モデルの最初のフレームだけ、物理演算処理の直前に安定化の関数を呼び出します。

_isUpdateFirst: boolean = true;

public update(): void {
  ...

  // 物理演算の設定
  if (this._physics != null) {

    if (this._isUpdateFirst) {

      // 初期化直後の物理演算を安定化
      this._physics.stabilization(this._model);

      this._isUpdateFirst = false;
    }
    
    this._physics.evaluate(this._model, deltaTimeSeconds);
  }
  
  ...

Unity

以下のコンポーネントをモデルのプレハブのルートにアタッチすると、モデルの最初のフレームだけ、物理演算処理の直前に安定化の関数を呼び出します。

using Live2D.Cubism.Framework;
using Live2D.Cubism.Framework.Physics;
using UnityEngine;

public class PhysicsStabilizer : MonoBehaviour, ICubismUpdatable
{
    private bool _isUpdateFirst = true;

    public bool HasUpdateController { get; set; }

    public int ExecutionOrder
    {
        get { return CubismUpdateExecutionOrder.CubismPhysicsController - 1; }
    }

    public bool NeedsUpdateOnEditing
    {
        get { return false; }
    }

    public void OnLateUpdate()
    {
        if (!_isUpdateFirst)
        {
            return;
        }

        // 初期化直後の物理演算を安定化
        GetComponent<CubismPhysicsController>().Stabilization();

        _isUpdateFirst = false;
    }

    public void Start()
    {
        HasUpdateController = (GetComponent<CubismUpdateController>() != null);
    }

    private void LateUpdate()
    {
        if (!HasUpdateController)
        {
            OnLateUpdate();
        }
    }
}
この記事に関するご意見・
ご要望をお聞かせください。