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