我正在编写一个模拟,其中一个物体在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
保持对象当前移动的实际速度。
然后在每个帧(更新步骤),基于期望的速度cv
和加速度值dv
设置当前速度acc
。这是通过简单地计算cv
和dv
之间的差异并将此差异限制为acc
来完成的。这样,物体开始缓慢移动并逐渐加速,最终达到全速。
到目前为止,这工作正常。现在我想利用acc
进行减速。当pos
和target
之间的距离达到某个值时,所需的速度dv
应设置为(0,0)
,以便对象逐渐减速直至达到完全停在目标位置。
我的问题是:如何计算我需要将dv
设置为(0,0)
的距离(即告诉系统停止移动),以便对象正确减速以停止完全在目标位置?
答案 0 :(得分:1)
使用运动方程:
v f 是你的最终速度,或0(你想要的速度)
v i 是您的初始速度,给定(物体当前移动的速度)。
a is acceleration
d是距离。
2 * a * d = v f 2 - v i 2
2 * a * d = 0 - v i 2
假设加速度为负,因此将两边乘以-1
| A |是加速度的绝对值(在你的情况下是减速度)
答案 1 :(得分:1)
您正在进行运动的离散时间模拟。保持简单的一种方法是以使加速和减速对称的方式执行计算。换句话说,加速时行驶的距离应与减速时行驶的距离相同。例如,假设
以下是离散时间模拟的进展方式
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;