スケーリング

2010年1月4日

ファイル

13-scale.tar.gz

内容

ティーポットの大きさを変化させます。スケールの動的変化には、glutIdleFunc() で設定するコールバック関数を利用しています。glutIdleFunc() で設定した関数は、アイドル状態になると呼び出されます。呼び出されるタイミングは実行環境によりまちまちです。

void idle(void)
{
	scale += dscale;

	if(scale > 2. || scale < 0.5){
		dscale *= -1;
	}

	glutPostRedisplay();
}

glutIdleFunc() に設定した idle() では、スケールを表わす scale を変化させています。最後の glutPostRedisplay() は、再描画要求のための関数です。

以下が描画コールバック関数の内容です。

void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);

	drawBackground();

	glPushMatrix();

	glScalef(scale, scale, scale);

	glColor3f(0., 0., 0.);
	glutWireTeapot(0.5);

	glPopMatrix();

	glutSwapBuffers();
}

drawBackground() は背景を描画するために定義した関数です。glScalef() がその下で描画しているティーポットの大きさを変えている関数です。idle() で scale の値が変わるたびに、glScalef() の効果が変わり、ティーポットの大きさが変わります。

OpenGL では、モノの置かれたワールド座標からウインドウへの描画までの間に、各種変換行列をかけていきます。glLoadIdentity() や glScalef() はその変換行列を操作するための関数です。何も考えずに glScalef() を呼ぶと、その効果は全体に及びますので、背景までスケーリングされることになります。スケーリングの効果をティーポットに限定するために、glPushMatrix() と glPopMatrix() で挟んで「囲い」を作っています。 glPushMatrix() は現在の変換行列をスタックに積み上げ、glPopMatrix() はスタックから変換行列を取り出します。

OpenGL プログラミング 目次へ