概述
在Unity的NavMesh官方文档中提到,转向逻辑采用下一个拐角的位置并基于该位置计算出到达目标所需的方向和速度,但使用所需的速度移动物体可能会导致与其他物体发生碰撞。
动态避障系统将选择新的速度,该速度可平衡“物体在所需方向上移动”和“防止未来与其他物体及导航网格边缘发生碰撞”这两个问题。Unity 采用倒数速度障碍物 (RVO) 来预测和防止碰撞。
思路
速度向量视角
速度障碍域
速度障碍域是指两个物体的速度向量差落在该区域时,二者会在未来产生碰撞;
由于两个圆都有半径,所以取碰撞半径为 rA + rB;
例如如图所示情况时,由于速度向量差并没有落在速度障碍域上,所以AB未来时间内不会碰撞;
但是如果变成了这种情况,很明显AB在未来时间会碰撞,此时就需要修正AB的速度来实现动态避障;
修正速度
当速度向量差落在如图所示位置时,显然最短修正速度向量u为图中绿色的部分
当速度向量差位置是另一种情况时,显然,最短修正速度向量u可以通过正交后得出
确定修正速度u后,将其应用到物体上就可以了。当然,除了如图所示的将u全部作用于A上,也可以让u/2作用于A上,-u/2作用于B上;
速度半平面
刚才讨论的修正速度u是最短修正速度。实际上,除了最短修正速度,还有无数种修正速度的方案。这些可以实现避障的修正速度所形成的集合就是速度半平面,意思是只要修正后速度落在速度半平面内,两个物体就不会发生碰撞;
当有多个物体同时运动时,多个速度半平面的交集就是最终修正后速度的集合了。