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

无论哪种情况,您都需要先设置 a 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

处理过剩键盘事件时添加代码:

if (key == DESIRED_KEY_CODE)
    i+=3

i+=3并在display()函数中删除它

但请注意,这样一次我们将只有一个三角形......如果你想显示几个三角形,你必须有一些可见三角形的计数器并将它们显示在一个循环中。

于 2012-07-20T11:49:19.637 回答