スケーリング2010年1月4日 | |
![]() ファイル内容ティーポットの大きさを変化させます。スケールの動的変化には、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() はスタックから変換行列を取り出します。 | |
| PENGUINITIS | |