我已经尝试了典型的物理方程,但没有一个是真正有效的,因为方程处理的是恒定加速度,而我的方程需要改变才能正确工作。基本上,我的车可以在很大的速度范围内行驶,当它到达终点时,需要在给定的距离和时间内减速和停车。
所以,我有:
V0,或当前速度
Vf,或我想要达到的速度(通常为0)
t,即我想要到达路径终点所需的时间
d,也就是我从V0更改为Vf时要走的距离
我想计算一下
a,或从V0转到Vf所需的加速
这成为一个特定于编程的问题的原因是,当汽车不断停下来时,每一个时间步都需要重新计算a。因此,V0不断地从上一个时间步长变为V0,plus是上一个时间步长计算出的a。因此,从本质上讲,它会开始缓慢停止,然后最终会更突然地停止,就像现实生活中的汽车一样。
编辑:
好的,谢谢你的回复。我需要的只是一些思考这个问题的帮助。现在让我说得更具体一些,因为我从你们所有人那里得到了更多的想法:
我有一个从目的地64 pixels的汽车c,所以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。在实际应用加速度之前,将其乘以此增量值。同样,在汽车再次移动之前,其速度将乘以增量值。这是非常标准的东西,但它可能是导致我的计算出现问题的原因。
发布于 2009-07-06 17:24:34
从起始速度Vi到最终速度Vf的距离的线性加速度a
a = (Vf*Vf - Vi*Vi)/(2 * d)编辑
编辑完后,让我来试试看你需要什么。
如果你使用这个公式并插入你的数字,你会得到-0,0309375的恒定加速度。现在,让我们继续将这个结果称为'a‘。
在时间戳(帧?)之间需要什么?实际上不是加速度,而是车辆的新位置,对吧?因此,您可以使用以下公式:
Sd = Vi * t + 0.5 * t * t * a其中Sd是与当前帧/moment/_of_deltas的起始位置之间的当前距离,Vi是起始速度,t是起始时间。
有了这个,你的减速是常数,但即使它是线性的,你的速度也会适应你的约束。
如果你想要非线性减速,你可以找到一些非线性插值方法,插值不是加速度,而是简单地定位在两点之间。
location = non_linear_function(time);发布于 2009-07-06 17:09:24
对于线性系统(一个具有恒定加速度的系统),您给出的四个约束多了一个,其中任何三个变量都足以计算加速度,从而确定第四个变量。然而,对于一个完全一般的非线性系统,该系统的规定是不够的--可能有无数种方法可以随着时间改变加速度,同时满足所有给定的约束条件。您是否可以更好地指定随时间变化的曲线加速度类型?
使用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中留下两个线性方程,这样你就可以求解这些方程(但我保留这种形式是为了更容易仔细检查我的推导!)。
如果你在每一步都应用适当的公式来计算空间和速度的变化,那么无论你是一次性计算a0和a1,还是根据剩余的Dt,Ds和DV在每一步重新计算它们,应该没有区别。
发布于 2009-07-06 17:11:23
如果你试图在你的方程中模拟依赖时间的加速度,这只是意味着你应该假设。你必须积分F= ma和加速度方程,仅此而已。如果加速度不是常数,你只需要解一组方程,而不是一个方程。
所以现在实际上是三个向量方程,你必须同时积分:位移,速度和加速度的每个分量,或者说总共九个方程。作为时间函数的力将是问题的输入。
如果你假设一维运动,你就会得到三个联立方程。速度和位移的问题都很简单。
https://stackoverflow.com/questions/1088088
复制相似问题