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

2.描画


 本章では、3Dグラフィックスの基本概念であるポリゴンの考え方と、SGLにおけるポリゴンの設定法を解説します。

2-1. ポリゴン

 ポリゴンは、同一平面上にある3つ以上の頂点“v1,v2,v3,v4・・・vn”から成り立っています。 この各頂点を、v1をv2に、v2をv3に、v3をv4に、というように順に結合し、最後にvnとv1を結合することにより得られる閉領域を、 「ポリゴン」と呼びます。一般に、各頂点間を結ぶ直線を「エッジ」と呼びます。

図2-1 一般のポリゴン例

 頂点数が3以上であればポリゴンは成立しますが、一般に頂点数が3または4のポリゴンが最適であるとされています(SGLでは頂点数4のポリゴンのみサポート)。

2-2. SGLにおけるポリゴン

 SGLでは、頂点数が4のポリゴンのみサポートしています。このため、頂点数が3ないしは5以上のポリゴンは表現できません。ただし、4頂点中の2頂点を同一の座標に設定することで、外見上3頂点のポリゴンを描画することができます。
エッジは頂点の番号に関係なく、常に時計廻りに結合されます。

図2-2 セガサターンでのポリゴン例

 セガサターンでは、ポリゴンを画面上の塗りつぶした領域として描きます。ポリゴンを描く手順は以下の通りです。

  1. 頂点座標リストの作成
  2. ポリゴン面リストの作成
  3. ポリゴン面単位で表面属性を決定
  4. 画面に描画

 次に、実際の描画ルーチンを参考に、関連する関数と関数のパラメータの説明をしていきます。

ポリゴン描画ルーチン

 SGLで実際にポリゴンを描画する場合は、ライブラリ関数“slPutPolygon”を使用します。この関数はパラメータとして指定されたポリゴンを描画しますが、表示位置及び各種変換操作(回転・平行移動・拡大縮小)は、カレントマトリクスに従います。

【void slPutPolygon ( PDATA *pat ) ;】

 データ定義されたポリゴンの描画を行います。
パラメータには、ポリゴンの頂点データリスト、頂点数、面リスト、面数、面属性のデータが含まれるポリゴンデータテーブルの格納される領域の先頭アドレスを代入します。 パラメータに関する詳細は次項の“ポリゴン描画に必要なパラメータ”を参考にしてください。

 以下、サンプルプログラムを参考に解説していきます。

 サンプルプログラムでは、ポリゴン描画に必要な前準備 (イニシャライズ、座標や表示角度の設定など)を行った後、階層マトリクスの観念 (詳細は“第5章:マトリクス”参照)を用いて、ポリゴンの表示位置、表示角度、 拡大縮小比率(今回は未使用)などを決定し、それらのデータを元に、実際のポリゴン 描画を行っています。
ポリゴンの描画にはライブラリ関数“slPutPolygon(&PD_DATA):”を用 いています。
( )内の“&PD_DATA”は、ポリゴン表示に必要なパラメータを一括する変数で、 データファイル“polygon.c”中で定義されています。
(“リスト2-2: polygon.c: ポリゴンパラメータ”参照)。

リスト2-1 sample_2_2:ポリゴン描画ルーチン
/*----------------------------------------------------------------------*/
/*	Draw 1 Polygon							*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"

extern PDATA PD_PLANE1;

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

	slInitSystem(TV_320x224, NULL, 1);

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

	slPrint("Sample program 2.2", slLocate(9,2));

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

		slSynch();
	}
}

フロー2-1 sample_2_2:ポリゴン描画フローチャート

ポリゴン描画に必要なパラメータ

 次のリストは、プログラム中“polygon.c”として読み込まれているポリゴン描画用 のパラメータ群です。この部分を書き換えることで、ポリゴンの形、大きさ、面数、 表面属性などを変更することができます。

リスト2-2 polygon.c:ポリゴンパラメータ>
#include	"sgl.h"

POINT point_PLANE1[] = {
        POStoFIXED(-10.0, -10.0, 0.0),
        POStoFIXED( 10.0, -10.0, 0.0),
        POStoFIXED( 10.0,  10.0, 0.0),
        POStoFIXED(-10.0,  10.0, 0.0),
};

POLYGON polygon_PLANE1[] = {
        NORMAL(0.0, 1.0, 0.0), VERTICES(0, 1, 2, 3),
};

ATTR attribute_PLANE1[] = {
        ATTRIBUTE(Dual_Plane, SORT_CEN, No_Texture, C_RGB(31, 31, 31), No_Gouraud, MESHoff, sprPolygon, No_Option),
};

PDATA PD_PLANE1 = {
        point_PLANE1, sizeof(point_PLANE1) / sizeof(POINT),
        polygon_PLANE1, sizeof(polygon_PLANE1) / sizeof(POLYGON),
        attribute_PLANE1
};

図2-3 “polygon.c”による描画モデル

図2-4 パラメータデータ列作成の手順
 
●頂点リストの順に従い上から"0,1,2,3,4,〜n"の順に、頂点識別用の番号が自動的に割り振られます。
●ポリゴン面1面ごとに、頂点リストから任意の4点を頂点番号で選択しポリゴン面のリストをつくります。また、光源等を使用する場合は、さらに各面毎に法線ベクトルも設定します。
●面リストの順に従い、上から順にポリゴン面の属性を決定します。属性にはポリゴンカラーの他に表面処理の方法などもふくまれます。
●頂点リストから頂点数、面リストから面数を算出し新たにリストに書き加えます。これを、ポリゴンパラメータとして描画関数に渡します。
 

 次に、ポリゴンデータ作成の手順を、作成するデータ列を元に解説していきます。

【頂点リストの作成:POINT point_<ラベル名>[ ]】

 ポリゴン頂点の初期座標一覧です。頂点にはリストの順に従って上から“0,1,2,3,4 〜n”と、識別用の番号が自動的に割り振られます。

変数名:POS2FIXED ( vertex_x , vertex_y , vertex_z ) ,
各頂点座標を表します。座標値はマクロ“POStoFIXED”を使用することで、浮動小数点数値の代入が可能になります(POS2FIXEDは、SGLがサポートするマクロです)。

【面リストの作成:POLYGON polygon_<ラベル名>[ ]】

頂点リストを元に、ポリゴン面及び法線ベクトルのリストを作成します。

変数名:NORMAL ( vector_x , vector_y , vector_z ) ,
法線ベクトルを各面ごとに定義します。法線ベクトルとはポリゴン面の向きを表すためのもので、ポリゴン面に対して垂直に伸びる単位ベクトルのことをいいます。
パラメータはそれぞれ放線ベクトルの向きを表すXYZ値で、法線ベクトルは常に単位ベクトルで指定する必要があります。

変数名:VERTICES ( v1 , v2 , v3 , v4 ) ,
頂点リスト中のどの頂点を用いてポリゴン面を形成していくかのリストを作成します。選択される頂点数は常に4つです。ただし、3番目と4番目の頂点番号を同じにした場合に限り、見た目三角形のポリゴンが表現できます。
また、頂点番号と、エッジの結合順序には関係がありません。エッジはリストによって選択された第1番目の頂点から、常に時計廻りになるように結合されます。

【面属性リストの作成:ATTR attribute_<ラベル名>[ ]】

ポリゴンの表面属性を、面リストの順に従って各面ごとに設定します。
設定内容の詳細については、“第7章:ポリゴンの面属性”の章を参照してください。

変数名:ATTRIBUTE ( plane , sort , texture , color , gouraud , mode , dir , option ) ,

ポリゴンの表面属性を設定します。パラメータはそれぞれ、表裏判定、Zソート、テクスチャー、カラー、グーロー処理、描画モード、スプライト反転処理、その他機能の計8項目の設定を行います。
(詳細は“第7章:ポリゴンの面属性”の章参照)

【描画関数用データ列の作成:PDATA PD_<ラベル名>】

ポリゴンデータの各設定をパラメータとして、ライブラリ関数“slPutPolygon”に渡すためのデータストラクチャを作成します。

変数名:頂点リスト、頂点数、面リスト、面数、面属性リスト

実際に“slPutPolygon”に渡すデータ列を作成します。
ここでは頂点リストなどの情報から新たに、頂点数とポリゴン面数を算出し、パラメータ・データ列に加えています。

図2-5 “PDATA PD_<ラベル名>”のパラメータ

●ポリゴンデータストラクチャ●

PDATA PD_PLANE1={
	point_PLANE1,				/* 頂点リスト */
	sizeof(point_PLANE1)/sizeof(POINT),	/* 頂点数 */
	polygon_PLANE1,				/* 面リスト */
	sizeof(polygon_PLANE1)/sizeof(POLYGON),	/* 面数 */
	attribute_PLANE1			/* 属性リスト */
};

2-3. 複数ポリゴンの組み合わせ

 実際にポリゴンを用いて何らかの形状を表現する場合、一枚のポリゴンのみでそれを実現するのは不可能です。そこで、ここでは複数のポリゴン面を利用したオブジェクトのデータ作成方法について説明していきます。

立方体の作成

 立方体を表現するには、頂点数が8、ポリゴン面数が6のオブジェクトをパラメータ値として設定する必要があります。
SGLでは、前記したパラメータ設定データファイル“polygon.c”の内容を次のように書き換えることによって、これを実現することができます。
リストでは最初に立方体の元となる8つの頂点のリストを、次にこの頂点から6つの面のリストを作成し、各面毎に表面属性を決定した後、各データをパラメータデータ列“PD_PLANE”に格納します。 これを描画関数“slPutPolygon”にポリゴンパラメータとして渡すことで立方体が画面に描画されます。

 次のリスト2-3は、立方体ポリゴンデータの作成例です。

リスト2-3 polygon.c:立方体ポリゴンのパラメータ
#include	"sgl.h"

POINT point_PLANE1[] = {			/* 頂点リストの作成  */
	POStoFIXED(-15.0, -15.0, -15.0),	/* 頂点座標(XYZ配列) */
	POStoFIXED(-15.0, -15.0,  15.0),
	POStoFIXED(-15.0,  15.0, -15.0),
	POStoFIXED(-15.0,  15.0,  15.0),
	POStoFIXED( 15.0, -15.0, -15.0),
	POStoFIXED( 15.0, -15.0,  15.0),
	POStoFIXED( 15.0,  15.0, -15.0),
	POStoFIXED( 15.0,  15.0,  15.0),
};

POLYGON polygon_PLANE1[] = {			/* 面リストの作成 */
	NORMAL(-1.0,  0.0,  0.0), 		/* 法線ベクトルの設定 */
	VERTICES(0, 1, 3, 2),			/* 一面に選択される頂点番号 */
	NORMAL( 0.0,  0.0,  1.0), 
	VERTICES(1, 5, 7, 3),
	NORMAL( 1.0,  0.0,  0.0), 
	VERTICES(5, 4, 6, 7),
	NORMAL( 0.0,  0.0, -1.0), 
	VERTICES(4, 0, 2, 6),
	NORMAL( 0.0, -1.0,  0.0),
	VERTICES(4, 5, 1, 0),
	NORMAL( 0.0,  1.0,  0.0),
	VERTICES(2, 3, 7, 6),
};

ATTR attribute_PLANE1[] = {			/* 面属性リストの作成 */
	ATTRIBUTE(Dual_Plane,SORT_CEN,No_Texture,C_RGB(31,31,00),No_Gouraud,MESHoff,sprPolygon,UseLight),
	ATTRIBUTE(Dual_Plane,SORT_CEN,No_Texture,C_RGB(31,00,00),No_Gouraud,MESHoff,sprPolygon,UseLight),
	ATTRIBUTE(Dual_Plane,SORT_CEN,No_Texture,C_RGB(00,31,00),No_Gouraud,MESHoff,sprPolygon,UseLight),
	ATTRIBUTE(Dual_Plane,SORT_CEN,No_Texture,C_RGB(00,00,31),No_Gouraud,MESHoff,sprPolygon,UseLight),
	ATTRIBUTE(Dual_Plane,SORT_CEN,No_Texture,C_RGB(31,00,31),No_Gouraud,MESHoff,sprPolygon,UseLight),
	ATTRIBUTE(Dual_Plane,SORT_CEN,No_Texture,C_RGB(00,31,31),No_Gouraud,MESHoff,sprPolygon,UseLight),
};

PDATA PD_PLANE1 = {				/* 描画関数用データ列の作成 */
	point_PLANE1,
	sizeof(point_PLANE1)/sizeof(POINT),	/* 頂点数の算出 */
	polygon_PLANE1,
	sizeof(polygon_PLANE1)/sizeof(POLYGON),	/* ポリゴン面数の算出 */
	attribute_PLANE1
};

図2-6 リスト2-3のパラメータによる描画モデル
注)左手座標系のため、Z軸正方向は画面奥になります

2-4. ポリゴンの歪みの問題

 ポリゴンを見るとき、歪の問題が生じることがあります。
歪はしばしば計算誤差によってひき起こされます。
また、ポリゴンの頂点が最初3Dで指定され、変換操作の後に2D画面上に投影されると言うことに起因する場合もあります。
真のポリゴン(全ての頂点が同一平面上にあるポリゴン)が識別できなくなる唯一の歪として、エッジ方向(ポリゴン面に対して水平)から見た場合に、そのポリゴンが一本の線になってしまうことがあげられます。

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

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

表2-1 本章に登場したSGLライブラリ関数
 関数型  関数名  パラメータ  機 能 
voidslPutPolygonPDATA*patポリゴンの描画(パラメータの設定)


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