根据运动物体到目标的距离计算运动物体的速度
Calculating the speed of a moving object based on its distance to a target
我正在编写一个模拟,其中对象在 2D 世界中向目标位置移动,存储为矢量 target(x,y)
。对象位置也存储为位置向量 pos(x,y)
。该对象包含另外两个向量,即所需的移动速度 dv(x,y)
,以及当前的移动速度 cv(x,y)
。在模拟开始时,这两个速度矢量都是初始的,即设置为 (0,0)
.
当物体应该向目标位置移动时,我计算所需的速度矢量dv
,对其进行归一化,并按移动速度值缩放:
dv.set(target).sub(pos).normalize()
dv.scale(speed)
我想让运动看起来更逼真,这就是我使用两个速度矢量的原因。 dv
告诉我要移动对象的全速,cv
保存对象当前移动的实际速度。
然后在每一帧(更新步骤),根据所需速度 dv
和加速度值 acc
设置当前速度 cv
。这是通过简单地计算 cv
和 dv
之间的差异并将此差异限制为 acc
来完成的。这样物体开始缓慢移动并逐渐加速最终达到全速。
到目前为止一切正常。现在我也想利用 acc
来减速。当pos
和target
之间的距离为一定值时,需要设置速度dv
为(0,0)
,使物体逐渐减速直至到达在目标位置完全停止。
我的问题是:如何计算需要将 dv
设置为 (0,0)
的距离(即告诉系统停止运动),以便对象正确减速以停止 正好在目标位置?
使用运动方程:
vf2 = vi2 + 2 * a * d
vf 是你的最终速度,或者 0(你想要的速度)
vi 是给定的初始速度(物体当前移动的速度)。
a是加速度
d是距离。
求解 d:
2*a*d = vf2 - vi2
2*a*d = 0 - vi2
假设加速度为负,两边乘以-1
- 2*|a|*d = vi2
|一个|是你的加速度的绝对值(在你的情况下是减速度)
- d = vi2 / (2*|a|)
您正在对运动进行离散时间模拟。使事情简单化的一种方法是以加速和减速对称的方式执行计算。换句话说,加速时行驶的距离应与减速时行驶的距离相同。例如,假设
- 加速度为5
- 最高速度为13
- 物体一达到最高速度就开始减速
这是离散时间模拟的进展方式
first tick
old speed = 0
new speed = 5
distance = 5
second tick
old speed = 5
new speed = 10
distance = 15
third tick
old speed = 10
new speed = 13
distance = 28 <-- total distance while accelerating
fourth tick
old speed = 13
distance = 41
new speed = 10 <-- not 8!!!
fifth tick
old speed = 10
distance = 51
new speed = 5
sixth tick
old speed = 5
distance = 56 <-- Yay, twice the distance, we have symmetry
new speed = 0
这里有两个重点
- 加速时先更新速度再更新距离。减速时顺序相反,先更新距离,再更新速度。
- 减速时,将调整后的速度保持为加速度的倍数很重要
在C语言中,可以用下面的代码来更新减速过程中的速度
if ( old_speed % acceleration != 0 ) // if speed is not a multiple of acceleration
new_speed = old_speed - old_speed % acceleration; // reduce speed to a multiple of acceleration
else // otherwise
new_speed = old_speed - acceleration; // reduce speed by acceleration
如果加减速对称,那么计算减速距离和计算加速距离是一样的。
distance = acceleration * (1+2+3+ ... +N) + fudge_factor
其中
N
被 top_speed / acceleration
截断为整数,例如13/5 ==> 2
fudge_factor
是 0
如果最高速度是加速度的倍数,或者
top_speed
否则
可以通过注意
来简化计算
1+2+3+ ... +N = N * (N+1) / 2
在C中,减速时行驶的总距离可以计算如下
int top_speed = 13;
int acceleration = 5;
int N = top_speed / acceleration; // Note: in C, integer division truncates
int fudge = 0;
if ( top_speed % acceleration != 0 )
fudge = top_speed;
int distance = acceleration * (N * (N+1)) / 2 + fudge;
我正在编写一个模拟,其中对象在 2D 世界中向目标位置移动,存储为矢量 target(x,y)
。对象位置也存储为位置向量 pos(x,y)
。该对象包含另外两个向量,即所需的移动速度 dv(x,y)
,以及当前的移动速度 cv(x,y)
。在模拟开始时,这两个速度矢量都是初始的,即设置为 (0,0)
.
当物体应该向目标位置移动时,我计算所需的速度矢量dv
,对其进行归一化,并按移动速度值缩放:
dv.set(target).sub(pos).normalize()
dv.scale(speed)
我想让运动看起来更逼真,这就是我使用两个速度矢量的原因。 dv
告诉我要移动对象的全速,cv
保存对象当前移动的实际速度。
然后在每一帧(更新步骤),根据所需速度 dv
和加速度值 acc
设置当前速度 cv
。这是通过简单地计算 cv
和 dv
之间的差异并将此差异限制为 acc
来完成的。这样物体开始缓慢移动并逐渐加速最终达到全速。
到目前为止一切正常。现在我也想利用 acc
来减速。当pos
和target
之间的距离为一定值时,需要设置速度dv
为(0,0)
,使物体逐渐减速直至到达在目标位置完全停止。
我的问题是:如何计算需要将 dv
设置为 (0,0)
的距离(即告诉系统停止运动),以便对象正确减速以停止 正好在目标位置?
使用运动方程:
vf2 = vi2 + 2 * a * d
vf 是你的最终速度,或者 0(你想要的速度)
vi 是给定的初始速度(物体当前移动的速度)。
a是加速度
d是距离。
求解 d:
2*a*d = vf2 - vi2
2*a*d = 0 - vi2
假设加速度为负,两边乘以-1
- 2*|a|*d = vi2
|一个|是你的加速度的绝对值(在你的情况下是减速度)
- d = vi2 / (2*|a|)
您正在对运动进行离散时间模拟。使事情简单化的一种方法是以加速和减速对称的方式执行计算。换句话说,加速时行驶的距离应与减速时行驶的距离相同。例如,假设
- 加速度为5
- 最高速度为13
- 物体一达到最高速度就开始减速
这是离散时间模拟的进展方式
first tick
old speed = 0
new speed = 5
distance = 5
second tick
old speed = 5
new speed = 10
distance = 15
third tick
old speed = 10
new speed = 13
distance = 28 <-- total distance while accelerating
fourth tick
old speed = 13
distance = 41
new speed = 10 <-- not 8!!!
fifth tick
old speed = 10
distance = 51
new speed = 5
sixth tick
old speed = 5
distance = 56 <-- Yay, twice the distance, we have symmetry
new speed = 0
这里有两个重点
- 加速时先更新速度再更新距离。减速时顺序相反,先更新距离,再更新速度。
- 减速时,将调整后的速度保持为加速度的倍数很重要
在C语言中,可以用下面的代码来更新减速过程中的速度
if ( old_speed % acceleration != 0 ) // if speed is not a multiple of acceleration
new_speed = old_speed - old_speed % acceleration; // reduce speed to a multiple of acceleration
else // otherwise
new_speed = old_speed - acceleration; // reduce speed by acceleration
如果加减速对称,那么计算减速距离和计算加速距离是一样的。
distance = acceleration * (1+2+3+ ... +N) + fudge_factor
其中
N
被top_speed / acceleration
截断为整数,例如13/5 ==> 2
fudge_factor
是0
如果最高速度是加速度的倍数,或者top_speed
否则
可以通过注意
来简化计算1+2+3+ ... +N = N * (N+1) / 2
在C中,减速时行驶的总距离可以计算如下
int top_speed = 13;
int acceleration = 5;
int N = top_speed / acceleration; // Note: in C, integer division truncates
int fudge = 0;
if ( top_speed % acceleration != 0 )
fudge = top_speed;
int distance = acceleration * (N * (N+1)) / 2 + fudge;