1

私は次のコードを持っています

int i = 0;

void display(void)
{
    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);
    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();

    i+=3;
    glPopMatrix();
    glutSwapBuffers();
}

このメソッドを一時停止してキーストロークを待ってから次の三角形をレンダリングするにはどうすればよいですか?

4

2 に答える 2

2

これは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。これにより、多くのキーがさまざまなことを実行している場合に、作業がはるかに楽になります。

于 2012-07-20T11:49:32.817 に答える
1

glutキーボードイベントを処理するときは、コードを追加します。

if (key == DESIRED_KEY_CODE)
    i+=3

i+=3そしてそれをdisplay()funcで削除します

ただし、この方法では、一度に1つの三角形しか表示されないことに注意してください...複数の三角形を表示する場合は、表示されている三角形のカウンターをいくつか用意して、ループで表示する必要があります。

于 2012-07-20T11:49:19.637 に答える