void njCnkSimpleDrawShapeMotion( object, motion, shape, frame )
const NJS_CNK_OBJECT *object
const NJS_MOTION *motion
const NJS_MOTION *shape
Float frame
object チャンクオブジェクト構造体へのポインタ motion ノードモーション用のモーション構造体へのポインタ shape シェープモーション用のモーション構造体へのポインタ frame フレーム番号(0〜モーションフレーム数(motion->nbFrame)未満)
なし
引数 frame により指定された位置のシェープモーションをシェープデータ及び、 モーションデータにしたがって描画します。本関数ではシェープモーション(頂点アニメーション)とノードモーション (ノードの位置と回転と拡大縮小のアニメーション)を合成して描画します。
基本的には、モーションのフレーム数とシェープのフレーム数が一致していなけれ ばなりません。つまり、motion->nbFrame == shape->nbFrame である必要が有りま す。一致していない場合の動作は保証しかねます。
内部的にはシェープモーションを施したモデルにノードモーションに対応 したマトリックス演算を施して描画します。 このためエンベロープ描画との共存が可能です。
例: フレーム数(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 暴走はしませんが通常は使いません。
シェープ補完部では線形補完のみ行います。スプライン補完には対応していません。
シェープ部分が対応している、VLIST の頂点型は下記のとおりです。
NJD_CV
NJD_CV_D8
NJD_CV_UF
NJD_CV_VN
NJD_CV_VN_D8
NJD_CV_VN_UF
NJD_CV_VN_NF
#include <Ninja.h> #define OBJECT object_sample /* Entered in NJA (NAM) file */ #define MOTION motion_sample /* Entered in NAM file */ #define SHAPE shape_sample /* Entered in NAS file */ extern NJS_CNK_OBJECT OBJECT[]; extern NJS_MOTION MOTION[]; extern NJS_MOTION SHAPE[]; float buf[10000]; float ff = 0.0f; : { njInitShape( buf ); : njCnkSimpleDrawShapeMotion( OBJECT, MOTION, SHAPE, ff ); ff += 0.2f; if ( ff >= MOTION->nbFrame - 1 ) { ff = 0.0f; } } :
- チャンクオブジェクト構造体用のモーションです。
- モーションとシェープ(頂点アニメーション)がついただけで、描画に関してはモデル描画とまったく同様になります。
njCnkSimpleDrawMotion() モーションの描画(CHUNK-SIMPLE) njCnkSimpleDrawObject() CHUNKオブジェクトのSIMPLE描画