6

我想将某物移动一段固定距离。但是在我的系统中存在惯性/阻力/负加速度。我正在使用这样的简单计算:

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 有没有办法用小数值或缓动函数来做到这一点?根据我的经验,这样做的好处是固定的加速度和基于帧的动画有时会超出最终点并且需要强制,从而产生轻微的捕捉故障。

4

3 回答 3

8

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

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

v = v0 + at

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

t = -v0/a

为了找到行进的总差,我们对速度(第一个方程)随时间积分。我已经很多年没有做过积分了,但我很确定这个可以:

d = v0t + 1/2 * at^2

我们可以用等式代替我们之前开发的 t:

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;
}
于 2010-03-21T16:18:00.993 回答
3

如果要移动设定的距离,请使用以下命令:

替代文字

于 2010-03-21T12:42:42.400 回答
1

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

于 2010-03-21T12:41:09.963 回答