2011-12-12 1 views
0

화면에 구가 있습니다. 버튼을 누르면 구가 천천히 오른쪽으로 이동하기를 원합니다. 이 작업을 수행하려고합니다.C++ opengl : sleep()은 애니메이션 도중 glutPostRedisplay()에 영향을주지 않습니다.

for (int i = 0;i<10;i++) 
{ 
sphere.moveToRight(0.1); 
glutPostRedisplay(); 
sleep(1000); 
} 

그러나 애니메이션 대신 몇 초 기다린 다음 구체를 최종 위치에 그립니다. 나는 잠이 glutPostRediplay()를 멈추기 때문이라고 생각합니다. 이 기본 암기를 수행하는 방법에 대한 아이디어가 있습니까?

+0

'glutPostRedisplay'와'Sleep' 호출의 위치를 ​​바꿔보십시오. – Cyclonecode

+0

예. 행운을 찾았습니다. – James

+0

위의 코드가'glutIdleFunc'에서 호출 되었습니까? – Cyclonecode

답변

2

glutPostRedisplay을 잘못 사용하고 있습니다.

체크 아웃 : http://www.opengl.org/resources/libraries/glut/spec3/node20.html

glutPostRedisplay가 다시 표시 할 을 필요로 현재 윈도우의 정상적인 비행기를 표시합니다. glutPostWindowRedisplay은 필요에 따라 지정된 창 을 다시 표시합니다. 두 번 호출 후 다음 반복 에서 glutMainLoop으로 넘어 가면 윈도우의 디스플레이 콜백이 호출되어 이라는 창이 열리고 일반 평면이 다시 표시됩니다. 다음 디스플레이 콜백 기회가 glutPostRedisplay이 여러 번 호출되기 전에 은 하나의 다시 표시 콜백 만 생성합니다. glutPostRedisplay은 일 수 있으며 창 디스플레이 또는 오버레이 디스플레이 콜백 내에서 호출하면 에 다시 전화를 걸어 표시를 다시 표시 할 수 있습니다.

즉, 이미지가 한 번 새로 고침됩니다.

+0

완벽한 설명! glutSwapBuffers 여전히 트릭을하지 못했지만, 설명에 익숙해졌지만 지금은 display()를 호출하고 있습니다. 이제 작동 중임 – James

+0

물론 더블 버퍼 렌더링에서만 작동합니다 ... 'glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH)' 'GLUT_DOUBLE'을 설정하면'glutSwapBuffers'가 작동합니다. – KoKuToru

+0

@KoKuToru : 내부 루프에서 glutSwapBuffers를 호출해서는 안되며, 렌더링 된 그림을 표시 할 수 있도록 렌더링 끝에서만 호출해야합니다. GLUT 프로그램에서 일을 애니 메이팅하는 올바른 방법은 디스플레이 기능의 호출을 타이밍으로 잡아서 GLUT 유휴 기능에서 glutPostRedisplay를 실행하거나 glutPostRedisplay를 유휴 상태로 사용하는 것입니다. – datenwolf

관련 문제