Home | Lesson | Game | Tool | Link

2.ポリゴン表示

三角形ポリゴンと四角形ポリゴンを描画します。
全ての物体の基礎となる部分です。
前回作成したプログラムに追記していきます。


シーンの作成
シーンを作成する関数を新しく用意します。
物体を移動するためのマトリックス(行列)を用意します。
物体に属性を設定するためのマテリアルを用意します。
ここでは、Lightingをfalseに設定していますが、
これは、「ライトの影響を受けない」という意味になります。
属性を変更したので、setMaterialで反映させます。
void makeScene(IVideoDriver *driver)
{
	matrix4 mat;

	//属性設定
	SMaterial Material;
	Material.Lighting = false;			//ライト反映なし
	driver->setMaterial(Material);

三角形作成
まず最初に、三角形ポリゴンを作成します。
三角形は3つの頂点からできているので、3つの頂点情報を作成します。
隣に四角形も作成するので、setTranslationで左に2移動するように、行列を変更します。
行列を作ったら、setTransformでワールドに反映させておきます。
位置が確定したところで、drawIndexedTriangleListで描画します。
	//三角形作成
	u16 triList[] = {0,1,2};
	S3DVertex triVer[3];
	triVer[0] = S3DVertex( 0, 1,0,  0,0,0, 0xFFFFFFFF, 0,0);//上
	triVer[1] = S3DVertex( 1,-1,0,  0,0,0, 0xFFFFFFFF, 0,0);//右下
	triVer[2] = S3DVertex(-1,-1,0,  0,0,0, 0xFFFFFFFF, 0,0);//左下
	mat.setTranslation(vector3df(-2,0,0));//左に2移動
	driver->setTransform(ETS_WORLD, mat);//ワールドに反映
	driver->drawIndexedTriangleList(triVer, 3, triList, 1);


S3DVertex
頂点情報を格納する構造体です。3Dの空間なので、X,Y,Zの3つが必要になります。
S3DVertex S3DVertex(
	f32    x,y,z,
	f32    nx,ny,nz,
	SColor c,
	f32    tu,tv
)
x,y,z    頂点の座標。
nx,ny,nz 頂点の法線(normal)。面に垂直な方向を指しているベクトルです。
c        頂点カラー。
tu,tv    テクスチャの座標。普通は0.0〜1.0の値を指定します。0.5は真ん中になります。


setTransform
ワールドまたはプロジェクションに、変換したビューをセットします。
void setTransform(
	E_TRANSFORMATION_STATE state,
	const matrix4 &        mat
)
state 以下の状態を指定します。
	ETS_VIEW       ビューの変換。
	ETS_WORLD      ワールドの変換。
	ETS_PROJECTION プロジェクションの変換。
	ETS_TEXTURE_0  テクスチャ0の変換。
	ETS_TEXTURE_1  テクスチャ1の変換。
	ETS_TEXTURE_2  テクスチャ2の変換。
	ETS_TEXTURE_3  テクスチャ3の変換。
	ETS_COUNT      使用しません。
mat   行列。


drawIndexedTriangleList
インデックスをつけた三角形を描画します。(最大で65536頂点まで)
void drawIndexedTriangleList(
	const S3DVertex* vertices,
	u32              vertexCount,
	const u16*       indexList,
	u32              triangleCount
)

vertices      頂点配列へのポインタ。
vertexCount   配列での頂点数。
indexList     インデックス配列へのポインタ。
triangleCount 三角形の数(インデックス配列の1/3となるでしょう)。


インデックスリスト
インデックスリストとは、ポリゴンを描画するための頂点情報をまとめたものです。
三角形を例にすると、頂点が3つあるので3つの頂点を定義する必要があります。
頂点情報さえあればポリゴンを描画できるのですが、その頂点に順番をつけて
まとめたものがインデックスリストになります。
ただし、適当に順番をつければ良いものではなく、上の図のように順番つけ方で
ポリゴンに裏と表が出来上がってしまいます。裏になったポリゴンは描画されません。
Irrlichtでは、時計回りに順番を定義してやる必要があります。
(上で紹介しているプログラムでは、頂点を上→右下→左下と定義しています。)
四角形の場合は、頂点が4つあるので、いちど三角形に分割してから時計回りに
順番をつけていきます。

四角形作成
四角形を作成します。インデックスリストは時計周りになるように定義します。
頂点は4つなので、三角形を作成した時と同じように定義します。
ここでは、右に2移動するようにしています。
	//四角形作成
	u16 rectList[] = {0,1,2, 1,3,2};
	S3DVertex rectVer[4];
	rectVer[0] = S3DVertex(-1, 1,0,  0,0,0, 0xFFFFFFFF, 0,0);//左上
	rectVer[1] = S3DVertex( 1, 1,0,  0,0,0, 0xFFFFFFFF, 0,0);//右上
	rectVer[2] = S3DVertex(-1,-1,0,  0,0,0, 0xFFFFFFFF, 0,0);//左下
	rectVer[3] = S3DVertex( 1,-1,0,  0,0,0, 0xFFFFFFFF, 0,0);//右下
	mat.setTranslation(vector3df(2,0,0));//右に2移動
	driver->setTransform(ETS_WORLD, mat);//ワールドに反映
	driver->drawIndexedTriangleList(rectVer, 4, rectList, 2);
}

カメラの作成
main関数にカメラを追加します。
Z軸方向に5下がった所に設置しています。
	//ウインドウタイトル設定
	device->setWindowCaption(L"IrrLicht");

	ISceneManager* smgr  = device->getSceneManager();
	//カメラ設定
	smgr->addCameraSceneNode(0, vector3df(0,0,-5), vector3df(0,0,0));


addCameraSceneNode
シーンにカメラを追加します。
ICameraSceneNode* addCameraSceneNode(
	ISceneNode*      parent   = 0,
	const vector3df& position = vector3df(0, 0, 0),
	const vector3df& lookat   = vector3df(0, 0, 100),
	s32              id       = -1
)
parent   カメラの親です。親を設定した場合は、親が動けばカメラも動きます。
position カメラの位置です。
lookat   カメラが見つめる位置です。
id       カメラのIDです。


スクリーン

画面(モニタ)の中心が(0,0,0)になります。
左右がX軸で、左にいけばマイナス、右にいけばプラスになります。
上下がY軸で、下にいけばマイナス、上にいけばプラスになります。
ここに、手前奥のZ軸が追加されます。
手前にいけばマイナス、奥にいけばプラスになります。
上のプログラムでは、モニタから手前側に5移動した位置(0,0,-5)から
モニタの中央(0,0,0)を見るという設定になっています。

描画
シーンを描画します。
シーンを作成し、drawAllを呼び出して描画します。
※beginSceneとendSceneの間に記述してください。
	while(device->run())
	{
		driver->beginScene(true,true,0xFF6060FF);

		//シーン作成
		makeScene(driver);

		//シーンの描画
		smgr->drawAll();

		driver->endScene();
	}

ダウンロード
今回作成したファイル一式です。

宿題
1.直角二等辺三角形を描画してみましょう。
2.横長の四角形を描画してみましょう。
3.カメラの位置をずらしてみましょう。(より近く/より遠く/少し上から)
4.五角形を描画してみましょう。