【问题标题】:Figure out acceleration to hit a target position with 0 velocity?找出加速度以0速度击中目标位置?
【发布时间】:2010-02-12 23:34:16
【问题描述】:

我正试图让我的模拟在特定点停止。我有我的起始位置、结束位置、我当前的速度和我想要到达那里的时间。自:

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,所以不需要疯狂的矢量东西。任何帮助将不胜感激:) 谢谢!

(编辑:格式化) (Edit2:更正更新 #2) (Edit3:更新现在显示 dt 而不是 t)

【问题讨论】:

  • 请注意,第一个等式中的“v”是初始速度,而不是平均速度。
  • 是的,当然。 “我目前的速度”

标签: language-agnostic math physics


【解决方案1】:

我们从 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 就可以解出一个。我得到-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?如果我希望这种减速花费更多/更少的时间怎么办?
  • 按照您所说的方式,我假设您想要持续加速。在那种情况下,只有一种解决方案,是的。
  • 这正是我做错的。我试图插入我自己的持续时间。
【解决方案2】:

一个可能的问题;从您目前所写的内容中不清楚的是,方程式:

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
  • 如果是这样,错误是我的,而不是他的。我正在尝试在速度之前进行定位的更新。
  • 先做哪一个并不重要。 (首先做速度 感觉 对我来说更正确,但我认为这并不重要。)取决于 t^2 的 x 方程是完全有效和正确的。但是将 (dt)^2 直接添加到您的位置没有意义。
  • @MatrixFrog adt^2/2 来自方程 x=x0+vt+a*t^2/2 with t=dt;它基本上解释了速度随着时间步长不断变化的事实;这也是为什么在方程的第二种形式中距离更新后速度增加的部分原因。如果没有它,您可能会在模拟中产生少量错误,如果使用正加速度,则可能会以距离目标太短的 x 结束。
  • 好的,我知道了。就个人而言,我更愿意将其排除在外,如果存在准确性问题,请尝试通过缩小 dt 来解决它们。这是否可能/可行取决于所使用的语言等。但这只是我,无论如何。
【解决方案3】:

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

所需的加速度是你给的:

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

当您想开始停止它时,只需在您的代码中指定 a

【讨论】:

  • 问题不是“公式有什么问题”,而是“我做错了什么”
  • @Sean,哦,所以你的“基本”引擎有问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 2022-10-19
相关资源
最近更新 更多