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

4.座標変換


 本章では、3Dグラフィックスの基礎となる考え方とそれを実現するサブルーチンについて説明します。 また、本章では主に座標変換と呼ばれる数学的手法を用いて話を進めていきます。行列式の演算など、 通常とは少し異なる手法を多用しますので読解が困難とは思いますが、3Dグラフィックスの基礎となる部分ですので、 何度も読んで理解するようにしてください。
 3Dグラフィックスによって映し出されるオブジェクトは、おおむね次の4つによって定義されます。

 この4つを組み合わせることによって、3Dグラフィックスはモニターに映像を映し出すことが可能になります。 そこで本章では、ビューイング変換を除いた3つを順に説明し、その後で更に詳しい説明を付け加えていくことにします。

4-1. 座標系

 セガサターンでは、一般に右手座標系と呼ばれる3D座標系を採用しています。これは、画面奥にZ軸の正方向を据えたとき、 Y軸の正方向を画面下方、X軸の正方向を画面右とする座標系を指します。また、回転の方向は軸に対して右向き(時計回り) が正方向となります。

<図4-1 セガサターンが用いる座標系>

 またこれとは別にSGLには、TVモニターと画面モード(解像度)に対応した画面座標と呼ばれる2D座標系が存在します。 これは、主にスクロールやスプライトなど、2Dグラフィックスを扱うのに使用しますが、 “4-5 ウィンドウ”でウィンドウを設定するときにも使用します。

<図4-2 画面座標系>

4-2. 投影変換

 座標がどのように画面に現れるかを解説し、投影の設定法について説明します。

透視投影
 ここでは、変換の基礎となる透視投影について説明します。まず最初に視点を設定し、 その視点の延長線上に視線と垂直に置かれた立方体がある場合の投影結果を下図に示します。

<図4-3 投影の考え方>

 透視投影において、映像は投影面と呼ばれる平面に対する写像として定義されます。投影面とは、 影絵を映し出すスクリーンのようなものだと考えてください。
視点とオブジェクトの点を結ぶ線分と、投影面の交わるところに、オブジェクトの点は描画されます。 空間内のオブジェクトの点全てにこの操作を行うことで、始めて空間は投影面に描画されます。

図4-4 SGLにおける投影面

 SGLにおける投影面とは、つまりTVモニターを指します。仮想3D空間に配置された オブジェクト群は透視投影された後、画面座標系への写像が行われ、TVモニターに描画されます。

ビューイングボリューム

 投影面に投影される範囲をビューイングボリュームと言います。
SGLの場合、このビューイングボリュームを制御するパラメータとして画角と表示レベル というものがあります。
ここでは、それら2つを紹介していきます。

1)画角
パースとは視点を原点として左右方向にどれくらいの広がりを持った映像を投影面に投影するかを決定するパラメータです。
この値を大きくすると、投影面に投影されるオブジェクトの密度が高くなり、ちょうど魚眼レンズで覗いたような映像になります。
なお、上下方向の広がりは、画角値と画面モードによる解像度とによって決定されます。

<図4-5 画角イメージモデル>

SGL上で透視投影の設定を変更するには、関数“slPerspective”を使用してください。

【void slPerspective ( ANGLE perspective_angle) ;】
この関数のパラメータを変化させることにより、投影面に投影する空間領域を制御することができます。
パラメータには、投影する空間領域を決定する角値(10<angle<160)を代入します。この値の範囲を逸脱するとオーバーフローしてしまいます。

<図4-6 画角値による映像の差異>

2)表示レベル
表示レベルとは、投影面の後方、どの程度のレベルまでを投影面に投影するかを決定するためのパラメータです。
投影面後方のオブジェクトも、投影面奥の映像と同様の手法で投影面に投影されます。

表示レベルの設定は、関数“slZdspLevel”で行います。
表示レベルは、視点と投影面の分割点のどの位置からを投影するかで決定されます。

【void slZdspLevel ( Uint16 level) ;】
ビューイングボリュームの表示レベルを決定します。
パラメータには、表示レベルに応じて下表の値を代入します。

表4-1 表示レベル代入値(level)
 表示レベル
1/21/41/8
代入値

下図は、表示レベルのイメージモデルです。

図4-7 表示レベル

次のリスト4-1は、画面中央に立方体を配し、パースペクティブパラメータである画角値を20〜160度の間で変化させることにより、立方体がどのように見えるかを示したものです。

リスト4-1 sample_4_2:パースによる映像の変化

/*----------------------------------------------------------------------*/
/*	Perspective Control						*/
/*----------------------------------------------------------------------*/
#include "sgl.h"

extern	PDATA PD_CUBE;

void ss_main(void){
	static ANGLE	ang[XYZ];
	static ANGLE	angper[XYZ];
	static FIXED	pos[XYZ];
	static ANGLE	tmp = DEGtoANG(90.0);
	static ANGLE	adang = DEGtoANG(0.5);

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

	ang[X] = DEGtoANG(30.0);
	ang[Y] = DEGtoANG(45.0);
	ang[Z] = DEGtoANG( 0.0);
	pos[X] = toFIXED(50.0);
	pos[Y] = toFIXED(40.0);
	pos[Z] = toFIXED(20.0);

	slPrint("Perspective : " , slLocate(4,5));
	while(-1){
		slPerspective(tmp);
		slPrintHex(slAng2Dec(tmp) , slLocate(18,5));

		tmp += adang;
		if (tmp > DEGtoANG(160.0)) 
			adang = DEGtoANG(-0.5);
		if (tmp < DEGtoANG(20.0))
			adang = DEGtoANG(0.5);

		slPushMatrix();
		{
			FIXED dz;

			dz = slDivFX(slTan(tmp >> 1), toFIXED(170.0));
			slTranslate(pos[X] , pos[Y] , pos[Z] + dz);
			slRotX(ang[X]);
			slRotY(ang[Y]);
			slRotZ(ang[Z]);
			slPutPolygon(&PD_CUBE);
		}
		slPopMatrix();

		slSynch();
	}
}

フロー4-1 sample_4_2:パースによる映像変化のフローチャート

4-3. モデリング変換

 ここでは空間内のオブジェクトの配置と変換について説明します。オブジェクトに対する変換には、移動、回転、拡大縮小の3種類があります。
これを用いることにより、オブジェクトを自由に配置することができます。
では、次に各変換操作を順にサンプルプログラムとともに解説していきます。

<図4-8 オブジェクトに対する各種変換操作>

注)角度及び変数は便宜上、度数表示とフローティングで示してあります。

オブジェクトの回転

 空間内でオブジェクトを回転させるには、ライブラリ関数“slRotX,slRotY,slRotZ”を用います。それぞれ関数名末尾の座標軸に対応した回転を制御します。
オブジェクトの回転は、回転マトリクスと呼ばれる変換行列をオブジェクトの各頂点座標に掛け合わせることで実現されます。

【void slRotX ( ANGLE angx ) ;】
オブジェクトにX軸回りの回転を加えます。パラメータには回転角値を代入します。

【void slRotY ( ANGLE angy ) ;】
オブジェクトにY軸回りの回転を加えます。パラメータには回転角値を代入します。

【void slRotZ ( ANGLE angz ) ;】
オブジェクトにZ軸回りの回転を加えます。パラメータには回転角値を代入します。

次のリスト 4-2 は、第2章のリスト2-1 で描画した正方形ポリゴンをライブラリ関数“slRotY”を用いてY軸で回転させる(単軸回転)プログラムです。回転マトリクスは次式で表されます。

<リスト4-2 sample_4_3_1:正方形ポリゴン単軸回転ルーチン>

/*----------------------------------------------------------------------*/
/*	Rotation of 1 Polygon [Y axis]					*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"

extern PDATA PD_PLANE1;

void ss_main(void)
{
	static ANGLE	ang[XYZ];
	static FIXED	pos[XYZ];

	slInitSystem(TV_320x224,NULL,1);
	slPrint("Sample program 4.3.1" , slLocate(9,2));

	ang[X] = ang[Y] = ang[Z] = DEGtoANG(0.0);
	pos[X] = toFIXED( 0.0);
	pos[Y] = toFIXED( 0.0);
	pos[Z] = toFIXED(220.0);

	while(-1){
		slPushMatrix();
		{
			slTranslate(pos[X] , pos[Y] , pos[Z]);
			slRotX(ang[X]);
			slRotY(ang[Y]);
			slRotZ(ang[Z]);
			ang[Y] += DEGtoANG(5.0);
			slPutPolygon(&PD_PLANE1);
		}
		slPopMatrix();

		slSynch();
	}
}

フロー4-2 sample_4_3_1:正方形ポリゴン単軸回転ルーチンフローチャート

次にあげるリスト 4-3 は、2軸回転を実現するためのプログラムです。正方形ポリゴンをX軸とY軸の2軸で回転させます。
単軸回転、2軸回転、あるいは3軸回転においても実際に行う操作は同一です。各軸に対応した回転操作関数の角値を操作することで、オブジェクトは回転を加えられた状態で描画されます。

リスト4-3 sample_4_3_2:正方形ポリゴン2軸回転ルーチン

/*----------------------------------------------------------------------*/
/*	Rotation of 1 Polygon [X & Y axis]				*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"

extern PDATA PD_PLANE1;

void ss_main(void)
{
	static ANGLE	ang[XYZ];
	static FIXED	pos[XYZ];

	slInitSystem(TV_320x224,NULL,1);
	slPrint("Sample program 4.3.2" , slLocate(9,2));

	ang[X] = ang[Y] = ang[Z] = DEGtoANG(0.0);
	pos[X] = toFIXED(  0.0);
	pos[Y] = toFIXED(  0.0);
	pos[Z] = toFIXED(220.0);

	while(-1){
		slPushMatrix();
		{
			slTranslate(pos[X] , pos[Y] , pos[Z]);
			slRotX(ang[X]);
			slRotY(ang[Y]);
			slRotZ(ang[Z]);
			ang[X] += DEGtoANG(4.0);
			ang[Y] += DEGtoANG(2.0);
			slPutPolygon(&PD_PLANE1);
		}
		slPopMatrix();

		slSynch();
	}
}

オブジェクトの移動

 SGLで空間内のオブジェクトを移動させるには、ライブラリ関数“slTranslate”を用います。
パラメータとして現地点からのXYZ各軸に対する移動量を代入することで、3D空間内の任意の座標にオブジェクトを表示させることができます。

【void slTranslate ( FIXED tx , ty , tz ) ;】
オブジェクトを指定された座標に移動させ表示します。
パラメータには、定義座標または現地点からのXYZ各軸に対する移動量をそれぞれ代入します。

次のリスト 4-4 は、ライブラリ関数“slTranslate”を用いて、X軸に対して平行な移動を実現しています。移動パラメータの制御には、Sin値を使用しています。角値tmpの変化がX座標値の変化を制御します。
“slTranslate”による平行移動は次式で表されます。

リスト4-4 sample_4_3_3:正方形ポリゴン平行移動ルーチン

/*----------------------------------------------------------------------*/
/*	Parallel Translation of 1 Polygon [X axis]			*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"

#define		POS_Z		50.0

extern PDATA PD_PLANE1;

void ss_main(void)
{
	static ANGLE	ang[XYZ];
	static FIXED	pos[XYZ];
	static ANGLE	tmp = DEGtoANG(0.0);

	slInitSystem(TV_320x224,NULL,1);
	slPrint("Sample program 4.3.3" , slLocate(9,2));

	ang[X] = ang[Y] = ang[Z] = DEGtoANG(0.0);
	pos[X] = toFIXED(  0.0);
	pos[Y] = toFIXED(  0.0);
	pos[Z] = toFIXED(220.0);

	while(-1){
		slPushMatrix();
		{
			slTranslate(pos[X] , pos[Y] , pos[Z]);
			slRotX(ang[X]);
			slRotY(ang[Y]);
			slRotZ(ang[Z]);
			tmp += DEGtoANG(5.0);
			pos[X] = slMulFX(toFIXED(POS_Z), slSin(tmp));
			slPutPolygon(&PD_PLANE1);
		}
		slPopMatrix();

		slSynch();
	}
}

<フロー4-3 sample_4_3_3:正方形ポリゴン平行移動フローチャート>

オブジェクトの拡大縮小

SGLで空間内のオブジェクトを拡大縮小させるには、ライブラリ関数“slScale”を用います。パラメータは、各軸方向のスケール比率として渡されます。

【void slScale ( FIXED sx , sy , sz ) ;】
オブジェクトを各軸単位でスケーリングして表示します。
パラメーターには、XYZ軸それぞれの軸方向に対するスケール値(任意倍率)を代入してください。
オブジェクトは、スケール値によって下表のように変化します。

表4-2 スケール値によるオブジェクトの変化
パラメータ範囲
scale<0.0scale=0.00.0<scale<1.0scale=1.01.0<scale
変換結果鏡像消失縮小等倍拡大

注)”scale”はスケールパラメータを指します。

スケール値によるオブジェクトの変化

スケール値が0.0の場合、オブジェクトはスケール指定された軸方向に対する厚みが無いものとして描画されます。
また、0.0未満の負の値の場合、オブジェクトはスケール指定された軸方向に対する鏡像として描画されます

次のリスト 4-5 は、拡大縮小を実現するプログラムです。正方形ポリゴンのX軸方向、Y軸方向のスケール比を変化させています。

リスト4-5 sample_4_3_4:正方形ポリゴン拡大縮小ルーチン

/*----------------------------------------------------------------------*/
/*	Expansion & Reduction of 1 Polygon [X & Y axis]			*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"

extern PDATA PD_PLANE1;

void ss_main(void)
{
	static ANGLE	ang[XYZ];
	static FIXED	pos[XYZ];
	static FIXED	sclx, scly, sclz, tmp = toFIXED(0.0);
	static Sint16	flag = 1;

	slInitSystem(TV_320x224,NULL,1);
	slPrint("Sample program 4.3.4" , slLocate(9,2));

	ang[X] = ang[Y] = ang[Z] = DEGtoANG(0.0);
	pos[X] = toFIXED(  0.0);
	pos[Y] = toFIXED(  0.0);
	pos[Z] = toFIXED(220.0);
	sclx = scly = sclz = toFIXED(1.0);

	while(-1){
		slPushMatrix();
		{
			slTranslate(pos[X] , pos[Y] , pos[Z]);
			slRotX(ang[X]);
			slRotY(ang[Y]);
			slRotZ(ang[Z]);
			if (flag == 1) tmp += toFIXED(0.1);
			else tmp -= toFIXED(0.1);
			if (tmp > toFIXED( 1.0)) flag = 0;
			if (tmp < toFIXED(-1.0)) flag = 1;
			slScale(sclx + tmp , scly - tmp , sclz);
			slPutPolygon(&PD_PLANE1);
		}
		slPopMatrix();

		slSynch();
	}
}

<フロー4-4 sample_4_3_4:正方形ポリゴン拡大縮小フローチャート>

特殊なモデリング変換

 ここで、少し特殊なモデリング変換操作を行うライブラリ関数を紹介します。ここに紹介するのは、いずれもオブジェクトデータに回転操作を加えるものですが、パラメータの設定が前述した回転操作用ライブラリ関数と異なります。

【void slRotXSC ( FIXED sin , FIXED cos ) ;】

正弦値、余弦値を代入してX軸回りの回転を加えます。
パラメータには、それぞれSin値、Cos値をFIXED型の数値で代入します。

【void slRotYSC ( FIXED sin , FIXED cos ) ;】

正弦値、余弦値を代入してY軸回りの回転を加えます
パラメータには、それぞれSin値、Cos値をFIXED型の数値で代入します。

【void slRotZSC ( FIXED sin , FIXED cos ) ;】

正弦値、余弦値を代入してZ軸回りの回転を加えます。
パラメータには、それぞれSin値、Cos値をFIXED型の数値で代入します。

【void slRotAX ( VECTOR vx , vy , vz , ANGLE anga ) ;】

原点を通る任意軸回りの回転を加えます(軸単位はベクトル値として指定)。
パラメータには、回転軸を表す単位ベクトル値(XYZ)及び回転角値を代入します。
回転軸を表すベクトル値は、常に単位ベクトルとなるような値を代入してください。
単位ベクトルとは、常に大きさが1となるようなベクトルを指します。

変換順序による結果の相違

 3Dグラフィックスの場合、モデリング変換に代表される各種変換は、マトリクスと呼ばれる変換行列を用いて行われます。そのため、変換の順序を理解した上で変換操作を行わないと、意図したものとは異なった結果でオブジェクトが描画されることがあります 。次の図はともに回転、移動の変換操作を行ったものですが、変換順序が異なるため、最終的な描画結果は大きく異なっています。

<図4-9 変換順序による結果の相違>

注)角度及び変数は便宜上、度数表示とフローティングで示してあります。

4-4. クリッピング

 表示領域(実際に投影面に投影される領域)からはみ出した部分を取り去り、非表示にすることをクリッピングといいます。SGLではこの観念を利用して、投影面に対しウィンドウというものを設定することができます。 そこで最初にクリッピングの概念を説明し、次にSGL上でのウィンドウ設定の実際を解説していきます。

2Dクリッピング

 最初にクリッピングの概念を、2Dグラフィックスの例で説明していきます。2Dグラフィックスの場合、区切られた矩形領域の内と外で表示・非表示を切り替えます。
下図の例では、矩形領域として与えられた表示領域の内外に表示すべきオブジェクトが配置された場合の表示例を示したものです。

<図4-10 2Dクリッピングの例>

注)クリッピング境界によって閉じられた投影面を表示領域とした場合

上図のように、クリッピングの対象となったオブジェクトはクリッピング領域の内外で表示・非表示を切り替えられます。この例の場合、1つのオブジェクトがクリッピング領域の双方にかかった場合、オブジェクトの一部(領域内)が表示され、一部(領域外)が表示 されないようになっています。

注意
場合により、計算速度、描画速度の問題から、1つのオブジェクトがクリッピング領域に含まれる割合によって、表示・非表示が切り替えられることもあります。

3Dクリッピング

 3Dグラフィックスでは通常、透視変換マトリクスで視野ピラミッドを決定し、このピラミッド内を表示領域、ピラミッド外を非表示領域として定義します。表示領域内のオブジェクトは投影面に投影され、モニターに映し出されます。
この視野ピラミッドは、次の6平面によって囲まれた閉空間(ビューイングボリューム)によってクリッピングされます。

視野の左側面:クリッピング平面(画角値により決定)
視野の右側面:クリッピング平面(画角値により決定)
視野の上面 :クリッピング平面(画角値及び画面モードにより決定)
視野の下面 :クリッピング平面(画角値及び画面モードにより決定)
視野の前面 :前方限界面(関数“slZdspLevel”で決定)
視野の後面 :後方限界面(関数“slWindow”中のパラメータ“Zlimit”で決定)

 SGLの場合これに加えて、さらにクリップ平面を追加することが可能です(詳細は“4.5 項:ウィンドウ”参照)。

図4-11 3Dクリッピングによる表示領域の定義

図4-12 3Dクリッピングの例

4-5. ウィンドウ

 SGLでは、クリッピングの概念を使用して、ウィンドウと呼ばれる表示制限のための矩形領域を、投影面に対して設定することができます。オブジェクトは、この領域の内と外で表示・非表示を切り替えることができます。
ウィンドウは1画面中に最大2面まで保持することが可能です。この内の1面は、デフォルトウィンドウとして最初から設定してあります。このウィンドウは投影面(TVモニター)と同サイズであり、プログラム中での再設定も可能です。

ウィンドウの概念

 SGLではウィンドウは、下図のように定義されます。

<図4-13 ウィンドウの概念>

 SGLでは、ウィンドウは投影面中の矩形領域として定義されます。これを3次元的に解釈すれば、ビューイングボリューム中、投影面の矩形領域に投影されるべき領域のことを指します(図中:濃い網掛け部)。ウィンドウ領域を指定することにより、この内外 でオブジェクトの表示・非表示を決定するわけです。
ウィンドウ・サイズは、最大で、投影面と同サイズまで設定できます。

SGLにおけるウィンドウ設定

 SGLでウィンドウを実際に設定するためには、ライブラリ関数“slWindow”を用います。またSGLは、初期状態(slWindowを使用しない状態)で、すでに投影面と同サイズの再設定可能なデフォルトウィンドウをセットしています。

【void slWindow ( left , top , right , bottom , Zlimit , CENTER_X , CENTER_Y ) ;】
ライブラリ関数slWindowは、投影面にウィンドウ領域を設定します。各パラメータは、投影面におけるウィンドウの左上・右下の画面座標、後方限界座標、視線方向を決定する画面座標をそれぞれセットします。各パラメータを図説したものが下図になります。

図4-14 “slWindow”におけるパラメータの意味

注)left , top , right , bottom , CENTER_X , CENTER_Y は、モニターに対するXY座標値を示します。

 ライブラリ関数“slWindow”のパラメータは、次のように定義されます。

【Sint16 left , top , right , bottom】
ウィンドウの投影面(モニター)に対する左上・右下の画面座標値をそれぞれ示します。
値の範囲は画面モードによって異なります(最大値は、画面モードによる解像度フルサイズ)。
デフォルト・ウィンドウでは、ウィンドウサイズとモニターサイズが同じに設定されています(最大値)。

【Zlimit】
ウィンドウの投影限界値を指定します。
投影限界値とは、関数“slZdspLevel”で指定された前方限界面からどの程度の奥行きを持った空間を、実際に投影面に投影するかを決定するためのパラメータです(後方限界面の指定)。
“Zlimit = -1”が代入された場合、直前にセットされたウィンドウのZlimit値が使用されます。
以前にウィンドウがセットされていない場合は、デフォルトウィンドウの値(7FFF)が使用されます。

【CENTER_X , CENTER_Y】
視線方向を決定するものでパラメータは画面座標値として表されます。この値を変化させることにより、遠方のオブジェクト群が画面のどこに収束するかを決定できるわけです。
この点を3Dグラフィックスの世界では一般的に「消失点」と呼びます。
デフォルトウィンドウでは、「消失点」は画面の中心に設定されています。

画面座標について

 画面座標とは、投影面であるTVモニターに対応した2D座標系です。
左上を原点とし、X軸は右方、Y軸は下方をそれぞれ正方向とします。値の範囲は画面モードによって異なりますが、通常(横:320×縦:224)で表現されます。

図4-15 CENTER_X、CENTER_Yによる映像の差異

注)オブジェクト、視点などの条件はa)b)ともに同じ

デフォルトウィンドウの再設定

 何らかの理由でデフォルトウィンドウを書き換えた後、再びデフォルトウィンドウを設定する場合は、ライブラリ関数“slWindow”に次の値を入れてください。
ただし、下図の例では、画面サイズは(横320×縦224)であると仮定します。

図4-16 デフォルトウィンドウの再設定
●画面モード(横320×縦240)の場合

slWindow(0,0,319,223,0x7FFF,160,112); | | | | | 消失点座標値:画面中心 | Zlimit ウィンドウ範囲指示座標値

 デフォルトウィンドウとは、つまりはモニターと同サイズのウィンドウを指します。
ウィンドウサイズはモニターと同サイズ(画面モードによって値は変化)、後方限界座標値は“0x7FFF”、消失点はモニター中央にセットされます。

サンプルプログラム

 下図は、ウィンドウを利用したサンプルプログラム“sample_4_5”によるオブジェクトの表示例です。 オブジェクト 1 を長方形の板ポリゴン、オブジェクト 2 を立方体ポリゴンとし、あるZ座標で、お互いが交差するように配置してあります。
これに、ライブラリ関数“slWindow”を用いてウィンドウをセットした場合の表示が、下図中のd)です。 オブジェクト 1 はウィンドウ領域外で表示、オブジェクト 2 はウィンドウ領域内で表示するように設定されています(この設定については後述)。

図4-17 ウィンドウを利用したオブジェクト表示例

注1)オブジェクト1 は、ウィンドウ外で表示
注2)オブジェクト2 は、ウィンドウ内で表示

 SGLでは、ウィンドウの内外でオブジェクトの表示・非表示を切り替えることができます。この切り替えは、ポリゴンの属性として1ポリゴン面単位で設定可能です。
詳細は“第7章: ポリゴンの面属性”に譲りますが、ここでは、サンプルプログラムで用いたデータファイル“polygon.c”中でポリゴンの面属性に該当する部分を紹介しておきます。

リスト4-7 polygon.c:ウィンドウ表示に関わるポリゴン属性
/* 前略 */

ATTR attribute_PLANE[] = {
	ATTRIBUTE(Single_Plane, SORT_MIN, No_Texture, C_RGB(16,16,16), No_Gouraud, MESHoff|Window_Out, sprPolygon,No_Option),
	ATTRIBUTE(Single_Plane, SORT_MIN, No_Texture, C_RGB(00,31,31), No_Gouraud, MESHoff|Window_Out, sprPolygon,No_Option),
};

ATTR attribute_CUBE[] = {
	ATTRIBUTE(Single_Plane, SORT_MIN, No_Texture, C_RGB(31,31,31), No_Gouraud, MESHoff|Window_In, sprPolygon,No_Option),
	ATTRIBUTE(Single_Plane, SORT_MIN, No_Texture, C_RGB(31,00,00), No_Gouraud, MESHoff|Window_In, sprPolygon,No_Option),
	ATTRIBUTE(Single_Plane, SORT_MIN, No_Texture, C_RGB(00,31,00), No_Gouraud, MESHoff|Window_In, sprPolygon,No_Option),
	ATTRIBUTE(Single_Plane, SORT_MIN, No_Texture, C_RGB(00,00,31), No_Gouraud, MESHoff|Window_In, sprPolygon,No_Option),
	ATTRIBUTE(Single_Plane, SORT_MIN, No_Texture, C_RGB(31,31,00), No_Gouraud, MESHoff|Window_In, sprPolygon,No_Option),
	ATTRIBUTE(Single_Plane, SORT_MIN, No_Texture, C_RGB(00,31,31), No_Gouraud, MESHoff|Window_In, sprPolygon,No_Option),
};

/* 後略 */

ウィンドウによる影響範囲

 関数“slWindow ”は、1フレーム中に2つしか使用できません。
関数“slPutPolygon”、“slPutSprite”等を呼び出すと、その時点で1つ目のウィンドウが使用され、それ以降ではあと1回しか“slWindow”を呼び出せません。
(前記関数を呼び出すとデフォルトウィンドウの設定が変わります)

ウィンドウの設定は、同時に一つしか作用しません。 また、関数“slWindow”を呼び出すと、それ以前のポリゴン(スプライト)とそれ以降のものとはプライオリティが切り離され、この場合、後のものが常に優先されます。

リスト4-8 ウィンドウ設定の影響範囲
		:			/* ウィンド1(デフォルト) */
	slPutPolygon(object1);
		:
	slPutPolygon(object2);
		:
slWindow(.....);	←
		:			/* ウィンド2 */
	slPutPolygon(object3);
		:
slWindow(.....);	←エラー
		:			/* ウィンド2のまま */
	slPutPolygon(object4);
		:
	slPutPolygon(object5);
		:

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

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

表4-3 本章に登場したSGLライブラリ関数
 関数型 
 関数名 
 パラメータ 
      機  能      
voidslPerspectiveANGLE angp 透視変換テーブルの諸設定
voidslRotX ANGLE angx ポリゴンデータのX軸回りの回転
voidslRotY ANGLE angy ポリゴンデータのY軸回りの回転
voidslRotZ ANGLE angz ポリゴンデータのZ軸回りの回転
voidslRotXSC FIXED sn,FIXED cs Sin,Cosを指定してX軸回りの回転
voidslRotYSC FIXED sn,FIXED cs Sin,Cosを指定してY軸回りの回転
voidslRotZSC FIXED sn,FIXED cs Sin,Cosを指定してZ軸回りの回転
voidslRotAX FIXED vx,vy,cz,ANGLE a 原点を通過する任意軸回りの回転(軸単位:ベクトル)
voidslScale FIXED sx,sy,sz ポリゴンデータの拡大縮小
voidslWindow lft,top,rgt,btm,Zlimit,CNTX,CNTY ウィンド設定
voidslZdspLevel level ビューイングボリュームの表示レベル指定


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