2011-01-08 1 views
0

매우 기본적인 코드 샘플을 테스트 중입니다. OpenGL 객체를 그리고 키보드로 회전시킵니다. 나는 키보드를 사용하지 않고 똑같은 것을 시도했다. 스레드를 열고 동일한 glRotatef 함수 (키보드에서 사용하는 동일한 glrotatef)를 매 5 초마다 호출했습니다. 그러나 회전은 없습니다. 문제가 무엇입니까?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

display()는 무엇을합니까? 특히 무한 루프 내에서 glutPostRedisplay를 호출하고 있습니까? – user168715

+0

좀 더 많은 코드를 제공 할 수 있습니까? 당신의 관점 설치/루프 등? 아, 모든 프레임을 매트릭스로 재설정 할 수 있습니까? – roman

+0

먼저이 스레드를 하나의 스레드로 사용하려고합니다. 어쨌든 왜 여러 개의 스레드가 있습니까? – sidewinderguy

답변

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

질문에 대한 답변은 무엇입니까? – genpfault

+1

@genpfault는 원래의 질문으로 편집하려고 한 것 같습니다. @cemal, 원래 질문에서 편집 링크를 클릭하여이 코드 샘플을 추가 할 수 있습니다. –

2

OpenGL을 컨텍스트가 스레드에 묶여있다가, 즉, 같은 길이의 OpenGL을 컨텍스트가 (GL * MakeCurrent에 의해) 바인딩으로 만 컨텍스트가 바인드 된 스레드에서 작성된 함수 호출은 해당 컨텍스트에 영향을 미칩니다. 컨텍스트를 다른 스레드에 바인딩 할 수 있습니다 (먼저 바인딩 해제). 간단히 말해서, 그것은 당신이 생각하는대로 작동하지 않습니다.

하지만 어쨌든 완전히 잘못된 것입니다. OpenGL은 장면 그래프가 아닙니다. glRotatef는 modelview 행렬에만 영향을 미칩니다. 그리고 OpenGL은 객체를 모릅니다. 그냥 원시를 알고 있습니다.

OpenGL의 기본 패턴은 그리기 직전에 필요한 모든 상태를 설정한다는 것입니다. 따라서 루프에서 디스플레이 기능을 호출하면 뷰포트와 프로젝션을 설정 한 다음 모든 객체를 반복합니다. 각 객체는 적절한 modelview 행렬을 설정합니다. 그리고 애플리케이션에 따라 디스플레이 기능 내에서 이러한 단계를 여러 번 수행 할 수 있습니다. 그리고 귀하의 경우 타이머가 수행해야하는 작업은 회전 각도를 증가시키는 것입니다. 회전 각도는 표시 기능 내에서 적절한 modelview 행렬을 만드는 데 사용됩니다.