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