第一部分:效果预览先上效果图。这一部分将要讲的是智能躲避规则的障碍物。其实,这是最终现实效果,在算法中实际上使用到了

一个隐藏的碰撞检测盒子,这个盒子是从智能体延伸出的。如图所示:保持红色长方形区域不被碰撞就可以躲避障碍物了。检测盒的宽度等于智能体的包围半径

它的长度正比于智能体的当前速度,即它移动的越快,检测盒子就越长。如图所示为实际的效果图:

第二部分:算法讲解
1、寻找最近的相交点
检测与障碍物的相交点的过程是相当复杂的,所以下面逐步讲解。
(1)、智能体只考虑哪些在检测盒内的障碍物。初始的时候,要将游戏世界中所有的障碍物都迭代到内存中,并标记哪些在检测盒内的障碍物以作进一步分析。
(2)、然后把所有已经标记的障碍物都转换到智能体的局部空间。转换坐标后,那些x坐标为负值的物体将不被考虑,所以问题就变得简单多了
(3)、接下来必须要检测障碍物是否和检测盒重叠。使障碍物的包围半径扩大检测盒宽度的一半。然后测试该障碍物的y值是否小于这个值(即障碍物的包围半径加上检测盒宽度的一半)。如果不小于,那么该障碍物将不会与检测盒相交,可以不处理如图所示是上述三种情况的示意图:
(4)、此时,只剩下那些与检测盒相交的障碍物了。接下来我们找出离智能体最近的相交点。再一次在局部空间中计算,第三步中扩大了障碍物的包围半径。用简单的线圆周相交测试方法可以得到被扩大的圈和x轴的相交点。如图所示:
有两个相交点(我们不用但系和交通工具 相切的情况,交通工具将擦过障碍物)。注意如下情况,在智能体前面可能有个障碍物,但和智能体相交在交通工具的后部,如上图所示的障碍物A,和交通工具的后部有个交点该算法将不处理这种情况,只考虑在x轴上的交点。此算法测试所有剩下的障碍物,从中找出一个有最近(正的)相交点的障碍物。在讲解如何计算操控力之前,先列出实现躲避障碍物算法中的相关代码:
 Vector2 AI_ObstacleAvoidance(){//检测盒子长度正比于智能体的速度m_dDboxLength = MinDetectBoxLength + (Plane.Speed/Plane.MaxSpeed) * MinDetectBoxLength;detectBox.rectTransform.localScale = new Vector3(1, m_dDboxLength / 50, 0);//Debug.Log(m_dDboxLength);TagNeighbors(m_dDboxLength);TagObstacles ClosestIntersectiongObstacle = null;Vector2 LocalPosOfClosestObstacle = new Vector2();//记录被转换的局部坐标。float DisttToClosestIP = float.MaxValue;foreach (TagObstacles obj in TagObstaclesList){//处理被标记的障碍物if (obj.isTag){Debug.Log(obj.gameObject.name + "Posx:" + obj.postion.x + "y:" + obj.postion.y);Vector2 LocalPos = PointToLocalSpace(ref obj.postion, Plane.vHeading,  Plane.vSide, Plane.LocalPosition);//这个plane的一定要是局部坐标//  Debug.Log("x:"+LocalPos.x+"y:"+LocalPos.y);//如果在导弹的局部坐标的正X轴即处理,否则就丢弃,因为在负X轴的都是在导弹的后面if (LocalPos.x >= 0){//如障碍物带局部坐标系的X轴的距离小于障碍物的半径+检测盒宽度的一半,那么可能相交float ExpandedRadius = obj.gameObject.GetComponent<SphereCollider>().radius + m_dDboxWidth / 2;if (Mathf.Abs(LocalPos.y) < ExpandedRadius){//现在做线/圆周相交测试。圆周的中心是(cX,cY)//相交点的公式是x=cX-Mathf.Sqrt(r^2-cY^2)此时y=0。我们只需要看x的最小正值,因为那是最近的相交点float cX = LocalPos.x;float cY = LocalPos.y;//我们只需要计算一次上面等式的开方float SqrtPart = Mathf.Sqrt(ExpandedRadius * ExpandedRadius - cY * cY);float ip = cX - SqrtPart;if (ip <= 0){ip = cX + SqrtPart;}//                       Debug.Log("ip:" + ip + "DisttToClosestIP:" + DisttToClosestIP);//测试是否这是目前为止最近的,如果是,记录这个障碍物和它的局部坐标。if (ip < DisttToClosestIP){DisttToClosestIP = ip;ClosestIntersectiongObstacle = obj;LocalPosOfClosestObstacle = LocalPos;}}}}}//如果找到一个相交的障碍物,计算一个远离它的操作力,分别计算在局部空间这个力的X和Y方向的分量Vector2 SteeringForce = new Vector2();if (ClosestIntersectiongObstacle != null){//导弹距离障碍物越近,在局部空间Y方向的制动力就会越强,计算这个影响因子float multiplier = 1.0f + (m_dDboxLength - LocalPosOfClosestObstacle.x) / m_dDboxLength;//计算这个力:障碍物的包围半径减去其在局部坐标空间的Y值SteeringForce.y = (ClosestIntersectiongObstacle.gameObject.GetComponent<SphereCollider>().radius - LocalPosOfClosestObstacle.y) * multiplier;//添加一个在局部空间X方向的制动力来作为刹车,它正比于导弹到障碍物的距离float BrakeingWeight = 0.2f;SteeringForce.x = (ClosestIntersectiongObstacle.gameObject.GetComponent<SphereCollider>().radius - LocalPosOfClosestObstacle.x) * BrakeingWeight;//  Debug.Log("x:" +SteeringForce.x + "y:" + SteeringForce.y);}//最后将这个控制力的局部坐标转换到世界坐标空间return VectorToWorldSpace(ref SteeringForce, Plane.vHeading, Plane.vSide);}
这里面有一个从世界坐标到局部坐标的转换以及如何调整智能体的运动方向使其平滑规避障碍物,这些将会在
下一节讲解

Unity人工智能学习—躲避规则障碍一相关推荐

  1. Unity人工智能学习—确定性AI算法之追踪算法三

    CSDN个人博客地址,凯尔八阿哥栏http://blog.csdn.net/zhangxiao13627093203,转载请注明出处 接下来就是要进行更为精准更智能的追踪.因此,在接下来的代码演示De ...

  2. Unity人工智能机器学习(环境安装篇)

    Unity人工智能学习,需要搭建一个机器学习的环境(Python环境和tensorboard) 使用Anaconda便可快速搭建 以下是汽车自动驾驶绕开障碍物的机器学习演示: 机器学习前: 机器学习训 ...

  3. Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)

    Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...

  4. AI 人工智能学习路线

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 相关视频资料下载见:https://blog.csdn.net/qwxwaty/article/de ...

  5. 人工智能学习路线(转载)

    人工智能都包括什么? 人工智能包括现在非常流行的一些网络词语:人工智能->机器学习->深度学习. 图片来自于网络. 怎样学习? 路径一:一步一个脚印,扎扎实实从基础学起,逐步提高学习难度 ...

  6. Python全栈+人工智能学习路线

    2019最新Python全栈+人工智能学习路线升级版 全面涵盖前端.后端.爬虫.数据挖掘.人工智能等课程(课程大纲+视频教程+网盘资源下载)! https://www.cnblogs.com/coff ...

  7. python+人工智能学习线路

    小白学Python最苦恼的是路线怎么走,怎样才不会走弯路,这里分享一份Python+人工智能的学习方案及目标.感兴趣的可以看看. 第一阶段 Python核心编程 学习内容技术要点 计算机组成原理认识操 ...

  8. 人工智能学习之机器人路径规划优化

    人工智能学习之基于A*算法的机器人路径规划优化 前言 大三下学期,学习了人工智能,因为要备研,上课基本上没怎么听,故也就没怎么学,这是一门考查课,最后要完成布置的大作业,作为算分的依据,就选一个简单的 ...

  9. Python人工智能学习路线(万字长文)

    前言 随着全球市场的饱和,以及模式创新的用尽,传统的互联网产业已经进入成熟阶段,不会再有突飞猛进的发展. (文末送读者福利) 接下来,是人工智能和大数据展露锋芒的时候了,它们在未来 10 年一定会快速 ...

最新文章

  1. R语言set.seed函数的意义及实战
  2. 实践1-qq邮箱主页
  3. Shiro集成Web时的Shiro JSP标签
  4. bash的配置文件定义
  5. 2021年宝鸡中学高考成绩查询,宝鸡各高中2020年高考喜报成绩一览
  6. Spring MVC 源码-初始化阶段
  7. Service Fabric下删除实例并注销应用
  8. [html] 浏览器内多个标签页之间的通信方式有哪些?
  9. 【视频点播最佳实践】使用OSS SDK上传视频到点播
  10. php 操件文件指定编码,(PHP帮助)如果文件中存在特定编号,请执行此操作
  11. python中的进程池:multiprocessing.Pool()
  12. 11-6-线程的概念
  13. BI在企业数字化转型中的价值
  14. easyBCD多系统引导软件
  15. 苹果mac Dock窗口预览工具:DockView
  16. 地图Web服务API接口——搜索POI(以高德地图为例)
  17. 计算机专业研究生核心能力培养(0)——计算机专业要不要读研?
  18. NAND flash 基础知识
  19. 单片机控制电路的多图纸原理图和层次式设计
  20. (五)carla中世界坐标系与相机坐标系、像素坐标系变换

热门文章

  1. 电脑出问题解决办法(Win11)
  2. 写给那些希望通过婚姻改变命运的姑娘
  3. CloudCompare多个pcd文件的拼接为1个pcd
  4. DDD实战与进阶 - 值对象
  5. std::for_each 用法
  6. 计算机网络-多路复用
  7. C语言函数(Function)
  8. 集福宝- 支付宝 集福神器 2020 【三年集福老品牌】
  9. 长工微电子杯企业赛获奖经验分享
  10. HTTP/2 504 Gateway Timeout 36369ms