我已经为此尝试了典型的物理方程,但它们都没有真正起作用,因为方程式处理的是恒定的加速度,我的需要改变才能正常工作。基本上我有一辆可以在很大的速度范围内行驶的汽车,当它到达路径的末端时,需要减速并停留给定的距离和时间。
所以,我有:
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
,它会在行进0.2 pixels per timestep
时将其加速到d
。
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/60秒,则delta
为1.0,如果花费1/30,则delta
为0.5。在实际应用加速之前,将其乘以此增量值。类似地,在汽车再次移动之前,其速度乘以Δ值。这是非常标准的东西,但它可能是导致我的计算出现问题的原因。
答案 0 :(得分:9)
从起始速度a
到最终速度d
的距离Vi
的线性加速度Vf
:
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);
答案 1 :(得分:6)
对于线性系统(具有恒定加速度的系统),您给出的四个约束太多了,其中任何三个变量足以计算加速度,从而确定第四个变量。然而,对于完全一般的非线性系统,系统是 - 指定的 - 在满足所给出的所有约束的同时,可能存在无数无限的方式来改变加速度。您是否可以更好地指定哪种曲线加速度应随时间变化?
使用0指数表示“在开始时”,1表示“在结尾”,而D表示“变化”表示给定线性变化的加速度
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。
答案 2 :(得分:5)
如果你试图模拟方程中与时间相关的加速度,那就意味着你应该假设它。你必须将F = ma与加速度方程一起整合,这就是全部。如果加速度不是常数,你只需要求解一个方程组而不只是一个。
所以现在你必须同时整合三个矢量方程:一个用于位移,速度和加速度的每个分量,或总共九个方程。作为时间函数的力将是您问题的输入。
如果您正在假设1D运动,则可以使用三个联立方程式。速度和位移都很容易。
答案 3 :(得分:1)
在现实生活中,汽车的制动能力取决于刹车踏板上的压力,正在进行的任何发动机制动,表面状况等等:当汽车真正停止时,最后还会“抓住”。建模很复杂,你不太可能在编程网站上找到好的答案。找一些汽车工程师。
除此之外,我不知道你要求的是什么。你想确定制动时间表吗?如在滑行时有一定的减速度,然后应用制动器?在实际驾驶中,通常不会在这些操作中考虑时间,而是考虑距离。
据我所知,你的问题是你没有要求任何具体的东西,这表明你真的没有想出你真正想要的东西。如果您提供此示例用途,我们可能会帮助您。事实上,你已经提供了一个问题的基础,这个问题要么是过度确定的,要么是不受约束的,而我们真的无能为力。
答案 4 :(得分:1)
如果您需要在1米内以10米/秒到0米/秒的线性加速度,则需要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
答案 5 :(得分:0)
问题是过度约束还是欠约束(a不是常数?是否存在最大值?)或含糊不清。
最简单的公式是a =(Vf-V0)/ t
编辑:如果时间不受约束,且距离s受约束,且加速度恒定,则相关公式为s =(Vf + V0)/ 2 * t,t =(Vf-V0)/ a,这简化了到a =(Vf 2 - V0 2 )/(2s)。