我正在研究一种类似于测斜仪的东西。我使用传入的UIAcceleration变量根据在didAccelerate (来自UIAccelerometerDelegate)中计算出的角度旋转图像。图像抖动或抖动。即使手机平躺着不动也是如此。在应用商店里有一些测斜仪是超级平滑的。我试着通过检查最后一个读数来平滑它,如果它在一个范围内,什么都不做。这停止了一些抽动,但随后你进入了一些看起来像停止动画的东西。怎样才能获得更平滑的效果?
发布于 2009-11-13 00:10:41
我建议使用“临界阻尼弹簧”进行平滑。
本质上你要做的就是计算你的目标旋转(这就是你现在所拥有的)。您可以使用弹簧或弹性件将图像旋转附加到目标旋转,而不是直接将其应用于图像旋转。弹簧是有阻尼的,所以你不会有任何振动。
你需要一个常量来调整系统的反应速度,我们称之为SpringConstant。
基本上,我们对旋转施加两个力,然后随着时间的推移进行积分。第一个力是弹簧施加的力,Fs = SpringConstant * DistanceToTarget。第二个是阻尼力,Fd = -CurrentVelocity *2* sqrt(SpringConstant)
CurrentVelocity形成系统状态的一部分,并且可以被初始化为零。
在每一步中,将这两个力的总和乘以时间步长。这给出了CurrentVelocity的值的变化。
再乘以时间步长,就会得到位移。
我们将其添加到图像的实际旋转中。
在c++代码中:
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对于弹簧常量来说是一个很好的值,但您必须根据您的情况进行实验。设置得太高不会消除急转弯,设置得太低会反应太慢。
而且,你最好创建一个保持速度状态的类,而不是一遍又一遍地把它传递给函数。
我希望这能对您有所帮助:)
https://stackoverflow.com/questions/1723108
复制相似问题