2010-02-02 1 views
6

애니메이션 속도를 어떻게 조절합니까? 내 개체가 다른 컴퓨터에서 빠르게 움직입니다.OpenGL 애니메이션의 속도가 다른 컴퓨터에서 일관성이 있는지 어떻게 확인합니까?

FPS = 60.0; 
while (game_loop) { 
    int t = getticks(); 
    if ((t - t_prev) > 1000/FPS) 
     process_animation_tick(); 
    t_prev = t; 
} 

이 더 나은 솔루션입니다 : 첫 번째에서

GAME_SPEED = ... 
while (game_loop) { 
    int t = getticks(); 
    process_animation((t - t_prev)*GAME_SPEED/1000.0); 
    t_prev = t; 
} 

, getframe가 고정 된 양하여 객체를 이동,하지만

void idle(void){ 

if (!wantPause){  
    circleSpin = circleSpin + 2.0;  //spin circles 
    if(circleSpin > 360.0) 
{ 
     circleSpin = circleSpin - 360.0; 
} 

     diamondSpin = diamondSpin - 4.0; //spin diamonds 
    if(diamondSpin > 360.0) 
{ 
     diamondSpin = diamondSpin + 360.0; 
} 
     ellipseScale = ellipseScale + 0.1; //scale ellipse 
    if(ellipseScale > 30) 
{ 
     ellipseScale = 15; 
} 
glutPostRedisplay(); 
} 
} 

void drawScene() 
{ 
... 
glColor3f(1,0,0); 
glPushMatrix(); 
glRotatef(circleSpin,0,0,1); 
drawOuterCircles(); 
glPopMatrix(); 
} 


int main (int argc, char** argv) 
{ 
glutInit(&argc, argv); 
glutInitWindowSize(400,400); 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
glutCreateWindow("Lesson 6"); 
init(); 
glutDisplayFunc(drawScene); 
glutKeyboardFunc(keyboard); 
glutReshapeFunc(handleResize); 
glutIdleFunc(idle); 
glutMainLoop(); 
return 0; 
} 

답변

10
이 가난한 사람의 솔루션입니다

프레임 속도가 떨어지면 오류가 발생하기 쉽습니다.

후자의 경우 경과 된 시간을 기준으로 개체를 이동합니다. 예 : 20ms가 지나면 12도 회전하고, 10ms가 지나면 6도 회전합니다. 일반적으로 애니메이션은 시간의 함수 인 경우에 사용됩니다.

구현은 getticks()까지입니다. 처음에는 glutGet(GLUT_ELAPSED_TIME)을 사용할 수 있습니다.

int old_t; 

void idle(void) { 
    int t = glutGet(GLUT_ELAPSED_TIME); 
    int passed = t - old_t; 
    old_t = t; 
    animate(passed); 
    glutPostRedisplay(); 
} 

void animate(int ms) 
{ 
    if (!wantPause){  
    circleSpin = circleSpin + ms*0.01;  //spin circles 
    if(circleSpin > 360.0) 
    { 
     circleSpin = circleSpin - 360.0; 
    } 
    diamondSpin = diamondSpin - ms*0.02; //spin diamonds 
    if(diamondSpin > 360.0) 
    { 
     diamondSpin = diamondSpin - 360.0; 
    } 
    ellipseScale = ellipseScale + ms*0.001; //scale ellipse 
    if(ellipseScale > 30) 
    { 
     ellipseScale = 15; 
    } 
    } 
} 
: 귀하의 경우


그것과 같을 것

관련 문제