Всех приветствую! Хочу двигать персонаж вправо на 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();
}
Вывод консоли работающей программы:
delta_T = 0.01669 update() display() delta_T = 0.01667 update() display() delta_T = 0.01667 update() display() delta_T = 0.01666 update() display() delta_T = 0.01667 update() display() delta_T = 0.01670 update() display() ...
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! Что делать?
Из трех экспериментов видно, что чем быстрее я хочу переместиться, то тем дальше перелетаю требуемую конечную точку.
Хотелось бы услышать компетентное мнение по устранению данной проблемы и/или возможного изменения подхода к анимации в принципе. Спасибо за помощь!







