Всех приветствую!
Хочу двигать персонаж вправо на 10.0f ровно за свое заданное время: 2 сек, 0.5 сек и т.п.
Имеются следующие функции и глобальные переменные
(очищенный от несущественного псевдокод):
float personage_X=-5.0f, personage_Y=-5.0f; float distance_X=10.0, distance_Y=0.0; float dX, dY; double DELTA_T = 0.01667; //среднее значение delta_T даваемое программой //(по сути это 1000/60=16.6(6) мс/кадр) double last_T_move; double duration_T; int duration_tick; bool bmoveLeft = false; bool bmoveRight = false; moveRight { bmoveRight = true; // начинаю движение duration_T = 0.9; // длительность в сек duration_tick = (int) ( duration_T/DELTA_T); // кол-во тиков(кадров) для перемещения dX = distance_X/duration_tick; // шаг перемещения last_T_move = get_time( ); } update { printf( "update()\n"); if ( bmoveRight) { personage_X += dX; printf( "now_T - last_T_move = %5.7f\n", now_T - last_T_move); if ( now_T - last_T_move >= duration_T ) { bmoveRight = false; // остановить движение } } } idle { const double now_T = get_time( ); const double delta_T = now_T - last_T; last_T = now_T; printf( "delta_T = %5.5f\n", delta_T); update( now_T); redisplay( ); } display { printf( "display()\n"); render_personage( ); swap_buffers( ); }
Вывод консоли работающей программы:
1) Теперь я начинаю движение, например за 2.2 сек вправо на 10:
personage coords: [-5.000, -5.000]
duration_tick = 131 // 131 кадр необходимо для достижения конечной точки перемещения
dX = 0.07634 // шаг
now_T - last_T_move = 0.0156779
now_T - last_T_move = 0.0324781
now_T - last_T_move = 0.0491800
now_T - last_T_move = 0.0658500
now_T - last_T_move = 0.0825200
...
now_T - last_T_move = 2.1999640
now_T - last_T_move = 2.2166250
personage coords: [5.153, -5.000] // в идеале должно быть [5.000, -5.000]
// еще только маленькая погрешность
2) Движение за 0.9 сек вправо на 10:
personage coords: [-5.000, -5.000]
duration_tick = 53 // 53 кадра необходимо для достижения конечной точки перемещения
dX = 0.18868 // шаг
now_T - last_T_move = 0.0135901
now_T - last_T_move = 0.0302720
now_T - last_T_move = 0.0469420
now_T - last_T_move = 0.0636110
...
now_T - last_T_move = 0.9139049
personage coords: [5.377, -5.000] // в идеале должно быть [5.000, -5.000]
// уже существенная погрешность
3) Движение за 0.2 сек вправо на 10:
personage coords: [-5.000, -5.000]
duration_tick = 11
dX = 0.90909
now_T - last_T_move = 0.0133729
now_T - last_T_move = 0.0302980
now_T - last_T_move = 0.0469708
now_T - last_T_move = 0.0636489
now_T - last_T_move = 0.0803308
...
now_T - last_T_move = 0.1970379
now_T - last_T_move = 0.2136910
personage coords: [6.818, -5.000] // в идеале должно быть [5.000, -5.000]
// бешенейшая погрешность (!)
// Alarm! Что делать?
Из трех экспериментов видно, что чем быстрее я хочу переместиться, то тем дальше перелетаю требуемую конечную точку.
Хотелось бы услышать компетентное мнение по устранению данной проблемы и/или возможного изменения подхода к анимации в принципе.
Спасибо за помощь!
Считаешь время которое прошло с предыдущей итерации цикла обновления и опираешься на него в своих расчетах. Эта величина не постоянная и всегда разная.
Gyros
псевдокод:
Тема в архиве.