CSDN个人博客地址,凯尔八阿哥栏http://blog.csdn.net/zhangxiao13627093203,转载请注明出处

接下来就是要进行更为精准更智能的追踪。因此,在接下来的代码演示Demo中我重新设计了几个类,一个是PlayObject,这个类其实也没有什么新的东西,都是之前已经介绍过的,无非就是速度向量、位置以及移动控制等它的代码设计如下:
</pre><span style="font-size:24px"></span><pre name="code" class="csharp">using UnityEngine;
using System.Collections;public class PlayObject : MonoBehaviour
{[HideInInspector]public float moveVx;//x方向的分速度[HideInInspector]public float moveVy;//y方向的分速度/// <summary>/// 2维坐标(x,y)/// </summary>public Vector2 Position{get{return new Vector2(this.transform.position.x, this.transform.position.y);}}private Vector2 _vHeading;/// <summary>/// //设置导弹的前进方向的归一化向量m_vHeading/// </summary>public Vector2 vHeading{get{float length = Mathf.Sqrt(moveVx * moveVx + moveVy * moveVy);if (length != 0){_vHeading.x = moveVx / length;_vHeading.y = moveVy / length;}return _vHeading;}}private Vector2 _vSide;/// <summary>/// 前进方向的垂直向量/// </summary>public Vector2 vSide{get{_vSide.x = -vHeading.y;_vSide.y = vHeading.x;return _vSide;}}/// <summary>/// 速度向量/// </summary>public Vector2 Velocity{get{return new Vector2(moveVx, moveVy);}}/// <summary>/// 速度标量/// </summary>public float Speed{get{return Mathf.Sqrt(moveVx * moveVx + moveVy * moveVy);}}public float MaxSpeedRate;// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){}/// <summary>/// 移动物体/// </summary>/// <param name="speedRate">移动的速度率,一般为1</param>/// <param name="isLookAtVelocityVector">是否要这是速度矢量与物体的朝向一致</param>public void Move(float speedRate, bool isLookAtVelocityVector){this.transform.position += new Vector3(moveVx * Time.deltaTime, moveVy * Time.deltaTime, 0) * speedRate;//  Debug.Log("x:" + m_postion.x + "y:" + m_postion.y);//调整导弹的朝向是的它和速度矢量合成方向一样if (isLookAtVelocityVector){LookAtVelocityVector();}}/// <summary>/// 使得物体始终朝向矢量速度的方向/// </summary>void LookAtVelocityVector(){float zAngles = Mathf.Atan(moveVx / moveVy) * (-180 / Mathf.PI);if (moveVy == 0){zAngles = moveVx > 0 ? -90 : 90;//跟以往的计算角度不同的是,这里加了moveVx==0的独立判断,这样可以在不控制的时候保持原状态if (moveVx == 0){zAngles = this.transform.rotation.eulerAngles.z;}}if (moveVy < 0){zAngles = zAngles - 180;}Vector3 tempAngles = new Vector3(0, 0, zAngles);Quaternion tempQua = this.transform.rotation;tempQua.eulerAngles = tempAngles;this.transform.rotation = tempQua;}
}

这样就可以很方便的操作我们的控制对象,作为使用例子我写了一个鼠标点击追踪算法,效果如图所示

它的核心代码如下:

<span style="font-size:24px;">using UnityEngine;
using System.Collections;
using UnityEngine.UI;public class AISeek : MonoBehaviour {public PlayObject plane;public Image Aim;public float vecChangeRate;//这个数值越大在目标点的穿梭次数就会越多,一般为1public float MaxSpeed;public float FleeDistance;Vector2 AimPos;// Use this for initializationvoid Start () {AimPos = new Vector2(Aim.transform.position.x, Aim.transform.position.y);}// Update is called once per framevoid Update(){if (Input.GetMouseButtonDown(0)){Aim.transform.position = Input.mousePosition;AimPos = new Vector2(Aim.transform.position.x, Aim.transform.position.y);}Vector2 moveVec = AI_Seek(AimPos);float length = Mathf.Sqrt(moveVec.x * moveVec.x + moveVec.y * moveVec.y);if (length != 0){//   Debug.Log("x:" + moveVec.x + "y:" + moveVec.y);plane.moveVx += vecChangeRate * moveVec.x / length;plane.moveVy += vecChangeRate * moveVec.y / length;}plane.Move(1, true);}Vector2 AI_Seek(Vector2 targetPos){Vector2 vSeekPos = targetPos - plane.Position;vSeekPos = vSeekPos.normalized*MaxSpeed - plane.Velocity;return vSeekPos;}
}
</span>

它的原理是:首先计算预期的速度,这个速度是智能体在理想化情况下到达目标位置所需的速度,它是从智能体到目标的向量,大小为智能体的最大速度,该方法返回的操控力是所需要的力,当把它加到智能体当前速度向量上就得到预期的速度。所以,你可以简单的从预期速度中减去智能体的当前速度。但是你很快就会发现这个算法的一个问题,就是飞机在到达指定目标位置后并没有停止下来,而是反复的往返穿越目标点,如图所示:

针对这个问题,我会在下一篇进行讲解,接下来要讲的还是和这个算法直接相关的东西,我必须要先把它讲完。

有追踪算法,那么肯定也要有反追踪算法,其实它的原理在基于追踪的原理上就显得非常简单了

<span style="font-size:24px;">   Vector2 AI_UNSeek(Vector2 targetPos){Vector2 disPos = plane.Position - targetPos;float distance = Mathf.Sqrt(disPos.x * disPos.x + disPos.y * disPos.y);if(distance>FleeDistance){return Vector2.zero;}disPos = disPos.normalized * MaxSpeed - plane.Velocity;return disPos;}</span>
看看这个代码和上面的AI_Seek(vecter2 targetPos)有什么不一样。我在反追踪代码上面还加了一个距离的判断,也就是当目标和 飞机的距离小于预设的追踪距离的时候就开始追踪,它的效果图如图所示

Unity人工智能学习—确定性AI算法之追踪算法三相关推荐

  1. python人工智能pdf_800G人工智能学习资料:AI电子书+Python语言入门+教程+机器学习等限时免费领取!...

    人工智能的热潮在今年再创高峰.无论是政策上还是资本市场上,抑或是我们日常生活中,关于人工智能的消息从未间断,逐渐占据我们每个人的视线.可以看出,人工智能得到了由上至下,国内国外的一致支持. 基于这股热 ...

  2. openmv学习之旅②之色块追踪算法的改善

    大家好,我是杰杰. 实在不好意思,最近比较忙,之前说的连载现在才更新出来. 从上一篇openmv的学习中openmv学习之旅① 我们可以很简单运用micropython在openmv上做我们想做的事情 ...

  3. Unity人工智能学习—躲避规则障碍一

    第一部分:效果预览先上效果图.这一部分将要讲的是智能躲避规则的障碍物.其实,这是最终现实效果,在算法中实际上使用到了 一个隐藏的碰撞检测盒子,这个盒子是从智能体延伸出的.如图所示:保持红色长方形区域不 ...

  4. 超全的AI人工智能学习路线图(内含大纲+视频+工具)

    为了让自学者们得到更贴合市场.更权威的AI人工智能学习资料,我向黑马申请到了很多新视频,很骄傲能给广大自学者提供一个这样优秀的学习资源(偷笑).不用理解我整理的辛苦,不用理解我整理时累的眼角都流哈喇子 ...

  5. 适合人工智能的编程语言有哪些 人工智能学习路线(2022.10.16)

    人工智能ai用什么编程语言_用于AI开发的6种最佳编程语言 人工智能ai用什么编程语言_用于AI开发的6种最佳编程语言_cxq8989的博客-CSDN博客 最适合人工智能开发的六种编程语言 最适合人工 ...

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

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

  7. 浅谈压缩感知(九):正交匹配追踪算法OMP

    浅谈压缩感知(九):正交匹配追踪算法OMP 主要内容: OMP算法介绍 OMP的MATLAB实现 OMP中的数学知识 一.OMP算法介绍 来源:http://blog.csdn.net/scucj/a ...

  8. MP算法与OMP算法讲解二

    转自:http://blog.csdn.net/scucj/article/details/7467955 主要介绍MP(Matching Pursuits)算法和OMP(Orthogonal Mat ...

  9. Unity人工智能编程精粹学习笔记 实现AI角色的自主移动——操控行为

    目录 操控行为 操控行为编程的主要基类 个体AI角色的操控行为 群体的操控行为 个体与群体的操控行为组合 几种操控行为的编程解析 操控行为的快速实现 操控行为编程的其他问题 总结 源码工程下载链接 操 ...

最新文章

  1. 将窗体中名称为iremark_习题三新
  2. python文本文档_python 文本文件操作
  3. 改进你的代码-扩展了一下IEnumerableT
  4. Factory Method(工厂方法)--对象创建型模式
  5. 关于/usr/bin/ld: cannot find -lXX的问题
  6. java 后台自动刷新请求_spring oauth2+JWT后端自动刷新access_token
  7. onvif学习笔记8:最近写的一个ONVIF客户端的心得小结
  8. Java中获取文件大小的正确方法
  9. 优达学城 python 人工智能入门_深度学习TensorFlow入门资源汇总-如何从零开发人工智能...
  10. html:运用表单表格制作简易个人简历
  11. 方法、方法的重载(Overload)与重写(Override)
  12. 推荐系统-基于用户的推荐在社交网络中的应用
  13. 冶金物理化学复习【6】吉布斯自由能的变化
  14. OpenCV python
  15. (二)立创EDA之新建工程,原理图,PCB
  16. pg日期转周_PostgreSQL 日期/时间类型
  17. vim,编辑文件后最简单的消除~ 和 .un~后缀文件生成的操作 ,重点为红色字体部分
  18. 神经网络的图像识别技术,神经网络的层数怎么看
  19. android代码连接wifi
  20. 微信小程序图片空白问题处理

热门文章

  1. BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三)
  2. 学报格式和论文格式一样吗_学报论文格式有哪些要求
  3. 胡新宇.华为.过劳死 ---转贴---
  4. Excel数据求和3种方法操作怎么简单怎么快怎么来
  5. 基于大数据的网站日志分析系统
  6. CorelDRAW2022订阅版本专属功能
  7. 服务器运维的软硬件维护
  8. 【安全与风险】密码安全和用户认证
  9. 32岁的我裸辞了,八年Java老鸟,只因薪水被应届生倒挂,在闭关三个月后拿到阿里Offer,定级P7
  10. easypoi 多sheet导入_EasyExcel写入百万级数据到多sheet---非注解方式