首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >平滑didAccelerate消息

平滑didAccelerate消息
EN

Stack Overflow用户
提问于 2009-11-12 23:36:12
回答 1查看 326关注 0票数 0

我正在研究一种类似于测斜仪的东西。我使用传入的UIAcceleration变量根据在didAccelerate (来自UIAccelerometerDelegate)中计算出的角度旋转图像。图像抖动或抖动。即使手机平躺着不动也是如此。在应用商店里有一些测斜仪是超级平滑的。我试着通过检查最后一个读数来平滑它,如果它在一个范围内,什么都不做。这停止了一些抽动,但随后你进入了一些看起来像停止动画的东西。怎样才能获得更平滑的效果?

EN

回答 1

Stack Overflow用户

发布于 2009-11-13 00:10:41

我建议使用“临界阻尼弹簧”进行平滑。

本质上你要做的就是计算你的目标旋转(这就是你现在所拥有的)。您可以使用弹簧或弹性件将图像旋转附加到目标旋转,而不是直接将其应用于图像旋转。弹簧是有阻尼的,所以你不会有任何振动。

你需要一个常量来调整系统的反应速度,我们称之为SpringConstant。

基本上,我们对旋转施加两个力,然后随着时间的推移进行积分。第一个力是弹簧施加的力,Fs = SpringConstant * DistanceToTarget。第二个是阻尼力,Fd = -CurrentVelocity *2* sqrt(SpringConstant)

CurrentVelocity形成系统状态的一部分,并且可以被初始化为零。

在每一步中,将这两个力的总和乘以时间步长。这给出了CurrentVelocity的值的变化。

再乘以时间步长,就会得到位移。

我们将其添加到图像的实际旋转中。

在c++代码中:

代码语言:javascript
复制
float CriticallyDampedSpring( float a_Target,
                              float a_Current,
                              float & a_Velocity,
                              float a_TimeStep )
{
    float currentToTarget = a_Target - a_Current;
    float springForce = currentToTarget * SPRING_CONSTANT;
    float dampingForce = -a_Velocity * 2 * sqrt( SPRING_CONSTANT );
    float force = springForce + dampingForce;
    a_Velocity += force * a_TimeStep;
    float displacement = a_Velocity * a_TimeStep;
    return a_Current + displacement;
}

我想你有二维的旋转。你只需要为每个维度使用一次,并分别跟踪每个维度的速度。

在我使用的系统中,5对于弹簧常量来说是一个很好的值,但您必须根据您的情况进行实验。设置得太高不会消除急转弯,设置得太低会反应太慢。

而且,你最好创建一个保持速度状态的类,而不是一遍又一遍地把它传递给函数。

我希望这能对您有所帮助:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1723108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档