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

问题描述 投票:5回答:3

我想移动一定距离。但是,在我的系统中,存在惯性/阻力/负加速度。我为此使用了一个简单的计算方法:

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有什么方法可以使用分数值或缓动函数来做到这一点?根据我的经验,这样做的好处是,固定的加速度和基于帧的动画有时会超出最终点,需要强制执行,从而产生轻微的毛刺。

drag motion easing-functions
3个回答
7
投票

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

在某个时间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 );

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

如果要在有限步数的循环内使用此功能,则需要多加注意。循环的每次迭代代表一个时间段。对象将移动等于average速度乘以时间长度的量。迭代时间长度等于1的样本循环看起来像这样:

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

3
投票

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.