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是矩形图像的位置(左上角)。(有关信息atan2(): cplusplus.com 上的atan2())。

这很好用:当远离参考点 (res) 时,它会旋转得更多。但是,假设图像一直位于屏幕底部。如果我们向上移动它,它会非常突然地旋转。我想在这个旋转“中间”,让它变得平滑。

我所说的突然旋转的意思是:假设矩形在第 n 帧中没有移动:因此它的旋转为 0 度。然后我按向上箭头,它会计算角度。在第 n+1 帧中,角度为 30 度(例如)。这当然不是很顺利。

我的问题清楚吗?我该怎么做?

4

1 回答 1

1

您可以逐步更改每帧的角度。对于非常“平滑”的旋转效果,您可以使用

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

where给出应该收敛到smoothing_factor的速率。例如,值 1 将是瞬时的,值 0.1 可能会产生平滑效果。current_angletarget_angle

通过这样做,您可能会遇到环绕问题,即从 10 度到 350 度这样的事情会走错路。在这种情况下,使用

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

在哪里

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

这个很好的角度差公式取自另一个问题

于 2013-06-21T18:06:19.553 回答