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

动态避障 Dynamic Obstacle Avoidance

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

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

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

  • Ahead为向量末端的坐标

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

Paste_Image.png
  • Ahead的模越大,探针也就越长,就能更早的躲开障碍物。
  • 虚线为避障路线
Paste_Image.png

Check for collision(碰撞检测)

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

  • 碰撞检测原理

Paste_Image.png
Paste_Image.png
  • 当同时检测到两个障碍物的情况时,要先去判断最威胁的一个障碍物,也就是距离最近的障碍物。
    • The Closest obstacle(most threatening) is selected for calculation
Paste_Image.png

计算碰撞的操控力

Calculating the Avoidance Force

Paste_Image.png
  • 在判断ahead离圆心远近时,如果离得远则给一个较小的操控力,离得近则给你一个较大的力,这里给一个恒定的力来实现。
Paste_Image.png

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

应用操控力

Paste_Image.png

碰撞检测的改进

Paste_Image.png
  • 当避障体已经在障碍物中时的处理方法,还要对this.transform.position与圆心距离进行判断。
Paste_Image.png
  • 第二种情况
    • 第二种情况发生在物体在旋转时遇到的碰撞检测
Paste_Image.png
Paste_Image.png

解决方案

Paste_Image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容