メインコンテンツまでスキップ

MMD カメラ

このセクションでは、MMDのカメラ動作を再現する**MmdCameraクラスとIMmdCamera**インターフェースについて説明します。

MmdCameraクラス

Orbit Camera MMDカメラのオービットパスの視覚的表現

MMDのカメラは、センターポジションを中心に回転するオービットカメラです。 **MmdCamera**クラスはこれを再現しており、そのためカメラを制御するパラメータは以下の通りです:

  • position (Vector3) - オービットセンターポジション
  • rotation (Vector3) - ヨー ピッチ ロール
  • distance (number) - オービットセンターからの距離
  • fov (number) - ラジアン単位のフィールドオブビュー

**MmdCameraクラスは、Babylon.jsのCamera**クラスを継承しています。そのため、他のBabylon.jsカメラと同様に、シーンに追加して使用できます。

カメラの作成

以下のコードで**MmdCamera**を作成し、シーンに追加できます:

const mmdCamera = new MmdCamera("mmdCamera", new Vector3(0, 10, 0), scene, true);

各パラメータは順に以下を意味します:

  • name:カメラ名
  • position:初期オービットセンター値(デフォルト:(0, 10, 0))
  • scene:カメラを追加するシーン(デフォルト:Engine.LastCreatedScene)
  • setActiveOnSceneIfNoneActive:作成後に他のカメラが定義されていない場合、このカメラをシーンのアクティブカメラに設定するかどうか(デフォルト:true)

アニメーションバインディング

**MmdCameraは、VMDまたはBVMDファイルから作成されたMmdAnimation**をバインドして使用できます。

const vmdLoader = new VmdLoader();
const mmdAnimation = await vmdLoader.loadAsync("path/to/file.vmd");

const mmdCamera = new MmdCamera("camera", new Vector3(0, 10, 0), scene);
const animationHandle: MmdRuntimeAnimationHandle = mmdCamera.createRuntimeAnimation(mmdAnimation);

上記のコードは、VMDファイルをロードして**MmdAnimationを作成し、MmdCamera**にバインドする例です。

**MmdCamera.createRuntimeAnimation**メソッドを使用して、バインドされた「ランタイムアニメーション」を作成できます。ファンクションによって返される結果は、実際のランタイムアニメーションオブジェクトではなく、オブジェクトへのハンドルです。

runtimeAnimations

作成されたランタイムアニメーションオブジェクトは**MmdCamera.runtimeAnimations**に追加されます。

これにより、プロキシではなく実際のランタイムアニメーションオブジェクトにアクセスして、より低レベルの制御が可能になります。

アニメーションの使用

バインドされたランタイムアニメーションを使用するには、**MmdCamera.setRuntimeAnimation**メソッドを呼び出します:

mmdCamera.setRuntimeAnimation(animationHandle);

デフォルトでは、**MmdCamera**オブジェクトは一度に1つのアニメーションのみを再生できます。

現在設定されているアニメーションを削除するには、引数として**null**を渡します:

mmdCamera.setRuntimeAnimation(null);

現在設定されているアニメーションは、**MmdCamera.currentAnimation**プロパティを通じてアクセスできます。

ランタイムアニメーションの破棄

**MmdCameraにバインドされたランタイムアニメーションを破棄するには、destroyRuntimeAnimation**メソッドを呼び出します:

mmdCamera.destroyRuntimeAnimation(animationHandle);

使用されなくなったカメラランタイムアニメーションを破棄しない場合、メモリーリークは発生しませんが、特殊なケースでランタイムエラーが発生する可能性があります。

アニメーションの評価

現在設定されているアニメーションを評価するには、**MmdCamera.animate()**メソッドを使用できます。

このメソッドは通常直接呼び出されませんが、MMDランタイムによって呼び出されます。

MmdCameraを手動で制御している場合は、このメソッドを呼び出してアニメーションを評価できます:

let sec = 0;
scene.onBeforeRenderObservable.add(() => {
const frameTime = sec * 30; // MMDは30fpsで動作します
mmdCamera.animate(frameTime); // アニメーションを評価します。30フレーム単位でスケールされた時間をパラメータとして渡します
sec += engine.getDeltaTime() / 1000;
});

IMmdCameraインターフェース

babylon-mmdは、ユーザーが独自のMMDカメラを実装できるように**IMmdCamera**インターフェースを提供します。

babylon-mmdのすべてのコンポーネントは、MMDカメラオブジェクトを参照または渡す際に、**MmdCameraクラスタイプではなくIMmdCamera**インターフェースを使用します。