2013-06-21 3 views
0

У меня есть изображение (допустим, это простой прямоугольник), расположенный слева от моего экрана, и я могу перемещаться вверх и вниз. При перемещении вверх я использую простую тригонометрию, чтобы повернуть ее так, чтобы прямоугольник «указывал» в верхний правый угол экрана. При перемещении вниз он указывает на левый нижний угол экрана.Вмешательство в поворот

Учитывая, что мое приложение использует следующую систему координат: Coordinate system

Я использую следующий код для достижения вращения:

// 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() on cplusplus.com).

Это работает просто отлично: она вращается больше, когда дальше от опорной точки (Рез). Однако, скажем, изображение находится в самом низу экрана. Если мы переместим его вверх, он очень резко повернется. Я хотел бы "inbetween" этот поворот, чтобы он был сглажен.

То, что я имею в виду, вдруг вращающееся это: Допустим, прямоугольник не перемещается в кадре п: поэтому его вращение 0 градусов. Затем я нажимаю стрелку вверх, которая позволяет рассчитать угол. В кадре n + 1 угол составляет 30 градусов (например). Это, конечно, не очень гладко.

Является ли мой вопрос понятным? Как мне это сделать?

ответ

1

Вы можете постепенно изменять угол на каждом кадре. Для очень «гладкого» эффекта вращения, вы можете использовать

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)) 
} 

Это хорошая разность углов формула берутся из another question.

+0

Работает отлично! Благодаря! – RaptorDotCpp

+0

Следует отметить, что время дельта должно быть включено, чтобы сделать независимую скорость вращения – Paranaix

+0

@Paranaix Да, и тогда мы использовали бы параметрическую форму для этого уравнения, которая должна быть экспоненциальным распадом. В зависимости от того, насколько важна анимация и стоит ли это дополнительное усилие. – Zong