2011-01-08 1 views
0

J'essaye un échantillon de code très basique. Je dessine un objet opengl et avec un clavier je le fais pivoter. J'ai essayé la même chose sans utiliser de clavier. J'ouvre un fil et j'ai invoqué la même fonction glRotatef (même glrotatef j'utilise dans la fonction de clavier) pour toutes les 5 secondes. Mais il n'y a pas de rotation. Quel est le problème? Voici mon code fil ci-dessous:Problème 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

Que fait display()? En particulier, êtes-vous sûr d'appeler glutPostRedisplay dans votre boucle infinie? – user168715

+0

pourriez-vous fournir un peu plus de code? votre configuration de perspective/boucle etc? ah et est-il possible que vous réinitialisiez votre matrice à chaque image? – roman

+0

Je voudrais essayer de faire fonctionner cela avec un seul fil d'abord. Pourquoi avez-vous plusieurs threads de toute façon? – sidewinderguy

Répondre

-1

voici mon code de base:

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

Comment est-ce une réponse à la question? – genpfault

+1

@ genpfault, ressemble à signifié pour éditer ceci dans sa question originale. @cemal, vous pouvez cliquer sur le lien d'édition dans votre question initiale pour y ajouter cet exemple de code. –

2

contextes OpenGL sont liés à des fils, soit aussi longtemps que le contexte OpenGL est lié (par gl * MakeCurrent) seulement Les appels de fonctions effectués à partir du thread auquel le contexte a été lié influeront sur ce contexte. Vous pouvez lier un contexte à un autre thread (d'abord le dissocier). Ou en termes simples, cela ne fonctionne tout simplement pas comme vous le pensez.

Cependant, vous approchez totalement faux de toute façon. OpenGL n'est pas un graphique de scène. glRotatef affecte uniquement la matrice modelview. Et OpenGL ne connaît pas les objets, il ne connaît que les primitives. Le motif de base dans OpenGL est, que vous définissez tout l'état dont vous avez besoin, juste avant de dessiner. Vous appelez donc la fonction d'affichage dans une boucle, définissez la fenêtre d'affichage et la projection, puis parcourez tous les objets, pour chaque objet, définissez la matrice de modélisation appropriée. Et en fonction de votre application, vous pouvez effectuer ces étapes plusieurs fois dans la fonction d'affichage. Et dans votre cas, ce que votre minuterie doit faire est d'incrémenter l'angle de rotation, qui est ensuite utilisé dans la fonction d'affichage pour créer la matrice de modélisation appropriée.