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

デモプログラムB

Matrix Animation


 ここで、階層構造を用いた少し複雑なプログラムを紹介します。

 階層構造は3Dグラフィックス特有の考え方です。これは、3Dグラフィックスの場合、3次元という広大な空間を対象に扱うため、かなり大量のパラメータを一度に扱う事に起因します。特に、3D空間内で複数のオブジェクトに関係性を持たせ一度に動かす場 合など、単純ではあるけれども、かなり煩雑なパラメータ群を一度に取り扱う必要があります。そこで、階層構造という観念が現れたわけです。
階層構造は親子構造とも呼ばれます。階層構造は、関節の表現(人体モデルなど)やオブジェクト群の表現に主に用いられます。

図 B-1 階層構造を用いた関節表現


 デモプログラム“demo_B”は、階層構造を用いたアニメーションを実現するためのサンプルプログラムです。デモでは、3つのオブジェクトに関係性(親子構造)を持たせることで、複雑な動き(関節構造を持ったオブジェクト群のアニメーション)を容易に実現 しています。これは、階層構造という観念を使用しない場合、かなり複雑で煩雑なプログラムとなります。

図 B-2 デモBのイメージモデル


リスト B-1 demo_B:階層構造を用いたアニメーション

/*----------------------------------------------------------------------*/
/*	Matrix Animation						*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"

extern PDATA PD_PLANE1, PD_PLANE2, PD_PLANE3;

static void set_poly(ANGLE ang[XYZ], FIXED pos[XYZ])
{
	slTranslate(pos[X], pos[Y], pos[Z]);
	slRotX(ang[X]);
	slRotY(ang[Y]);
	slRotZ(ang[Z]);
}

void ss_main(void)
{
	static ANGLE ang1[XYZ], ang2[XYZ], ang3[XYZ];
	static FIXED pos1[XYZ], pos2[XYZ], pos3[XYZ];
	static ANGLE tang, aang;

	slInitSystem(TV_320x224,NULL,1);
	slPrint("demo B", slLocate(6,2));

	ang1[X] = ang1[Y] = ang1[Z] = DEGtoANG(0.0);
	ang2[X] = ang2[Y] = ang2[Z] = DEGtoANG(0.0);
	ang3[X] = ang3[Y] = ang3[Z] = DEGtoANG(0.0);
	pos1[X] = toFIXED(  0.0);
	pos1[Y] = toFIXED( 40.0);
	pos1[Z] = toFIXED(170.0);
	pos2[X] = toFIXED(  0.0);
	pos2[Y] = toFIXED(-40.0);
	pos2[Z] = toFIXED(  0.0);
	pos3[X] = toFIXED(  0.0);
	pos3[Y] = toFIXED(-40.0);
	pos3[Z] = toFIXED(  0.0);
	tang = DEGtoANG(0.0);
	aang = DEGtoANG(2.0);

	while(-1) {
		slUnitMatrix(CURRENT);
		ang1[Z] = ang2[Z] = tang;
		tang += aang;
		if(tang < DEGtoANG(-90.0)) {
			aang = DEGtoANG(2.0);
		} else if(tang > DEGtoANG(90.0)) {
			aang = -DEGtoANG(2.0);
		}

		slPushMatrix();
		{
			set_poly(ang1, pos1);
			slPutPolygon(&PD_PLANE1);

			slPushMatrix();
			{
				set_poly(ang2, pos2);
				slPutPolygon(&PD_PLANE2);

				slPushMatrix();
				{
					set_poly(ang3, pos3);
					ang3[Y] += DEGtoANG(5.0);
					slPutPolygon(&PD_PLANE3);
				}
				slPopMatrix();
			}	
			slPopMatrix();
		}
		slPopMatrix();

		slSynch();
	}
}

フロー B-1 demo_B:階層構造フローチャート

 次章以降、ポリゴンの表面属性(プライオリティー、カラー、テクスチャーなど)を中心に、ゲーム開発には必要不可欠な背景スクロール、文字数字の描画、入出力制御、などの解説を行います。


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