English
SGL User's ManualPROGRAMMER'S TUTORIAL
戻る進む
PROGRAMMER'S TUTORIAL

3.光源


 本章では、SGLにおける光源の設定法について解説します。光源を用いることによって、 3Dグラフィックス表示されたオブジェクト群は陰影を与えられ、よりリアルな映像を描画する ことが可能となります。

3-1. 光源

 光源は、一般に次の情報を含んでいます。

・光源の位置
・光の強さ
・光の色

 しかし、これら全てを光源情報として計算し正確に描画するには、膨大な時間がかかります。 そこで、SGLではこれら光源情報の中から光源方向のみを選択してポリゴン描画に反映します。
また、光の方向に関しても、通常光はある一点からの放射として定義されますが、これも計算に時間がかかりすぎます。 そこで、光源位置を無限遠方と想定し、光の方向はオブジェクトの座標位置によらず、 常に同じ方向から照射されるものとして処理します。

<図3-1 光源イメージモデル>

 オブジェクト表面の光源による変化は、光線の方向と各ポリゴン面の法線ベクトルの向きによって決定されます。 これをイメージ化したものが、下図になります。

図3-2 陰影イメージモデル
光源によるポリゴン面の陰影

  • ポリゴン面は、光の入射角に応じてポリゴンカラーを変化させます。
  • 入射角が垂直に近いほど明るく、水平に近いほど暗くなります。
  • 入射角が負の垂直の場合最も暗くなります。

    3-2. 光源の設定

    SGLにおける光源の設定には、関数“slLight”を使用してください。 光源関数は光線の向きを表す方向ベクトル(光源ベクトル)のみをもち、光の強さや色情報は含まれません。

    【void slLight ( VECTOR light ) ;】

     SGLにおける光源の設定を行います。
    パラメータには、光線の方向を示すVECTOR型変数(光源ベクトル)を代入します。
    光源の強さ及び色の情報などはパラメータに含まれません。
    SGLでは、光線は指定された方向ベクトルの向きから常に照射されるとして定義されます。
     また、オブジェクトの表面属性で光源計算をオンにしない限り、光源を設定しても光源による陰影は反映されません (詳細は“第7章  ポリゴンの面属性”参照)。

     ポリゴン面は、面に対する光の入射角からポリゴンカラーを決定します。
    入射角が垂直に近いほど明るく、水平に近いほど暗く表示されます。 また、負の垂直方向が最も暗く表現されます。

    光源設定時の注意

     カレントマトリクスにスケールなど各種変換操作がかかっている場合、 光源計算が正常に行われない場合があります。
    これは、関数“slLight”で指定する光源ベクトルの算出に、 ユーザーがマトリクス演算を使用するために発生するものです。そこで、光源の設定を行う場合は、 カレントマトリクスを初期化しておく必要があります。
     カレントマトリクスの初期化には、関数“slPushUnitMatrix”または“slUnitMatrix” を使用してください。

    【Bool slPushUnitMatrix ( void )】

     単位行列をスタックに確保し、カレントマトリクスとします。
    以前のカレントマトリクスは、スタック中の上位レベルに一時保存されます。

    【void slUnitMatrix ( MATRIX mtptr )】

     パラメータで指定されたマトリクスを単位行列にします。
    パラメータには指定するMATRIX型変数を代入します。
    また、パラメータに“CURRENT”を指定した場合、変換対象マトリクスはカレントマトリクスになり、 カレントマトリクスの初期化が行えます。

     カレントマトリクス及びマトリクス関数の詳細は “第5章 マトリクス”を参考してください。

     次のリスト3-1は、空間内に置かれた立方体に対し、光源の方向ベクトル を次々に変化させていったときの立方体ポリゴン面の陰影の変化を示したものです。

    <リスト3-1 sample_3_2:光源移動によるオブジェクト面の変化>
    /*----------------------------------------------------------------------*/
    /*	Cube & A Light Source						*/
    /*----------------------------------------------------------------------*/
    #include	"sgl.h"
    
    extern PDATA PD_PLANE1;
    
    void ss_main(void)
    {
    	static ANGLE	ang[XYZ];
    	static FIXED	pos[XYZ];
    	static FIXED	light[XYZ];
    	static ANGLE	tmp = DEGtoANG(0.0);
    
    	slInitSystem(TV_320x224,NULL,1);
    
    	ang[X] = DEGtoANG(30.0);
    	ang[Y] = DEGtoANG(45.0);
    	ang[Z] = DEGtoANG( 0.0);
    	pos[X] = toFIXED(  0.0);
    	pos[Y] = toFIXED(  0.0);
    	pos[Z] = toFIXED(190.0);
    
    	light[X] = toFIXED(-1.0);
    	light[Y] = toFIXED( 0.0);
    	light[Z] = toFIXED( 0.0);
    
    	slPrint("Sample program 3.2" , slLocate(9,2));
    
    	while(-1){
    		slPushMatrix();
    		{
    			slRotY(tmp);
    			slRotX(DEGtoANG(15.0));
    			slRotZ(DEGtoANG(15.0));
    			slCalcPoint(toFIXED(0.0),toFIXED(0.0),toFIXED(1.0),light);
    		}
    		slPopMatrix();
    		slLight(light);
    		tmp += DEGtoANG(1.0);
    
    		slPushMatrix();
    		{
    			slTranslate(pos[X] , pos[Y] , pos[Z]);
    			slRotX(ang[X]);
    			slRotY(ang[Y]);
    			slRotZ(ang[Z]);
    			slPutPolygon(&PD_PLANE1);
    		}
    		slPopMatrix();
    
    		slSynch();
    	}
    }
    

    フロー3-1 sample_3_2:光源移動フローチャート

    付記 本章に登場したSGLライブラリ関数

     本章では、次表の関数を解説しました。

    表3-1 本章に登場したSGLライブラリ関数
     関数型  関数名  パラメータ  機 能 
    voidslLightVECTOR light光源ベクトルの設定
    BoolslPushUintMatrixvoid単位行列をスタックに確保
    voidslUintMatrixMATRIX mptrt指定マトリクスを単位行列にする


  • 戻る進む
    SGL User's ManualPROGRAMMER'S TUTORIAL
    Copyright SEGA ENTERPRISES, LTD., 1997