Home | Lesson | Game | Tool | Link

9.画像の移動

画像を公転・自転させながら描画します。
マトリックス(行列)の計算は順番が異なると、結果も異なってきます。
通常の掛け算とは違う点に注意してください。


構造体用意
画像の情報を格納する構造体を用意します。
構造体には、「色/位置/角度」を格納できるようにします。
配列としては100個用意しておきます。
#define num 100
typedef struct
{
	int   r,g,b;	//カラー
	float dist;	//中心からの距離
	float angle;	//現在の角度
}STAR;
STAR star[num];

初期化
構造体を初期化します。
距離は、最初のものは0で、後のものはだんだん遠ざけるように。
色はランダムにしておきます。
void init()
{
	int i;
	for(i=0;i<num;i++)
	{
		star[i].angle = 0.0f;
		star[i].dist = (float(i)/num)*5.0f;
		star[i].r = rand()%256;
		star[i].g = rand()%256;
		star[i].b = rand()%256;
	}
}

テクスチャ読み込み・マテリアル設定
テクスチャの読み込みとマテリアルの設定を行っています。
ここでは、特に変わった処理はしていません。
画像の移動/回転用にマトリックスを用意しておきましょう。
void makeScene(IVideoDriver *driver)
{
	int i;
	matrix4 rot,pos,world;
	SColor col;
	S3DVertex ver[4];
	u16 list[] = {0,1,2, 2,1,3};
	ITexture* Texture  = driver->getTexture("star.bmp");
	SMaterial Material;
	Material.Lighting = false;
	Material.MaterialType = EMT_TRANSPARENT_ADD_COLOR;
	Material.TextureLayer[0].Texture = Texture;
	driver->setMaterial(Material);

描画
頂点情報をもとに、四角形ポリゴンにテクスチャを貼って配列分だけ描画します。
配列の最初のものはゆっくりと回転し、後のものは早く回転するようにします。
ワールドに反映させる際の計算では「自転*移動*公転」という順番になっているので注意。
	for(i=0;i<num;i++)
	{
		col = SColor(0xFF, star[i].r,star[i].g,star[i].b);
		ver[0] = S3DVertex(-1, 1,0, 0,0,0, col, 0,0);//左上
		ver[1] = S3DVertex( 1, 1,0, 0,0,0, col, 1,0);//右上
		ver[2] = S3DVertex(-1,-1,0, 0,0,0, col, 0,1);//左下
		ver[3] = S3DVertex( 1,-1,0, 0,0,0, col, 1,1);//右下

		star[i].angle += float(i)/(num*100);

		pos.setTranslation(vector3df(star[i].dist,0,0));	//移動
		rot.setRotationRadians(vector3df(0,0,star[i].angle));	//回転
		world = rot*pos*rot;
		driver->setTransform(ETS_WORLD, world);//ワールドに反映

		driver->drawIndexedTriangleList(&ver[0], 4, &list[0], 2);
	}
}

初期化関数の呼び出し
メインループの前に初期化関数を呼び出しておきます。
	init();

	while(device->run())
	{


マトリックスの計算

マトリックスの計算順番が違うパターンを用意しました。
A:45度回転 * 右に1移動 * 45度回転
B:右に1移動 * 45度回転 * 45度回転
左から右にマトリックスをかけあわせた図が上になります。
マトリックスの内容は同じですが、掛け合わせる順番が違います。
一番右の画像が最終結果ですが、AとBでは結果が違っています。

このようにマトリックスの計算は順番が異なると結果も異なってくるので注意が必要です。

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

宿題
1.マトリックスの計算順番を変えて実際に描画してみましょう。
2.現在は半時計回りで回っていますが、時計回りに回転させてみましょう。
3.画像を複数用意して、回転させてみましょう。