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

5.マトリクス


 本章では、3Dグラフィックスを構築する際に基本となるマトリクスについて説明します。
前半ではマトリクス演算とその考え方を解説し、後半ではスタックマトリクスを用いた階層構造によるオブジェクトの構築を解説します。
特にマトリクスの階層構造は、セガサターンによる3Dグラフィックス表現において重要な要素となりますので、よく読んで理解してください。

5-1. マトリクス

 マトリクスは、行列とも呼ばれます。これは、単体の数字同士の演算とは異なり、 数字の群を、一つのまとまりとして扱うための概念です。

 マトリクスはn行×m列の数字の群で、通常の数値演算とは異なりますが、行列同士の 四則演算も可能です(詳細は、専門書などを参考にしてください)。
下図は、2行×2列マトリクス同士の掛け算の例です。
SGLの場合、3D空間を正確に表現するために、マトリクス変数として4行×3列 マトリクスを用います(XYZ座標値及び各種変換操作を実現するため)。

<図5-1 マトリクスの一般的な概念と演算例>

注)
 M11〜M22、T11〜T22は、通常の変数

 “第4章 座標変換”で解説したモデリング変換も、実際はマトリクス として表されたポリゴン頂点データ列に各種変換マトリクス(回転、移動、スケールなど) を掛け合わせて、新しいポリゴン頂点データ列を作成したものです。

5-2. 階層構造によるオブジェクト表現

 本項目で解説するのは、スタックを利用したマトリクスによるオブジェクトの階層構造表現 です。これは、簡単に言うならば、複数のオブジェクト間に関係性を持たせるということになり ます。この関係性を、一般に親子構造と呼びます。

スタック

 スタックとは、マトリクスを効率よく扱うための構造モデルです。これは図 5-2 のように表され、この操作を行うための関数が“slPushMatrix”と“slPopMatrix”です。
また、スタック中で最も下位レベルに存在するマトリクスをカレントマトリクスと呼び、 各種マトリクス変換操作はカレントマトリクスに対して行われます。

【Bool slPushMatrix ( void ) ;】
 現在のカレントマトリクスを下位のスタックにコピーし、カレントマトリクスも同時に下位レベルに移動させます。マトリクスの一時保存に用います。

【Bool slPopMatrix ( void ) ;】
 一時保存された上位のマトリクスを復帰させ、カレントマトリクスを上位レベルに移動させます。

 下位スタックのマトリクスは放棄されます。

<図5-2 スタックイメージモデル>

注)
 スタックは20個から構成され、マトリクスは上位スタックから下位スタックに順々 にネストされます。

 SGLは、マトリクス環境が初期化された状態において、環境マトリクスと呼ばれる マトリクスをカレントマトリクスとして保持しています。
 これは、SGLの3D座標環境の根本を定義するもので、これを書き換えてしまった場合、 各種変換操作が正しく行われなくなる可能性があります。
そこでSGLでは、スタック及び各種マトリクス変数を初期化するライブラリ関数として “slInitMatrix”をサポートしています。

【void slInitMatrix ( void )】
 スタック及びマトリクス変数の初期化を行います。この時、カレントマトリクスとして 環境マトリクスがスタックに確保されます。

階層構造の概念

 図 5-3 は、階層構造を与えられたオブジェクト群のイメージモデルです。object1を階層 の最も浅いレベルに設定し、object2、object3をそれぞれ続くレベルに定義してあります。

<図5-3 階層構造のイメージモデル>

 階層構造を用いた場合、オブジェクトは図 5-3 のような動作を示します。 図 5-45-5 は、階層構造を用いないオブジェクト群 と階層構造を用いたオブジェクト群とに、同じ変換を施した際の結果を表したものです (各オブジェクトにX方向への平行移動を掛ける)。

<図5-4 階層構造を用いないオブジェクトの移動例>

<図5-5 階層構造を用いたオブジェクトの変換例>

セガサターンによる階層構造の定義

 次に、サンプルプログラムを参考にして、セガサターンで階層構造を実現するための方法 を説明します。

リスト5-1 sample_5_2:階層マトリクス定義
/*----------------------------------------------------------------------*/
/*	Double Cube Circle Action					*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"

#define		DISTANCE_R1		40
#define		DISTANCE_R2		40

extern PDATA PD_CUBE;

static void set_star(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];
	static FIXED	pos1[XYZ] , pos2[XYZ];
	static ANGLE	tmp = DEGtoANG(0.0);

	slInitSystem(TV_320x224,NULL,1);
	slPrint("Sample program 5.2" , slLocate(6,2));

	ang1[X] = ang2[X] = DEGtoANG(30.0);
	ang1[Y] = ang2[Y] = DEGtoANG(45.0);
	ang1[Z] = ang2[Z] = DEGtoANG( 0.0);

	pos2[X] = toFIXED(DISTANCE_R2);
	pos2[Y] = toFIXED(0.0);
	pos2[Z] = toFIXED(0.0);
	while(-1){
		slUnitMatrix(CURRENT);

		slPushMatrix();
		{
			pos1[X] = DISTANCE_R1 * slSin(tmp);
			pos1[Y] = toFIXED(30.0);
			pos1[Z] = toFIXED(220.0) + DISTANCE_R1 * slCos(tmp);
			set_star(ang1 , pos1);
			slPutPolygon(&PD_CUBE);

			slPushMatrix();
			{
				set_star(ang2 , pos2);
				slPutPolygon(&PD_CUBE);
			}
			slPopMatrix();
		}
		slPopMatrix();

		ang1[Y] += DEGtoANG(1.0);
		ang2[Y] -= DEGtoANG(1.0);
		tmp += DEGtoANG(1.0);

		slSynch();
	}
}

フロー5-1 sample_5_2:階層マトリクス定義フローチャート


5-3. マトリクス関数

 SGLでは、マトリクス操作に関わるライブラリ関数として、 前述した以外に次の関数をサポートしています。

【void slLoadMatrix ( MATRIX mtptr )】
 カレントマトリクスにパラメータとして指定したマトリクスをコピーします
。 パラメータには、指定するマトリクスのMATRIX型変数を代入します。

【void slGetMatrix ( MATRIX mtptr )】
 カレントマトリクスをパラメータとして指定されたマトリクスにコピーします。 パラメータには、指定するマトリクスのMATRIX型変数を代入します。

【void slMultiMatrix ( MATRIX mtrx )】
 カレントマトリクスにパラメータとして指定されたマトリクスを掛け合わせます。 パラメータには、指定するマトリクスのMATRIX型変数を代入します。

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

【void slUnitMatrix ( MATRIX mtptr )】
 パラメータとして指定されたマトリクスを単位行列にします。パラメータには、 指定するマトリクスのMATRIX型変数を代入します。
また、パラメータに“CURRENT”が代入された場合に限り、対象マトリクスはカレント マトリクスになり、これによりカレントマトリクスの初期化が行えます。

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

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

表5-1 本章に登場したSGLライブラリ関数
 関数型 
 関数名 
 パラメータ 
      機    能      
voidslLoadMatrix MATRIX mtpr カレントマトリクスに指定マトリクスをコピー
BoolslPushMatrix void マトリクスの一時確保
BoolslPushUintMatrix void 単位行列をスタックに一時確保
voidslGetMatrix MATRIX mtpr カレントマトリクスを指定マトリクスにコピー
voidslInitMatrix void マトリクス変数及びバッファの初期化
voidslMultiMatrix MATRIX mptr カレントマトリクスに指定マトリクスを掛ける
BoolslPopMatrix void 一時保存されたマトリクスの復帰
voidslUintMatrix MATRIX mptr 指定マトリクスを単位行列にする


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