2013-06-21 5 views
0

나는 내 화면의 왼쪽에 위아래로 이동할 수있는 이미지 (단순한 사각형이라고 가정 해 봅시다)가 있습니다. 그것을 위쪽으로 움직일 때, 나는 간단한 삼각법을 사용하여 그것을 회전시켜 사각형이 화면의 오른쪽 위 모서리를 향하도록한다. 아래쪽으로 움직일 때 화면의 왼쪽 아래 모서리를 가리 킵니다. 상부 (위치회전 끼우기

// moving upwards 
rotation = -atan2(position.y , res.x - position.x)); 

// moving downwards 
rotation = atan2(res.y - position.y , res.x - position.x)); 
res 기준점이다

position된다 Coordinate system

I의 회전을 달성하기 위해 다음과 같은 코드를 사용

내 애플리케이션 좌표 다음 시스템을 사용하는 점을 감안 왼쪽 모서리). ( atan2()에 대한 정보 : atan2() on cplusplus.com).

이것은 잘 작동합니다. 기준점 (res)에서 멀어 질수록 더 회전합니다. 그러나 이미지가 화면 맨 아래에 있다고 가정 해 봅시다. 그것을 위로 움직이면 갑자기 회전합니다. 나는이 회전을 'inbetween'하고 싶다. 그래서 그것은 부드러워진다.

갑자기 회전한다는 것은 다음과 같습니다. 사각형이 프레임 n에서 이동하지 않는다고 가정하면 회전 각도는 0도입니다. 그 다음 각도를 계산하는 위쪽 화살표를 누릅니다. 프레임 n + 1에서 각도는 30도입니다 (예 :). 물론 이것은 매끄럽지가 않습니다.

제 질문은 명확합니까? 어떻게해야합니까?

답변

1

각 프레임의 각도를 점진적으로 변경할 수 있습니다. 아주 '부드러운'회전 효과의 경우, smoothing_factorcurrent_angletarget_angle 수렴해야하는 속도를 제공

target_angle = ... 
current_angle += (target_angle - current_angle) * smoothing_factor 

를 사용할 수 있습니다. 예를 들어, 1의 값은 순간적이며, 0.1의 값은 아마 부드러운 효과를 줄 것입니다.

이렇게하면 10도에서 350도까지 바뀌는 것과 같은 무언가가 잘못된 방향으로 진행되는 문제가 발생할 수 있습니다. 이러한 경우에,

diff(a, b) { 
    return atan2(sin(a - b), cos(a - b)) 
} 

이 좋은 각도 차 수식 another question에서 촬영

target_angle = ... 
current_angle += diff(target_angle, current_angle) * smoothing_factor 

를 사용한다.

+0

완벽하게 작동합니다! 감사! – RaptorDotCpp

+0

회전 속도 시간을 독립적으로 만들려면 델타 시간을 포함해야합니다. – Paranaix

+0

@Paranaix 예, 지수 방정이어야하는이 방정식에 파라 메트릭 양식을 사용합니다. 애니메이션의 중요성과 이러한 노력이 가치가 있는지 여부에 달려 있습니다. – Zong