Ninja Library - モーション関数

njCnkSimpleDrawShapeMotionLink

シェープモーションリンクの描画(CHUNK-SIMPLE)

書式

void njCnkSimpleDrawShapeMotionLink( object, motionlink, shapelink, rate )
const NJS_CNK_OBJECT *object
const NJS_MOTION_LINK *motionlink
const NJS_MOTION_LINK *shapelink
Float rate

引数

object   オブジェクト構造体へのポインタ
motionlink   ノードモーション用のモーションリンク構造体へのポインタ
shapelink   シェープモーション用のモーションリンク構造体へのポインタ
rate   補完レイト(0〜1)

戻り値

なし

解説

指定された2つのシェープモーションを結合したモーションを描画します。

本関数は、2つのノードモーションのリンクと、2つのシェープモーションのリンクをそれぞれ 独立して行い、通常のシェープモーション描画関数と同様に、シェープモーションを施したモデル にノードモーションに対応したマトリックス演算を施して描画します。

このためエンベロープ描画との共存が可能です。

本関数は、引数として、ノードモーション用のモーションリンク構造体 motionlink と、 シェープモーション用のモーションリンク構造体 shapelink の二つをとります。

引数 motionlink には、リンク元および、リンク先に対応した2つのノードモーション構造体 および、それぞれに対応した2つのフレーム番号を指定します。

引数 shapelink には、リンク元および、リンク先に対応した2つのシェープモーション構造体 および、それぞれに対応したフレーム番号を指定します。

一方、引数の rate にはリンク元とリンク先のシェープモーション間の内分比を指定します。

引数の rateが 0 のときはリンク元のモーションに、rate が 1のときはリンク先の モーションに一致します。rate がその間(0 < rate < 1)にあるときはリンク先のモーションと リンク元のモーションを補完します。

引数の意味をまとめると以下の表のようになります。

 変数名   役割 
 motionlink->motion[0]   リンク元のノードモーション 
 motionlink->motion[1]   リンク先のノードモーション 
 motionlink->frame[0]   リンク元のノードモーションの補完位置 
 motionlink->frame[1]   リンク先のノードモーションの補完位置 
 shapelink->motion[0]   リンク元のシェープモーション 
 shapelink->motion[1]   リンク先のシェープモーション 
 shapelink->frame[0]   リンク元のシェープモーションの補完位置 
 shapelink->frame[1]   リンク先のシェープモーションの補完位置 
 rate   リンク元とリンク先との内分比(0:リンク元〜1:リンク先) 

通常、リンク元のノードモーションとシェープモーションの補完位置、及び、 リンク先のノードモーションとシェープモーションの補完位置、がそれぞれ等しく なければなりません。

つまり、

とする必要があります。

この関係を満たさない場合も補完自体は可能ですが、その場合の図形的効果は予想が難し くなるでしょう。

ノードモーションのリンクの仕方については、モーションリンク関数とまったく同じになりますので、 詳しくはモーションリンク関数(たとえば、njCnkSimpleDrawMotionLink)を参照してください。

シェープモーションの補完については、リンク元の補完、リンク先の補完、それらの結合のいずれに ついても線形補完となり、スプライン補完を指定するビットなどは無視されます。

シェープリンクの補完部分は、シェープバッファ上にいったん vlist を作成しますが、この際、 リンク元の補完、リンク先の補完をそれぞれ全頂点にわたって行ってバッファ上に貯めてからから あらためて結合する事は行っていません。実際には、それら2つの補完とそれらの結合を1頂点単位で 同時に行ってからシェープバッファに格納します。このことにより、メモリアクセスが減り比較的 高速にシェープリンクが行えます。また、シェープバッファの消費量も通常のシェープモーションと 変わりなく、本関数で使用されるシェープバッファの容量は、オブジェクトツリーのノード中の最大の vlist のサイズに等しくなります。

シェープ及びシェープリンク部分が対応している、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
#define	MOTION1   motion_sample1 /* Entered in NAM file */
#define	MOTION2   motion_sample2 /* Entered in NAM file */
#define	SHAPE1    shape_sample1  /* Entered in NAS file */
#define	SHAPE2    shape_sample2  /* Entered in NAS file */
extern NJS_MOTION    MOTION1[];
extern NJS_MOTION    MOTION2[];
extern NJS_MOTION    SHAPE1[];
extern NJS_MOTION    SHAPE2[];
extern NJS_CNK_OBJECT   OBJECT[];
NJS_MOTION_LINK         motionlink;
NJS_MOTION_LINK         shapelink;
Float                   rate = 0.0f;
	:

{
    motionlink.motion[0]  = MOTION1;  /* Link source */
    motionlink.motion[1]  = MOTION2;  /* Link target* /
    motionlink.frame[0]   = 4.3f;
    motionlink.frame[1]   = 1.5f;
    
    shapelink.motion[0]   = SHAPE1;  /* Link source */
    shapelink.motion[1]   = SHAPE2;  /* Link target* /
    shapelink.frame[0]    = 4.3f;
    shapelink.frame[1]    = 1.5f;
                      :
    /* rate specifies 0 to 1 */
    
    njCnkSimpleDrawShapeMotionLink( OBJECT, &motionlink, &shapelink, rate );
    
    rate   += 0.01f;
    if ( rate > 1.0f ) {
        rate = 0.0f;
    }
}


備考


本関数は、他のシャープモーションリンク描画関数と描画関数以外は完全に共通です。

参照

njCnkSimpleDrawObject() CHUNKオブジェクトのSIMPLE描画
njCnkSimpleDrawMotion() モーションの描画(CHUNK-SIMPLE)
njCnkSimpleDrawShapeMotion() シェープモーションの描画(CHUNK-SIMPLE)
njCnkSimpleDrawMotionLink() モーションリンクの描画(CHUNK-SIMPLE)

njCnkSimpleDrawShapeMotionLink
COPYRIGHT © SEGA ENTERPRISES, LTD., 1998-2000