problema glRotatef

Estoy probando una muestra de código muy básica. Dibujo un objeto opengl y con un teclado lo giro. Intenté lo mismo sin usar el teclado. Abro un hilo e invoco lo mismo glRotatef función (igual glrotatef Yo uso en la función de teclado) por cada 5 segundos. Pero no hay rotación. ¿Cuál es el problema? Aquí está mi código de hilo a continuación:

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

preguntado el 08 de enero de 11 a las 20:01

¿Qué hace display ()? En particular, ¿está seguro de que está llamando a glutPostRedisplay dentro de su bucle infinito? -

¿Podría proporcionar un poco más de código? su configuración de perspectiva / bucle, etc.? ah y ¿es posible que reinicies tu matriz en cada fotograma? -

Primero intentaría que esto funcione con un solo hilo. ¿Por qué tienes varios hilos de todos modos? -

2 Respuestas

Los contextos OpenGL están vinculados a subprocesos, es decir, siempre que un contexto OpenGL esté vinculado (por gl * MakeCurrent), solo las llamadas a funciones realizadas desde el subproceso al que se ha vinculado el contexto afectarán ese contexto. Puede vincular un contexto a otro hilo (primero desvincularlo). O en palabras simples, simplemente no funciona de la manera que piensas.

La forma en que te acerques está totalmente equivocada de todos modos. OpenGL no es un gráfico de escena. glRotatef afecta solo a la matriz modelview. Y OpenGL no conoce los objetos, solo conoce las primitivas.

El patrón básico en OpenGL es que establece todo el estado que necesita, justo antes de dibujar. Entonces, llama a la función de visualización en un bucle, allí establece la ventana gráfica y la proyección, luego itera a través de todos los objetos, para cada objeto establece la matriz de vista modelo adecuada. Y dependiendo de su aplicación, puede realizar esos pasos varias veces dentro de la función de visualización. Y en su caso, lo que debería hacer su temporizador es incrementar el ángulo de rotación, que luego se usa dentro de la función de visualización para crear la matriz de vista de modelo adecuada.

Respondido el 08 de enero de 11 a las 23:01

aquí está mi código básico:

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

Respondido el 08 de enero de 11 a las 23:01

¿Cómo es esto una respuesta a la pregunta? - genpfault

@genpfault, parece destinado a editar esto en su pregunta original. @cemal, puede hacer clic en el enlace de edición en su pregunta original para agregar esta muestra de código allí. - Mike Daniels

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.