glRotatef问题

时间:2011-01-08 20:03:09

标签: opengl graphics glut

我正在尝试一个非常基本的代码示例。我绘制一个opengl对象,用键盘旋转它。我没有使用键盘尝试过同样的事情。我打开一个线程,我每5秒调用相同的glRotatef函数(我在键盘函数中使用的glrotatef)。但是没有轮换。问题是什么?这是我的线程代码:

void movePlayer2()
{
  while(1)
  //if(key == 'a')
  { 
    Sleep(5000);
    glRotatef(25,1,0,0);
    //gluLookAt(0,0,0.01,0,0,-5,0,1,0);
    display();
  }
}

2 个答案:

答案 0 :(得分:2)

OpenGL上下文与线程绑定,即只要绑定OpenGL上下文(通过gl * MakeCurrent),只有从上下文绑定的线程调用的函数调用才会影响该上下文。您可以将上下文绑定到另一个线程(首先取消绑定它)。或者简单来说,它根本不像你想象的那样工作。

然而,无论如何,你接近是完全错误的。 OpenGL不是场景图。 glRotatef仅影响模型视图矩阵。 OpenGL不知道对象,只知道原语。

OpenGL中的基本模式是,您可以在绘制之前设置所需的所有状态。因此,您可以在循环中调用显示函数,在其中设置视口和投影,然后遍历所有对象,为每个对象设置正确的模型视图矩阵。根据您的应用程序,您可以在显示功能中多次执行这些步骤。在你的情况下,你的计时器应该做的是增加旋转角度,然后在显示功能中使用它来创建正确的模型视图矩阵。

答案 1 :(得分:-1)

这是我的基本代码:

int main(int argc, char **argv)
{
    initGL(argc, argv);
    HANDLE thread_id2=CreateThread( NULL , 0 , (LPTHREAD_START_ROUTINE)f , NULL , 0 , 0 );
    HANDLE thread_id22=CreateThread( NULL , 0 , (LPTHREAD_START_ROUTINE)movePlayer2 , NULL , 0 , 0 );

    glutMainLoop();


    return 0;
}



void initGL(int argc, char **argv)
{
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(512, 512);
    glutInit(&argc, argv);

    glutCreateWindow("deneme");
    glutDisplayFunc(display);




}




void display()
{


    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);


    glutWireTeapot(0.5);

    glutSwapBuffers();


}





void f()
{
while(1)

    {   


        Sleep(5000);

        glRotatef(0.2,1,0,0);

        glutPostRedisplay();
        printf("dsdasd\n");


        display();
    }
}