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

デモプログラムA

Bounding Cube


 ここで、現在までの流れを総括する意味で、現在までに登場した関数群を用いた、ポリゴンを表示する少し複雑なプログラムを紹介します。

 これまでに、次のことについて解説してきました。
描画          :ポリゴンの定義 (第2章)
光源          : 光源の設定と光源によるポリゴン面の変化 (第3章)
座標系        :セガサターンにおける座標系 (第4章)
モデリング変換:オブジェクトの回転、移動、拡大縮小など (第4章)
描画領域      :ウィンドウ及びクリッピング(第4章)

 これらは、3Dグラフィックスにおいて、ハードウェアによらず、比較的共通した考え方です(もちろん使用する関数は異なりますが・・・)。
これらを理解した上で、次章以降を読み進めてください。
次章以降は、セガサターン特有の考え方や特殊な機能の説明が主となります。

 デモプログラム“demo_A”は、描画から座標変換までに登場したSGLライブラリ関数を複合的に使用したものです。
デモでは、全ての面が内側を向いた(外側から見た場合描画されない)立方体ポリゴンで表現された部屋の中を、小さな立方体ポリゴンが跳ね回るというものです。
部屋と小さな立方体との衝突判定は、簡単な条件分岐(XYZ座標値)で処理してあります。

図 A-1 デモAの動作イメージ


リスト A-1 demo_A:デモプログラムA

/*----------------------------------------------------------------------*/
/*	Cube Action							*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"

#define		REFLECT_EXTENT		toFIXED(85.0)
#define		XSPD			toFIXED(1.5)
#define		YSPD			toFIXED(2.0)
#define		ZSPD			toFIXED(3.0)

extern PDATA PD_PLANE1, PD_PLANE2;

void ss_main(void)
{
	static ANGLE ang1[XYZ], ang2[XYZ];
	static FIXED pos1[XYZ], pos2[XYZ], delta[XYZ], light[XYZ];

	slInitSystem(TV_320x224, NULL, 1);
	slPrint("demo A", slLocate(9,2));

	ang1[X] = ang1[Y] = ang1[Z] = DEGtoANG(0.0);
	ang2[X] = ang2[Y] = ang2[Z] = DEGtoANG(0.0);
	pos1[X] = pos2[X] = toFIXED(  0.0);
	pos1[Y] = pos2[Y] = toFIXED(  0.0);
	pos1[Z] = pos2[Z] = toFIXED(100.0);
	delta[X] = XSPD, delta[Y] = YSPD, delta[Z] = ZSPD;
	light[X] = slSin(DEGtoANG( 30.0));
	light[Y] = slCos(DEGtoANG( 30.0));
	light[Z] = slSin(DEGtoANG(-30.0));

	while(-1){
		slLight(light);
		slPushMatrix();
		{
			slTranslate(pos1[X], pos1[Y], pos1[Z] + toFIXED(270.0));

			pos1[X] += delta[X];
			pos1[Y] += delta[Y];
			pos1[Z] += delta[Z];

			if(pos1[X] > REFLECT_EXTENT){
				delta[X] = -XSPD, pos1[X] -= XSPD;
			} else if(pos1[X] < -REFLECT_EXTENT){
				delta[X] = XSPD, pos1[X] += XSPD;
			}
			if(pos1[Y] > REFLECT_EXTENT){
				delta[Y] = -YSPD, pos1[Y] -= YSPD;
			} else if(pos1[Y] < -REFLECT_EXTENT){
				delta[Y] = YSPD, pos1[Y] += YSPD;
			}
			if(pos1[Z] > REFLECT_EXTENT){
				delta[Z] = -ZSPD, pos1[Z] -= ZSPD;
			} else if(pos1[Z] < -REFLECT_EXTENT){
				delta[Z] = ZSPD, pos1[Z] += ZSPD;
			}

			slRotX(ang1[X]);
			slRotY(ang1[Y]);
			slRotZ(ang1[Z]);
			ang1[X] += DEGtoANG(3.0);
			ang1[Y] += DEGtoANG(5.0);
			ang1[Z] += DEGtoANG(3.0);
			slPutPolygon(&PD_PLANE1);
		}
		slPopMatrix();
		
		slPushMatrix();
		{
			slTranslate(pos2[X], pos2[Y], pos2[Z] + toFIXED(170.0));
			slRotY(ang2[Y]);
			slRotX(ang2[X]);
			slRotZ(ang2[Z]);
			slPutPolygon(&PD_PLANE2);
		}
		slPopMatrix();

		slSynch();
	}
}

フロー A-1 sample_1_6:デモプログラムAのフローチャート


 次章からは、階層マトリクスを始め、更に踏み入った内容の解説を行います。
特にスタックを用いた階層構造の考え方は3Dグラフィックスにおいて重要なファクターですので、熟読し、あるいは専門書なども参考にして、理解するようにしてください。


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