9

我已经为此尝试了典型的物理方程,但它们都没有真正起作用,因为方程处理恒定加速度,而我的需要改变才能正常工作。基本上,我有一辆可以在很大范围内行驶的汽车,当它到达路径的尽头时,需要在给定的距离和时间内减速和停车。

所以,我有:
V0,或者当前速度
Vf,或者我想要达到的速度(通常为 0)
t,或者我想要到达路径尽头的时间
d,或者当我改变时我想要走的距离从 V0 到 Vf

我想计算
a,或者从 V0 到 Vf 所需的加速度

这成为特定于编程的问题的原因是因为a随着汽车不断停止,需要在每个时间步重新计算。因此,V0不断更改为V0从上一个时间步开始plus计算a上一个时间步。所以本质上它会开始慢慢停止,然后最终会更突然地停止,有点像现实生活中的汽车。

编辑:
好的,感谢您的出色回应。我需要的很多东西只是思考这个问题的一些帮助。现在让我更具体一些,因为我从你们那里得到了更多的想法:

c我有一辆车64 pixels从目的地出发,所以d=64。它正在行驶2 pixels per timestep,在哪里timestep is 1/60 of a second。我想找到它的加速度,让它在它经过时a达到 100 的速度。0.2 pixels per timestepd
d = 64 //distance
V0 = 2 //initial velocity (in ppt)
Vf = 0.2 //final velocity (in ppt)

同样因为这发生在游戏循环中,所以delta每个动作都会传递一个变量,即multiple of 1/60s that the last timestep took. 换句话说,如果花费了 1/60s,delta则为 1.0,如果花费了 1/30s,delta则为 0.5。在实际应用加速度之前,它乘以这个增量值。同样,在汽车再次移动之前,它的速度乘以 delta 值。这是非常标准的东西,但它可能是导致我的计算出现问题的原因。

4

6 回答 6

9

从起始速度到最终速度a的距离的线性加速度:dViVf

a = (Vf*Vf - Vi*Vi)/(2 * d)

编辑

在你编辑之后,让我试着衡量你需要什么......

如果你采用这个公式并插入你的数字,你会得到 -0,0309375 的恒定加速度。现在,让我们继续称这个结果为“a”。

您在时间戳(帧?)之间需要的实际上不是加速度,而是车辆的新位置,对吧?因此,您使用以下公式:

Sd = Vi * t + 0.5 * t * t * a

其中 Sd 是当前帧/时刻/sum_of_deltas 处距起始位置的当前距离,Vi 是起始速度,t 是从起始开始的时间

有了这个,你的减速恒定的,但即使它是线性的,你的速度也会适应你的限制。

如果你想要一个非线性减速,你可以找到一些非线性插值方法,并且插值不是加速度,而只是两点之间的位置。

location = non_linear_function(time);
于 2009-07-06T17:24:34.267 回答
6

您给出的四个约束对于线性系统(一个具有恒定加速度的)来说太多了,其中任何三个变量都足以计算加速度,从而确定第四个变量。然而,对于一个完全一般的非线性系统,该系统的规定不足——可能有无数种方法可以随着时间的推移改变加速度,同时满足给定的所有约束。您能否更好地指定随着时间的推移应该改变什么样的曲线加速度?

给定线性变化的加速度,使用 0 索引表示“开始”,1 表示“结束”,使用 D 表示 Delta 表示“变化”

  a(t) = a0 + t * (a1-a0)/Dt

其中 a0 和 a1 是我们要计算以满足所有各种约束的两个参数,我计算(如果没有失误,因为我都是手动完成的):

DV = Dt * (a0+a1)/2
Ds = Dt * (V0 + ((a1-a0)/6 + a0/2) * Dt)

鉴于 DV、Dt 和 Ds 均已给出,这会在未知数 a0 和 a1 中留下 2 个线性方程,因此您可以解决这些问题(但我将其保留为这种形式是为了更容易仔细检查我的推导!!! )。

如果您在每一步都应用正确的公式来计算空间和速度的变化,那么无论是一次性计算 a0 和 a1 还是根据剩余的 Dt、Ds 和 DV 在每一步重新计算它们都应该没有区别。

于 2009-07-06T17:09:24.373 回答
5

如果你试图在你的方程中模拟一个时间相关的加速度,这只是意味着你应该假设。您必须将 F = ma 与加速度方程结合起来,仅此而已。如果加速度不是恒定的,你只需要求解一个方程组而不是一个方程组。

所以现在你必须同时积分三个向量方程:位移、速度和加速度的每个分量一个,或者总共九个方程。作为时间函数的力将成为您问题的输入。

如果您假设一维运动,则可以使用三个联立方程。速度和位移都非常简单。

于 2009-07-06T17:11:22.747 回答
1

在现实生活中,汽车的停止能力取决于制动踏板上的压力、正在进行的任何发动机制动、表面条件等:此外,当汽车真正停止时,还有最后的“抓地力”。建模很复杂,您不太可能在编程网站上找到好的答案。找一些汽车工程师。

除此之外,我不知道你在问什么。您是否正在尝试确定制动时间表?就像在滑行时有一定程度的减速,然后刹车?在实际驾驶中,这些动作通常不考虑时间,而是考虑距离。

据我所知,你的问题是你没有要求任何具体的东西,这表明你真的没有弄清楚你真正想要什么。如果您为此提供示例使用,我们可能会为您提供帮助。事实上,你已经提供了一个问题的核心,要么是过度确定的,要么是限制不足的,而我们真的无能为力。

于 2009-07-06T17:28:36.037 回答
1

如果您需要在 1m 内以线性加速度从 10m/s 到 0m/s,您需要 2 个方程。首先找到停止所需的时间(t)。

v0 = initial velocity
vf = final velocity
x0 = initial displacement
xf = final displacement
a = constant linear acceleration

(xf-x0)=.5*(v0-vf)*t
t=2*(xf-x0)/(v0-vf)
t=2*(1m-0m)/(10m/s-0m/s)
t=.2seconds

next to calculate the linear acceleration between x0 & xf

(xf-x0)=(v0-vf)*t+.5*a*t^2
(1m-0m)=(10m/s-0m/s)*(.2s)+.5*a*((.2s)^2)
1m=(10m/s)*(.2s)+.5*a*(.04s^2)
1m=2m+a*(.02s^2)
-1m=a*(.02s^2)
a=-1m/(.02s^2)
a=-50m/s^2

in terms of gravity (g's)

a=(-50m/s^2)/(9.8m/s^2)
a=5.1g over the .2 seconds from 0m to 10m
于 2014-06-23T23:41:24.520 回答
0

问题要么是过度约束,要么是约束不足(a 不是常数?是否有最大值 a?)或模棱两可。

最简单的公式是 a=(Vf-V0)/t

编辑:如果时间不受约束,距离 s 受约束,加速度恒定,则相关公式为 s = (Vf+V0)/2 * t, t=(Vf-V0)/a 简化为 a = (Vf 2 - V0 2 ) / (2s)。

于 2009-07-06T17:10:06.933 回答