проблема glRotatef - PullRequest
       27

проблема glRotatef

0 голосов
/ 08 января 2011

Я пробую очень простой пример кода.Я рисую объект opengl и поворачиваю его с помощью клавиатуры.Я попробовал то же самое без использования клавиатуры.Я открываю поток и вызываю одну и ту же функцию glRotatef (такую ​​же glrotatef, которую я использую в функции клавиатуры) каждые 5 секундНо нет вращения.В чем проблема?Вот мой код темы ниже:

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 ]

2 голосов
/ 08 января 2011

Контексты OpenGL связаны с потоками, т. Е. Пока контекст OpenGL связан (с помощью gl * MakeCurrent), только вызовы функций, сделанные из потока, с которым связан контекст, будут влиять на этот контекст. Вы можете связать контекст с другим потоком (сначала отсоедините его). Или простыми словами, это просто не работает так, как вы думаете.

Однако вы все равно совершенно ошибаетесь. OpenGL - это не граф сцены. glRotatef влияет только на матрицу вида модели. А OpenGL не знает объектов, он просто знает примитивы.

Основной шаблон в OpenGL состоит в том, что вы устанавливаете все необходимое состояние непосредственно перед рисованием. Таким образом, вы вызываете функцию отображения в цикле, устанавливаете в ней область просмотра и проекцию, а затем выполняете итерацию по всем объектам, для каждого объекта устанавливается правильная матрица вида модели. И в зависимости от вашего приложения вы можете выполнять эти шаги несколько раз в функции дисплея. А в вашем случае таймер должен увеличивать угол поворота, который затем используется в функции отображения для создания правильной матрицы вида модели.

0 голосов
/ 08 января 2011

вот мой основной код:

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