【问题标题】:Inbetweening a rotation在旋转之间
【发布时间】:2013-06-18 20:04:18
【问题描述】:

我的屏幕左侧有一个图像(假设它是一个简单的矩形),我可以上下移动它。向上移动它时,我使用一些简单的三角函数来旋转它,使矩形“指向”屏幕的右上角。向下移动时,它指向屏幕的左下角。

鉴于我的应用程序使用以下坐标系:

我使用下面的代码来实现旋转:

// 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)。

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

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

我的问题清楚了吗?我该怎么办?

【问题讨论】:

    标签: c++ trigonometry


    【解决方案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

    【讨论】:

    • 需要注意的是要加上delta时间,使转速时间独立
    • @Paranaix 是的,然后我们将使用这个方程的参数形式,它应该是指数衰减。取决于动画的重要性以及这些额外的努力是否值得。
    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多