OpenGL中的简单三角形

时间:2012-07-20 11:40:49

标签: c++ opengl

我有以下代码

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();
}

如何让这个方法暂停并在渲染下一个三角形之前等待击键?

2 个答案:

答案 0 :(得分: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功能。当你有很多键做不同的东西时,这会让生活变得更加轻松。

答案 1 :(得分:1)

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

if (key == DESIRED_KEY_CODE)
    i+=3

并删除i+=3 func

中的display()

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