如何计算加速度以达到目标位置时速度为0?

5

我想让我的模拟在特定点停止。我有起始位置、结束位置、当前速度和到达结束位置所需的时间。由于:

d = vt + (at^2)/2

我在思考
d = (end - start)
a = 2(d - vt) / t^2

但是当我运行它时,我的终点偏离了很远。我尝试使用两个简单的更新,第一个是:
v += a * dt
d += v * dt

并且第二:

d += v * dt + a * dt * dt / 2;
v += a * dt;

如果这很重要的话。在这种情况下,位置是1d,因此不需要疯狂的向量操作。任何帮助都将不胜感激 :) 谢谢!(编辑:格式化)(编辑2:更正更新#2)(编辑3:现在更新显示为dt而不是t)

请注意,您第一个公式中的“v”是初始速度而不是平均速度。 - Tyler
当然可以。"我的当前速度" - Sean
3个回答

3
我们从起点x_start(t=0)开始,以速度v_start前进,最终到达终点x_end并使速度为零。
由于我们有一个恒定的加速度,平均速度将为v_start/2,这意味着我们将在t_end = (x_end - x_start) / (v_start / 2)时到达x_end。
好的,那么我们可以使用x(t) = x_start + v_start * t + at^2/2。作为一种健全性检查,请插入t = 0,并确保您获得x = x_start。
然后插入t_end,您就可以解决a了。我得到的是-v^2/(2D),其中D为x_end-x_start。负号意味着你正在减速而不是加速。
如果您将此插入原始函数,则会得到:
x(t) = x_start + v_start * t - (v^2/4D) * t^2

如果你有一个计数器可以告诉你t的值(这个值将在0和t_end之间变化),你可以在每个时刻将对象移动到正确的位置。
或者(根据语言、环境等情况),你可以按照CoderTao的答案,在每个时间步长计算瞬时速度,然后计算瞬时位置。

那么t_end完全取决于v_start吗?如果我想要这种减速花费更多/少的时间怎么办? - Sean
以您的陈述方式来看,我认为您需要一个恒定的加速度。在这种情况下,只有一种解决方案,是的。 - Tyler
这正是我做错的地方。我试图插入自己的持续时间。 - Sean

0
一个可能的问题是,从你到目前为止所写的内容来看,不清楚的一点是方程式:
v+=a*t
d+=v*t
...
d+=v*t + a*t*t/2
v+=a*t

应该是:

v+=a*dt
d+=v*dt
...
d+=v*dt + a*dt*dt/2
v+=a*dt

其中dt是自上次更新以来的时间差。如果能提供一些更多的信息,比如周边代码、示例输入/输出等,会非常有用。


不太对。a*dt*dt/2 没有太多意义。一旦你知道瞬时速度,你只需要 d+=v*dt - Tyler
如果是这样,那么错误就是我的,而不是他的。我正在尝试一种在速度之前进行位置更新的方法。 - Sean
你先做哪一个并不是那么重要。(对我来说,先计算速度感觉更正确,但我认为这并不重要。)一个依赖于t^2的x方程是完全有效和正确的。但是直接将(dt)^2加到你的位置上是没有意义的。 - Tyler
1
@MatrixFrog,adt^2/2来自于方程x=x0+vt+a*t^2/2,其中t=dt;它基本上考虑了速度在时间步长内的连续变化,这也是为什么在第二个方程的距离更新之后增加速度的部分。如果没有它,你会预期在模拟过程中积累一小部分误差,如果使用正加速度,则最终结果会比目标位置短。 - CoderTao
好的,我现在明白了。就个人而言,我更喜欢将其排除在外,如果存在精度问题,则尝试通过缩小dt来解决。是否可行取决于所使用的编程语言等方面。但无论如何,这只是我的个人观点。 - Tyler

0

你为什么要改变你的物理公式?只需要改变加速度,使物体停在你想要的位置。

所需的加速度就是你所给出的:

a = 2(d - vt) / t^2

当你想要停止时,只需在代码中分配a


问题不在于公式有什么问题,而在于我对它做错了什么。 - Sean
@Sean,哦,你在使用“基础”引擎方面遇到了问题? - strager

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接