使用glutTimerFunc(...)

时间:2016-02-22 20:38:46

标签: opengl

我想创建一个程序,使用OpenGL将一些对象绘制到场景中,我不断手动更改这些对象的位置。为了实现这一点,我需要在每个循环中运行某种循环,它会改变对象的位置,然后在重复之前绘制到屏幕上。

鉴于glutMainLoop()是一个非返回函数,并且也是运行OpenGL程序的必需函数,我需要使用某种计时器运行我的循环。

现在我的解决方案与以下内容类似:

void Render()
{
    // Draw some objects using OpenGL
    // ......
    // ......
}


void Loop
{
    // Update the positions of the objects
    // ......
    // ......

    glutPostRedisplay();
    glutTimerFunc(1, Loop, 0);
}


int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    GlutCreateWindow("Test");
    glutDisplayFunc(Render);
    glutMainLoop();
    glutTimerFunc(1, Loop, 0);
}

但是,我不确定我理解为什么需要在glutTimerFunc()进行main()调用。为什么我不能直接调用Loop()来替换它?

例如:

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    GlutCreateWindow("Test");
    glutDisplayFunc(Render);
    glutMainLoop();
    Loop();
}

这不起作用。对象不会按预期在屏幕上移动,而且OpenGL窗口完全没有响应;我甚至无法通过标题栏上的十字架来关闭它。

肯定glutTimerFunc(1, Loop, 0);只是按照我在第二个例子中所做的那样调用Loop(),那为什么这不起作用??

2 个答案:

答案 0 :(得分:2)

基本上,在调用回调之前,glutTimerFunc会等待几个毫秒(在你的情况下,Loop())。通过这种方式,它就像刷新操作一样。

查看→GLUT API了解更多详情

void glutTimerFunc(unsigned int numMilliseconds, functionCallback, value);

所以,这意味着你可以传递这样的东西:

glutTimerFunc(1000 / SCREEN_FPS, Loop, 0);

有关主循环的额外信息 deWitter's Gameloop

但是,随着项目变得越来越复杂,您可能会发现希望场景中的对象以恒定速度呈现。除了glutTmerFunc之外,您还可以通过计算当前时间与先前当前时间之间的差异来确定动画的工作时间。

希望这有帮助!

答案 1 :(得分:0)

这是来自真实程序的一个非常简单的glutTimerFunc()示例。

我想劫持标题栏以输入命令。当您键入内容时,它会出现在标题栏中,而当您按回车键时,它将执行命令。我想要一个闪烁的光标。

char title[80];        // This is where our keystrokes go.
char * cursor = NULL;  // This points to the cursor character.

void cursorBlink(int id) {
  if (cursor) {
    *cursor = (*cursor == ' ') ? '_' : ' ';
    glutSetWindowTitle(title);
    glutTimerFunc(1000.0, cursorBlink, 0);
  }
}

这还不是全部。 ESC键使我们进入命令行输入模式。这将设置标题字符串和光标指针,并且还必须首先调用cursorBlink()才能启动循环。输入命令后,光标指针将重新设置为NULL,并且循环将自行关闭。

不使用cursorBlink参数。这在简单动画中很常见。不用担心。