##### Ninja Library - モーション関数

# njCameraMotion

カメラモーションの実行

### 書式

> `void njCameraMotion( camera, motion, frame )
> const NJS_CAMERA *camera
> const NJS_MOTION *motion
> Float frame
> `

### 引数

> camera | カメラ構造体へのポインタ
> motion | カメラ用のモーション構造体へのポインタ
> frame | フレーム番号(0〜モーションフレーム数(motion->nbFrame)未満)

### 戻り値

> なし

### 解説

> カメラのモーションをモーションデータにしたがって実行します。

> 通常、本関数の cmaera 引数には、NACファイル（またはNJCファイル）中の NJS_CAMERA 構造体、 motion 引数には、カメラモーション用の NAMファイル（またはNJMファイル）中の NJS_MOTION 構造体 を指定します。

> カメラモーション関数は、新カメラ関数群(njCameraEx系関数)を使って組み込まれています

> 旧カメラモーション関数では、マトリックススタックのスタックポインタをベース位置に初期化 していましたが、新カメラモーション関数ではマトリックススタックのスタックポインタを 初期化せずに、単純にカレントマトリックスの左から新しく作成した行列を乗算します。

> マトリックススタックのスタックポインタをベース位置に戻す関数は用意されていませんので、 njPushMatrix を行ったときは、責任を持って同じ回数だけ njPopMatrix を行ってください。

> 旧カメラモーション関数と同様に使用するには、呼び出す前に、njUnitMatrix(NULL); などを 行って、関数を呼び出す直前のカレントマトリックスを単位行列にする必要が有ります。

> 引数の camera 構造体は、モーションデータ中にキーフレームデータ列が存在しない場合の デフォルト値として使用されます。従って読み込まれるだけで書き込みは行われません。

> なお、本関数は、njGetCameraMotion() 関数によってモーション後のカメラ情報を取得し、 その情報に基づいて新カメラ関数群によってカレントマトリックスを作成し、njSetPerspective() 関数によって画角を設定しています。本関数と等価な動作を行うソースリストが、 njGetCameraMotion()関数の例に掲載されています。

> 引数 frame で示される位置の位置データ、及び姿勢データを、モーションデータのキーフレーム間を補間して 作成します。

> 例: フレーム数（motion->nbFrame）が10のモーションの場合

> - frame の範囲は0以上10未満(9.9999)となります。
> - frame を 0.5とすると、0フレーム目と1フレーム目のちょうど真ん中のモーションを補完して描画します。
> - frame が9以上10未満(9.9999)の補完は、最後のキーフレームと最初のキーフレーム間の補完となります。

> 引数 frame の範囲と補完のされ方をまとめると次のように成ります。

> 引数 frame の範囲 | 補完のされ方
> frame < 0 | 暴走はしませんが通常は使いません。
> 0 <= frame <= motion->nbFrame - 1 | 通常の補完
> motion->nbFrame - 1 <= frame < motion->nbFrame | 最後のキーフレームと最初のキーフレームの補完
> motion->nbFrame <= frame | 暴走はしませんが通常は使いません。

### 用例

>     #include <Ninja.h>
>     #define CAMERA           camera1;
>     #define CAMERA_MOTION    camera_motion1;
>     #define ENEMY1_MODEL     model_enemy1;
>     #define ENEMY1_MOTION    motion_enemy1;

>     extern NJS_CAMERA      CAMERA;
>     extern NJS_MOTION      CAMERA_MOTION;
>     extern NJS_MODEL       ENEMY1_MODEL;
>     extern NJS_MOTION      ENEMY1_MOTION;

>     Float    EneX;
>     Float    EneY;
>     Float    EneZ;
>     Angle    EneAngY;

>     void DrawFunc( Float frame )
>     {
>         njUnitMatrix( NULL );
>         njCameraMotion( &CAMERA, &CAMERA_MOTION, frame );

>         njPushMatrixEx();

>         njTranslate( NULL, EneX, EneY, EneZ );
>         njRotateY( NULL, EneAngY );
>         njCnkEasyDrawMotion( &ENEMY1_MODEL, &ENEMY1_MOTION, frame );

>         njPopMatrixEx();
>     }

### 備考

> 本関数は０番スロットのモーション情報構造体を使用します。
> 本関数を呼び出すとカレントモーション情報構造体は０番スロットに設定されます。

### 参照

> njCameraAction() | カメラモーションの実行（アクション構造体対応）
> njGetCameraMotion() | カメラモーションのモーション後のデータの取得

njCameraMotion

COPYRIGHT © SEGA ENTERPRISES, LTD., 1998-2000