Opengl GLF问题

Opengl GLF问题,opengl,graphics,glut,Opengl,Graphics,Glut,我正在尝试一个非常基本的代码示例。我画了一个opengl对象,用键盘旋转它。我不使用键盘也试过同样的方法。我打开一个线程,每5秒钟调用一次相同的glRotatef函数(与我在键盘函数中使用的glRotatef相同)。但是没有旋转。有什么问题?下面是我的线程代码: void movePlayer2() { while(1) //if(key == 'a') { Sleep(5000); glRotatef(25,1,0,0); //gluLookAt(0,0,

我正在尝试一个非常基本的代码示例。我画了一个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();
  }
}

这是我的基本代码:

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

OpenGL上下文绑定到线程,即只要OpenGL上下文被绑定(通过gl*MakeCurrent),只有从该上下文绑定到的线程进行的函数调用才会影响该上下文。可以将上下文绑定到另一个线程(首先解除绑定)。或者简单地说,它根本不符合你的想法

无论如何,你的方法是完全错误的。OpenGL不是一个场景图。glRotatef仅影响modelview矩阵。OpenGL不知道对象,只知道原语


OpenGL中的基本模式是,在绘图之前设置所有需要的状态。因此,在循环中调用display函数,在其中设置viewport和projection,然后遍历所有对象,为每个对象设置适当的modelview矩阵。根据您的应用程序,您可以在显示功能中多次执行这些步骤。在您的例子中,计时器应该做的是增加旋转角度,然后在display函数中使用旋转角度来创建适当的modelview矩阵。

display()做什么?特别是,您确定要在无限循环中调用GLUTPOSTRDISPLAY吗?您能提供更多的代码吗?你的透视图设置/循环等?啊,有没有可能你每一帧都重置你的矩阵?我会先用一个线程让它工作。为什么你有多个线程?这是怎么回答这个问题的?@genpfault,看起来是想把这个问题编辑成他的原始问题@cemal,您可以单击原始问题中的编辑链接将此代码示例添加到那里。