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 の範囲と補完のされ方をまとめると次のように成ります。
- frame の範囲は0以上10未満(9.9999)となります。
- frame を 0.5とすると、0フレーム目と1フレーム目のちょうど真ん中のモーションを補完して描画します。
- frame が9以上10未満(9.9999)の補完は、最後のキーフレームと最初のキーフレーム間の補完となります。
引数 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(); }
本関数は0番スロットのモーション情報構造体を使用します。
本関数を呼び出すとカレントモーション情報構造体は0番スロットに設定されます。
njCameraAction() カメラモーションの実行(アクション構造体対応) njGetCameraMotion() カメラモーションのモーション後のデータの取得