void njSetUserLight( *ptr, func ) NJS_LIGHT *ptr NJF_LIGHT_FUNC func
*ptr | ライトのポインタ |
func | コールバック関数名(ポインタ) |
<njDrawObjectの場合>
NJS_ARGB argb[2]として設定してください。
argb[0].a argb[0].r argb[0].g argb[0].bディフューズ
argb[1].a argb[1].r argb[1].g argb[1].bスペキュラ
コールバック関数の基本的な設定方法:
func(NJS_ARGB* argb, NJS_POINT3* pnt, NJS_VECTOR* nml, NJS_LIGHT* lt)
{
NJS_ARGB dif, spc;
/* ライトの計算 */
argb[0].a += dif.a;
argb[0].r += dif.r;
argb[0].g += dif.g;
argb[0].b += dif.b;
/*argb[1].a += spc.a;*/
argb[1].r += spc.r;
argb[1].g += spc.g;
argb[1].b += spc.b;
}
<njFastDrawObjectの場合>
NJS_ARGB argb[0]のa,r成分のみ設定してください。( = Float intensity[2])
argb[0].aディフューズ
argb[0].rスペキュラ
コールバック関数の基本的な設定方法:
func(NJS_ARGB* argb, NJS_POINT3* pnt, NJS_VECTOR* nml, NJS_LIGHT* lt)
{
Float dif, spc;
/* ライトの計算 */
argb[0].a += dif.a;
argb[0].r += dif.r;
}
: NJS_LIGHT light; void func(NJS_ARGB* argb, NJS_POINT3* pnt, NJS_VECTOR* nml, NJS_LIGHT* lt) { : /* ポリゴン法線と光線方向の内積の例 */ deg = - nml->x * NJM_LIGHT_VECTOR(lt). x - nml->y * NJM_LIGHT_VECTOR(lt).y - nml->z * NJM_LIGHT_VECTOR(lt).z; : /* argb */ if (deg > 0.f) { argb[0].a += deg * deg * NJM_LIGHT_SPC(lt).a; argb[1].r += deg * deg * NJM_LIGHT_SPC(lt).r; argb[1].g += deg * deg * NJM_LIGHT_SPC(lt).g; argb[1].b += deg * deg * NJM_LIGHT_SPC(lt).b; argb[0].r += deg * NJM_LIGHT_DIF(lt).r; argb[0].g += deg * NJM_LIGHT_DIF(lt).g; argb[0].b += deg * NJM_LIGHT_DIF(lt).b; } } void njUserInit(void) { : njCreateLight(&light, NJD_USER_LIGHT); /*ライトltにユーザー関数funcを設定*/ njSetUserLight (&light, func); : }
ユーザーが作成するライト関数、その中で使用されるマクロは以下のとおりです。
1.func(argb, pnt, nml, ptr):コールバック関数
<書式>
func( *argb, *pnt, *nml, *ptr)
NJS_ARGB *argb
NJS_POINT3 *pnt
NJS_VECTOR *nml
NJS_LIGHT *ptr
<引数>
*argb | 演算後のポインタ。 |
*pnt | ポリゴンの位置ベクトルのポインタ。 |
*nml | ポリゴンの法線ベクトルのポインタ。 |
*ptr | njCreateLightによって設定されたライトのポインタ。 |
2.マクロ(NJS_LIGHT *ptr の時)
<NJM_LIGHT_VECTOR(ptr)>
ライトのカレントの方向:NJS_VECTORです。NJM_LIGHT_VECTOR(ptr).x のように参照してください。
<NJM_LIGHT_POINT(ptr)>
ライトのカレントの位置:NJS_POINT3です。NJM_LIGHT_POINT(ptr).xのように参照してください。
<NJM_LIGHT_AMB(ptr)>
環境光強度:NJS_ARGBで、一般的には0−1.fの値が入っております(ただし、1.f以上の値も取り得ます)。NJM_LIGHT_AMB(ptr).rのように参照してください 。
<NJM_LIGHT_DIF(ptr)>
デフューズ光強度:NJS_ARGBで、一般的には0−1.fの値が入っております(ただし、1.f以上の値も取り得ます)。NJM_LIGHT_DIF(ptr).rのように参照してく ださい。
<NJM_LIGHT_SPC(ptr)>
スペキュラ光強度:NJS_ARGBで、一般的には0−1.fの値が入っております(ただし、1.f以上の値も取り得ます)。NJM_LIGHT_SPC(ptr).rのように参照してく ださい。
<NJM_LIGHT_EXP(ptr)>
指数:オブジェクトデータ中の情報の一部で、Intです。 これによりスペキュラの広がりが得られます。以下にSOFTIMAGEとの対応表を示します。
Ninja | SOFTIMAGE |
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 6 |
6 | 8 |
7 | 12 |
8 | 16 |
9 | 24 |
10 | 32 |
11 | 48 |
12 | 64 |
13 | 96 |
14 | 128 |
15 | 192 |
16 | 256 |
<NJM_LIGHT_COLOR(ptr)>
ライトの色:NJS_ARGBです。ライトの色が得られます。
<NJM_LIGHT_INIT_VECTOR(ptr)>
ライトの行列計算前の方向:NJS_VECTORです。行列計算前の初期方向です。
<NJM_LIGHT_INIT_POINT(ptr)>
ライトの行列計算前の位置:NJS_POINT3です。行列計算前の初期位置です。
<NJM_LIGHT_MATRIX(ptr)>
ライトの行列:NJS_MATRIXです。ライトの行列です。