我想移动一定距离。但是在我的系统中存在惯性/拖动/负加速。我正在使用这样的简单计算:
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
有没有办法用分数值或缓动函数来做到这一点?根据我的经验,这样做的好处是固定加速度和基于帧的动画有时会超过最终点,需要强制进行,从而产生轻微的噼啪声。
答案 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)
如果要移动设定距离,请使用以下内容:
答案 2 :(得分:1)
行进距离只是速度相对于时间的积分。你需要将你的表达式与极限[v,0]的时间相结合,这将为你提供一个v(初始速度)的距离表达式。