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

时间:2010-03-21 12:36:03

标签: drag motion easing-functions inertia

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

v = oldV + ((targetV - oldV) * inertia)

在多个帧上应用它会使运动“上升”或衰减,例如:

v = 10 + ((0 - 10) * 0.25) = 7.5 // velocity changes from 10 to 7.5 this frame

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

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

有什么想法吗?谢谢 - 我来自设计而非科学背景。

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

3 个答案:

答案 0 :(得分:7)

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

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

v = v0 + at

其中v0是初始速度,a是加速度。在您的情况下,最终速度为零(对象停止),因此我们可以求解t:

t = -v0/a

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

d = v0t + 1/2 * at^2

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

d = v0^2/a + 1/2 * v0^2 / a

解决v0:

v0 = sqrt(-2ad)

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

initialVelocity = sqrt( -2 * acceleration * distance );

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

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

position = 0;
currentVelocity = initialVelocity;
while( currentVelocity > 0 )
{
    averageVelocity = currentVelocity + (acceleration / 2);
    position = position + averageVelocity;
    currentVelocity += acceleration;
}

答案 1 :(得分:3)

如果要移动设定距离,请使用以下内容:

alt text

答案 2 :(得分:1)

行进距离只是速度相对于时间的积分。你需要将你的表达式与极限[v,0]的时间相结合,这将为你提供一个v(初始速度)的距离表达式。