Unity GameAI-(6)Obstacle Avoidance(原理)

动态避障 Dynamic Obstacle Avoidance

  • 我们在进行实际的AI操作时,和之前的避墙会有区别,当我们在运动时或者障碍物靠近时,应该如何去避免障碍物,这里就需要用到动态避障。

  • 关键思想(设置探针(Unity中使用射线),做碰撞检测)

  • 探针: ahead=position+normalize(velocity)*Max_SEE_AHEAD

  • Ahead为向量末端的坐标

  • 与其碰撞的物体即为将要发生碰撞的障碍物。

Unity GameAI-(6)Obstacle Avoidance(原理)_第1张图片
Paste_Image.png
  • Ahead的模越大,探针也就越长,就能更早的躲开障碍物。
  • 虚线为避障路线
Unity GameAI-(6)Obstacle Avoidance(原理)_第2张图片
Paste_Image.png

Check for collision(碰撞检测)

  • 做碰撞检测时一般使用两个探针ahead ,ahead2,ahead2为0.5的ahead,设置两个探针是为了避免障碍物已经在ahead里面的情况,因为碰撞检测是里ahead点到障碍物圆心的Distance进行判断的。
Unity GameAI-(6)Obstacle Avoidance(原理)_第3张图片
Paste_Image.png
  • 注意!!!!在unity中由于使用的是射线进行检测所有在只有一根射线的时候,射线的长度就不能很长,而是尽量的短一点,以避免以上检测不到的情况(许多小障碍物会直接透过去)。

  • 碰撞检测原理

Unity GameAI-(6)Obstacle Avoidance(原理)_第4张图片
Paste_Image.png
Unity GameAI-(6)Obstacle Avoidance(原理)_第5张图片
Paste_Image.png
  • 当同时检测到两个障碍物的情况时,要先去判断最威胁的一个障碍物,也就是距离最近的障碍物。
    • The Closest obstacle(most threatening) is selected for calculation
Unity GameAI-(6)Obstacle Avoidance(原理)_第6张图片
Paste_Image.png

计算碰撞的操控力

Calculating the Avoidance Force

Unity GameAI-(6)Obstacle Avoidance(原理)_第7张图片
Paste_Image.png
  • 在判断ahead离圆心远近时,如果离得远则给一个较小的操控力,离得近则给你一个较大的力,这里给一个恒定的力来实现。
Unity GameAI-(6)Obstacle Avoidance(原理)_第8张图片
Paste_Image.png

Avoidance force calculation. The dashed orange line shows the path the character will take to avoid the obstacle.

应用操控力

Unity GameAI-(6)Obstacle Avoidance(原理)_第9张图片
Paste_Image.png

碰撞检测的改进

Unity GameAI-(6)Obstacle Avoidance(原理)_第10张图片
Paste_Image.png
  • 当避障体已经在障碍物中时的处理方法,还要对this.transform.position与圆心距离进行判断。
Unity GameAI-(6)Obstacle Avoidance(原理)_第11张图片
Paste_Image.png
  • 第二种情况
    • 第二种情况发生在物体在旋转时遇到的碰撞检测
Unity GameAI-(6)Obstacle Avoidance(原理)_第12张图片
Paste_Image.png
Unity GameAI-(6)Obstacle Avoidance(原理)_第13张图片
Paste_Image.png

解决方案

Unity GameAI-(6)Obstacle Avoidance(原理)_第14张图片
Paste_Image.png

检测速度,当速度为0时,不对它添加操控力。
如果有速度,这根据这个速度的模和最大速度之间的比例进行控制。
dynamic_length的长度为0-1.

你可能感兴趣的:(Unity GameAI-(6)Obstacle Avoidance(原理))