动态避障 Dynamic Obstacle Avoidance
我们在进行实际的AI操作时,和之前的避墙会有区别,当我们在运动时或者障碍物靠近时,应该如何去避免障碍物,这里就需要用到动态避障。
关键思想(设置探针(Unity中使用射线),做碰撞检测)
探针: ahead=position+normalize(velocity)*Max_SEE_AHEAD
Ahead为向量末端的坐标
与其碰撞的物体即为将要发生碰撞的障碍物。
- Ahead的模越大,探针也就越长,就能更早的躲开障碍物。
- 虚线为避障路线
Check for collision(碰撞检测)
- 做碰撞检测时一般使用两个探针ahead ,ahead2,ahead2为0.5的ahead,设置两个探针是为了避免障碍物已经在ahead里面的情况,因为碰撞检测是里ahead点到障碍物圆心的Distance进行判断的。
注意!!!!在unity中由于使用的是射线进行检测所有在只有一根射线的时候,射线的长度就不能很长,而是尽量的短一点,以避免以上检测不到的情况(许多小障碍物会直接透过去)。
碰撞检测原理
- 当同时检测到两个障碍物的情况时,要先去判断最威胁的一个障碍物,也就是距离最近的障碍物。
- The Closest obstacle(most threatening) is selected for calculation
计算碰撞的操控力
Calculating the Avoidance Force
- 在判断ahead离圆心远近时,如果离得远则给一个较小的操控力,离得近则给你一个较大的力,这里给一个恒定的力来实现。
Avoidance force calculation. The dashed orange line shows the path the character will take to avoid the obstacle.
应用操控力
碰撞检测的改进
- 当避障体已经在障碍物中时的处理方法,还要对this.transform.position与圆心距离进行判断。
- 第二种情况
- 第二种情况发生在物体在旋转时遇到的碰撞检测
解决方案
检测速度,当速度为0时,不对它添加操控力。
如果有速度,这根据这个速度的模和最大速度之间的比例进行控制。
dynamic_length的长度为0-1.