我正试图让我的模拟停在特定点上。我有我的起始位置,结束位置,我当前的速度以及我想要到达那里的时间。时间:
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)
答案 0 :(得分:2)
我们从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的答案计算每个时间步的瞬时速度,然后计算瞬时位置。
答案 1 :(得分: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是自上次更新以来的时间差异。获得更多信息 - 周围的代码,示例输入/输出等
将是有用的答案 2 :(得分:0)
为什么要更改物理公式?只需更改加速度,即可将对象停在您想要的位置。
您所要求的加速度是:
a = 2(d - vt) / t^2
只需在代码中指定a
即可开始停止。