これはglutIdleFunc
、またはあなたが呼んだものですglutPostRedisplay
か?
いずれの場合も、最初にを設定する必要があります。この設定でglutKeyboardFunc
は、特定のキーが押されたかどうかを検出します。
特定のイベントでのみ画面を更新する場合:
... inside the keyboard function
if (key_pressed == THE_KEY_YOU_WANT)
glutPostRedisplay();
アイドル機能として使用している場合はdisplay
、次のことができます。
global:
bool go_next = false;
... inside the keyboard function
if (key_pressed == THE_KEY_YOU_WANT)
go_next = true;
... inside display:
void display(void)
{
if (go_next)
{
go_next = false;
glLoadIdentity();
glColor3f(1.0f, 0.0f, 0.0f);
glPushMatrix();
... etc
glPopMatrix();
}
glutSwapBuffers();
}
補足:ロジックとレンダリングを分離しておくのが最善です。したがって、おそらくこのようなコードが最適です。
int triangles_to_draw = 0;
... inside the keyboard function
if (key_pressed == THE_KEY_YOU_WANT)
process_event_next_triangle();
void process_event_next_triangle()
{
if (triangles_to_draw < maximum)
++triangles_to_draw;
}
void display(void)
{
go_next = false;
glLoadIdentity();
glColor3f(1.0f, 0.0f, 0.0f);
glPushMatrix();
glTranslatef(20.0f, 20.0f, -40.f);
glRotatef(180.f, 0.0, 0.0, 1.0);
glBegin(GL_TRIANGLES);
for (int i = 0; i < 3*triangles_to_draw; i += 3)
{
glVertex3f(pts[tri[i]], (pts[ptsLength/2 + tri[i]] - maximum) * -1, 0);
glVertex3f(pts[tri[i+1]], (pts[ptsLength/2 + tri[i+1]] - maximum) * -1, 0);
glVertex3f(pts[tri[i+2]], (pts[ptsLength/2 + tri[i+2]] - maximum) * -1, 0);
}
glEnd();
glPopMatrix();
glutSwapBuffers();
}
このようにしてprocess_event_next_triangle
、機能に影響を与えることなく、必要に応じて複雑にすることができることに注意してくださいdisplay
。これにより、多くのキーがさまざまなことを実行している場合に、作業がはるかに楽になります。