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

Posted

技术标签:

【中文标题】计算初始速度以惯性移动设定距离【英文标题】:Calculate initial velocity to move a set distance with inertia 【发布时间】:2011-01-30 00:47:19 【问题描述】:

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

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

【问题讨论】:

Compiler error: Line #4: Missing ')'. 这个等式无论如何都不正确。你是从哪里想到这个的? 在我看来,这更像是mathoverflow.net 的话题。要修复编译器错误,请删除左括号之一。你有两个,但只关闭一个。 @senfo:mathoverflow 用于研究级数学。 我在打电话,刚刚意识到编译器错误是@KennyTM 的评论。 *** 需要更好的移动浏览器支持! ;-) 【参考方案1】:

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

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

【讨论】:

谢谢,我创建了一个简单的 HTML/jQuery 演示:pastebin.com/7R01Jh1Q 它似乎停止了所需的距离 - 我做错了什么吗? 循环的每次迭代都代表一段时间。您正在计算位置,就好像速度在整个时间段内都是恒定的,但我在答案中的计算假设速度是不断变化的。您可以通过使用该时间段内的平均速度来调整位置来对其进行校正。从该位置检索整数值似乎也存在一些错误,而不是将其作为浮点数进行跟踪。我已经向 pastebin.com/7R01Jh1Q 提交了一个似乎有效的更正。稍后我会在有时间时更新答案并提供更多详细信息。 感谢 Fiirhok,这太棒了!并且非常接近我想要的 - 我看不到你的 pastebin,所以这是另一个带有平均 + 更正的演示:pastebin.com/ekDwCYvj。有什么方法可以像我的第一个代码 sn-p 那样将加速度值作为分数/百分比来做到这一点?它很方便,因为它解决了模拟过冲目标的问题(可以在一定的小数位停止)。如果它太复杂,我会接受你的解决方案。 我可能搞砸了 pastebin,我在 pastebin.com/S47AzRdN 再次尝试过。如果您的加速度是速度的函数,我使用的技术将不起作用。您可以尝试求解微分方程,但我认为它不会起作用。看起来你想要的基本上是芝诺悖论的一个实现:en.wikipedia.org/wiki/Zeno's_paradoxes 是的,以这种方式加速将导致对象永远无法到达其目的地,我发现它的动画效果会稍微平滑一些,因为如果它在一帧上过冲,它就不需要捕捉到最终点.但我很高兴接受您的解决方案 - 我非常感激!【参考方案2】:

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

【讨论】:

非常感谢 Duffymo,据我所知,速度值在右侧中间,当我希望它单独在左侧时?插入我的值 - 在 1 秒内从 X 位置 0 到 100,以 25% 减速:100 = 0 + v * 1 - 0.5 * -25 * (1*1) 如果我完全偏离轨道,请道歉跨度> 【参考方案3】:

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

【讨论】:

感谢 Paul 并道歉 - 我没有数学背景(应该首先提到,编辑过的帖子),我希望有一个可以将我的值插入的计算机样式公式。

以上是关于计算初始速度以惯性移动设定距离的主要内容,如果未能解决你的问题,请参考以下文章

android ScrollView 滑动特效 怎么做成iphone那样有惯性弹性!

Unity相机跟随-----根据速度设置偏移量

用AS3中的惯性拖动假人

unity怎么计算物体移动速度

计算精灵根据需要行进的距离和行进速度改变大小的速度

惯性导航系统未导航前可以移动么