Я бы сделал это так. Во-первых, вам нужна функция для определения угла (код C, портируйте его самостоятельно):
float lerpangle(float from, float to, float frac) {
float a;
if ( to - from > 180 ) {
to -= 360;
}
if ( to - from < -180 ) {
to += 360;
}
a = from + frac * (to - from);
return a;
}
Затем, когда вы начинаете вращение, у вас есть duration
и stoppingangle
в качестве ваших собственных параметров. Получите startingangle
от вашего объекта и startingtime
(в чем-то прилично точном, миллисекунды) и сохраните их. Затем вращение происходит так:
current_rotation = lerpangle(startingangle, stoppingangle,
(time.now - startingtime) / duration)