计算初始速度以使惯性移动设定距离

Mac*_*Elf 5 drag motion easing-functions

我想移动一定距离.但是在我的系统中存在惯性/拖动/负加速.我正在使用这样的简单计算:

v = oldV + ((targetV - oldV) * inertia)
Run Code Online (Sandbox Code Playgroud)

将其应用于多个帧会使运动"上升"或衰减,例如:

v = 10 + ((0 - 10) * 0.25) = 7.5 // velocity changes from 10 to 7.5 this frame
Run Code Online (Sandbox Code Playgroud)

所以我知道我想要旅行的距离和加速度,但不知道能让我到达那里的初始速度.也许一个更好的解释是我想知道有多难以击中一个台球,以便它停在某一点上.

我一直在研究运动方程(http://en.wikipedia.org/wiki/Equations_of_motion),但无法弄清楚我的问题的正确方法是什么......

有任何想法吗?谢谢 - 我来自设计而不是科学背景.

更新:Fiirhok拥有固定加速度值的解决方案; HTML + jQuery演示:
http://pastebin.com/ekDwCYvj
有没有办法用小数值或缓动函数做到这一点?根据我的经验,这样做的好处是固定加速度和基于帧的动画有时会超过最终点并需要强制,从而产生轻微的捕捉故障.

fii*_*hok 7

这是一个简单的运动学问题.

在某个时间t,恒定加速度下物体的速度(v)由下式描述:

v = v0 + at
Run Code Online (Sandbox Code Playgroud)

其中v0是初始速度,a是加速度.在你的情况下,最终的速度为零(对象停止)所以我们可以解决t:

t = -v0/a
Run Code Online (Sandbox Code Playgroud)

为了找到行进的总差异,我们采用速度的积分(第一个等式)随时间推移.多年来我没有完成任务,但我很确定这一点可以解决:

d = v0t + 1/2 * at^2
Run Code Online (Sandbox Code Playgroud)

我们可以用等式代替我们开发的ealier:

d = v0^2/a + 1/2 * v0^2 / a
Run Code Online (Sandbox Code Playgroud)

并解决v0:

v0 = sqrt(-2ad)
Run Code Online (Sandbox Code Playgroud)

或者,使用更多编程语言格式:

initialVelocity = sqrt( -2 * acceleration * distance );
Run Code Online (Sandbox Code Playgroud)

在这种情况下加速度是负的(对象减速),我假设它是常数,否则这会变得更复杂.

如果你想在一个有限步数的循环中使用它,你需要小心一点.循环的每次迭代代表一段时间.该对象将移动的量等于所述平均速度倍的时间长度.迭代时间长度等于1的样本循环看起来像这样:

position = 0;
currentVelocity = initialVelocity;
while( currentVelocity > 0 )
{
    averageVelocity = currentVelocity + (acceleration / 2);
    position = position + averageVelocity;
    currentVelocity += acceleration;
}
Run Code Online (Sandbox Code Playgroud)