这是使用“临界阻尼弹簧”的完美候选者。
从概念上讲,您可以使用弹簧或松紧带将该点连接到目标点。弹簧受到阻尼,因此不会“弹跳”。您可以通过更改称为“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 的值是开始试验弹簧常数值的好时机。设置太高会导致反应太快,设置太低会导致反应太慢。
请注意,您可能最好创建一个保持速度状态的类,而不必一遍又一遍地将其传递到函数中。
我希望这对您有帮助,祝您好运:)
EDIT:如果它对其他人有用,可以很容易地将其应用到 2 或 3 维。在这种情况下,您只需为每个维度独立应用一次 CriticallyDampedSpring。根据您想要的运动,您可能会发现在极坐标(对于 2D)或球坐标(对于 3D)中工作更好。