void njCnkSimpleMultiDrawShapeMotionLink( 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:リンク先)
通常、リンク元のノードモーションとシェープモーションの補完位置、及び、 リンク先のノードモーションとシェープモーションの補完位置、がそれぞれ等しく なければなりません。
つまり、
とする必要があります。
- motionlink->frame[0] = shapelink->frame[0]
- motionlink->frame[1] = shapelink->frame[1]
この関係を満たさない場合も補完自体は可能ですが、その場合の図形的効果は予想が難し くなるでしょう。
ノードモーションのリンクの仕方については、モーションリンク関数とまったく同じになりますので、 詳しくはモーションリンク関数(たとえば、njCnkSimpleMultiDrawMotionLink)を参照してください。
シェープモーションの補完については、リンク元の補完、リンク先の補完、それらの結合のいずれに ついても線形補完となり、スプライン補完を指定するビットなどは無視されます。
シェープリンクの補完部分は、シェープバッファ上にいったん 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 */ njCnkSimpleMultiDrawShapeMotionLink( OBJECT, &motionlink, &shapelink, rate ); rate += 0.01f; if ( rate > 1.0f ) { rate = 0.0f; } }
本関数は、他のシャープモーションリンク描画関数と描画関数以外は完全に共通です。
njCnkSimpleMultiDrawObject() CHUNKオブジェクトのSIMPLE MULTI描画 njCnkSimpleMultiDrawMotion() モーションの描画(CHUNK-SIMPLE MULTI) njCnkSimpleMultiDrawShapeMotion() シェープモーションの描画(CHUNK-SIMPLE MULTI) njCnkSimpleMultiDrawMotionLink() モーションリンクの描画(CHUNK-SIMPLE MULTI)