У меня есть изображение (скажем, это простой прямоугольник), расположенное слева от моего экрана, которое я могу перемещать вверх и вниз. При перемещении вверх я использую некоторую простую тригонометрию, чтобы повернуть его так, чтобы прямоугольник «указывал» на верхний правый угол экрана. При движении вниз он указывает на левый нижний угол экрана.
Учитывая, что мое приложение использует следующую систему координат:
Я использую следующий код для достижения поворота:
// moving upwards
rotation = -atan2(position.y , res.x - position.x));
// moving downwards
rotation = atan2(res.y - position.y , res.x - position.x));
где res
является контрольной точкой и position
это позиция (верхний левый угол) нашего прямоугольного изображения. (Для информации о atan2()
: atan2 () на cplusplus.com).
Это работает очень хорошо: он вращается больше, когда дальше от контрольной точки (res). Однако, скажем, изображение находится внизу экрана. Если мы переместим его вверх, он очень внезапно начнет вращаться. Я хотел бы «вставить» это вращение, чтобы оно было сглажено.
Что я имею в виду, внезапно вращаясь, это:
Допустим, прямоугольник не движется в кадре n, поэтому его вращение составляет 0 градусов. Затем я нажимаю стрелку вверх, чтобы вычислить угол. В кадре n + 1 угол составляет 30 градусов (например). Это конечно не очень гладко.
Мой вопрос понятен? Как мне это сделать?
Вы можете постепенно изменять угол наклона каждого кадра. Для очень «плавного» эффекта вращения вы можете использовать
target_angle = ...
current_angle += (target_angle - current_angle) * smoothing_factor
где smoothing_factor
дает скорость, с которой current_angle
должен сходиться к target_angle
, Например, значение 1 будет мгновенным, значение 0,1, вероятно, даст плавный эффект.
При этом вы можете столкнуться с проблемой обтекания, из-за которой что-то вроде перехода от 10 до 350 градусов пошло бы не в ту сторону. В таком случае используйте
target_angle = ...
current_angle += diff(target_angle, current_angle) * smoothing_factor
где
diff(a, b) {
return atan2(sin(a - b), cos(a - b))
}
Эта хорошая формула разности углов взята из Другой вопрос.
Других решений пока нет …