Как Вы удостоверяетесь, что скорость анимации OpenGL последовательна на различных машинах?

Как Вы контролируете скорость анимации? Мои объекты анимируют быстрее на чьей-либо машине.

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;
}
6
задан WendiKidd 8 August 2012 в 03:36
поделиться

1 ответ

Это решение плохого человека:

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 перемещает ваш объект на фиксированную сумму, но это склонен к ошибкам, если капли Framerate.

В последнем вы перемещаете объекты, основанные на прохождении времени. Например. Если проходит 20 мс, вы поворачиваете объект 12 градусов, а если проходят 10 мс, вы вращаете его на 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;
    }
  }
}
10
ответ дан 10 December 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: