正如你所见,这是一个非常简单的脚本,它有一个Length属性,如果发起请求,就可以返回航点数组的长度和大小。GetPoint方法返回数组中指定下标位置的特定航点的位置。

然后,Unity调用OnDrawGizmos方法,以在编辑器环境中绘制出组件,在游戏视图中,如果不打开gizmos,那么这些绘图是不会渲染的。

public class Path : MonoBehaviour {public bool bDebug = true;public float Radius = 2.0f;public Vector3[] pointA;public float Length{get{return pointA.Length;}}public Vector3 GetPoint(int index){return pointA[index];}private void OnDrawGizmos(){if (!bDebug){return;}for (int i = 0; i < pointA.Length; i++){if (i + 1< pointA.Length){Debug.DrawLine(pointA[i], pointA[i + 1], Color.red);}}}
}

接下来,我们有了车辆实体,在本例中它只是一个简单的立方体对象,创建完脚本后,我们将添加VehicleFollowing脚本组件。该脚本接受几个参数,首先是它需要跟随的路径的引用对象,其次是在正确计算它的加速度时需要用到的速度(Speed)属性和质量(Mass)属性。选中是否循环(IsLooping)这个标志,会让实体一直沿着路径循环行进。

 public Path path;public float speed = 20.0f;public float mass = 5.0f;public bool isLooping = true;private float curSpeed;private int curPathIndex;private float pathLength;private Vector3 targetPoint;Vector3 velocity;private void Start(){pathLength = path.Length;curPathIndex = 0;velocity = transform.forward;}private void Update(){curSpeed = speed * Time.deltaTime;targetPoint = path.GetPoint(curPathIndex);if (Vector3.Distance(transform.position,targetPoint)<path.Radius){if (curPathIndex < pathLength - 1){curPathIndex++;}else if (isLooping){curPathIndex = 0;}else{return;}}if (curPathIndex >= pathLength){return;}if (curPathIndex >= pathLength -1 && !isLooping){velocity += Steer(targetPoint,true);}else{velocity += Steer(targetPoint);}transform.position += velocity;transform.rotation = Quaternion.LookRotation(velocity);}

首先我们对属性进行初始化,并在Start方法中将我们的velocity向量设置为向前的方向。在Update方法中,我们通过计算实体的当前位置和与特定航点的距离是否在其半径范围内,来判断它是否已经到达了特定的航点。如果它在范围内,我们只需将下表递增,来找到数组中的下一个航点,如果已经是最后一个航点,我们就需要检查IsLooping标签是否已设置,如果已经设置,我们就将目标设为起始点,否则,我们只需停止在那个点即可。不过,我们也可以让对象转过来,沿着它过来的路线原路返回。

在接下来,我们将在Steer方法中计算加速度,然后旋转我们的实体,并根据速度和方向相应的更新它的位置。Steer方法接收参数,需要移动到Vector3类型的目标位置,无论这个点是否是在最终的航点。我们需要做的第一件事就是计算当前位置与目标位置的剩余距离。用目标位置向量减去当前位置的向量,得出向目标位置移动的向量。 这个向量的模就是剩余的距离。我们然后将这个向量规格化以保持其方向属性。现在,如果这是最后一个航点,并且距离小于我们刚刚决定使用的数字10,我们就随着距离越来越近逐渐降低速度,直到速度最终降为零。否则,我们就以刚刚的速度值更新目标速度。通过从目标速度向量中减去当前速度向量,我们可以计算出新的引导向量。然后用这个向量除以实体的质量,就得出了加速度。

    public Vector3 Steer(Vector3 target,bool bFinalPoint = false){Vector3 desiredVelocity = target - transform.position;float dist = desiredVelocity.magnitude;desiredVelocity.Normalize();if (bFinalPoint && dist < 10.0f){desiredVelocity *= (curSpeed * (dist / 10.0f));}Vector3 steeringForce = desiredVelocity - velocity;Vector3 acceleration = steeringForce / mass;return acceleration;}

Unity3DAI行为------路径跟随相关推荐

  1. 【论文笔记】图匹配的路径跟随算法

    本文为论文<A Path Following Algorithm for Graph Matching>的学习笔记,讲解路径跟随算法.欢迎在评论区一起讨论

  2. 智能车跟随圆弧路径原理

    智能车跟随圆弧路径原理 1. 圆弧点生成 圆弧点P在世界坐标系的位置关系 2. 圆弧点的公式 x=Rcosθy=Rsinθ(1)\begin{aligned} x = Rcos\theta \\ y ...

  3. matlab遗传算法无人机问题,基于改进遗传算法的无人机路径规划

    [1] 杨陆强, 果霖, 朱加繁, 等. 我国农用无人机发展概况与展望[J]. 农机化研究,2017,39(8):6-11.(YANG L Q,GUO L, ZHU J F, et al. The d ...

  4. matlab 角度转四元数_基于Matlab的机械臂路径规划

    什么是 trajectory(路径)规划 中文路径在英语中可能有两种翻译: 1. path 2. trajectory 首先告诉大家,我们所说的"路径"是后者--trajector ...

  5. ROS生成弓字形覆盖路径点逻辑分析

    前面提到,在经过分区,计算区间的遍历顺序后,接下来的操作就是按照遍历顺序,依次生成每一个子区间内的弓字形覆盖路径点,路径点的生成选取策略直接影响到后续路径跟随的效果. 前面提到过,对每一个区间生成弓字 ...

  6. 自动驾驶路径跟踪控制——驾驶员预瞄模型

    文章目录 1. 驾驶员预瞄控制概述 1.1 第一个得到应用的驾驶员模型(Crossover模型) 1.2 预瞄概念的诞生 1.3 驾驶员模型环节 1.4 补偿跟踪模型 1.5 预瞄跟踪模型 1.6 速 ...

  7. 局部路径规划器DWAplannerros

    1 体系结构 (1)主要成员 base_local_planner::LocalPlannerUtil planner_util_; 用来存储运动控制参数以及costmap2d.tf等,会被传入dp_ ...

  8. 3dmax材质通道插件_为什么3dmax插件这么多都不会整合一下呢?

    为什么3dmax插件这么多都不会整合下?直接把那些功能牛逼得不得了的插件集合到一起,不就牛逼了吗,还要自己去找? 下面沐风老师就和有同样疑问的同学说一下原因,为什么象你说的不把牛X的插件整合在一起呢? ...

  9. autoware框架与功能简介(一)

    autoware框架与功能简介(一) Autoware.AI是世界上第一个用于自动驾驶技术的"All-in-One"开源软件.它ROS1操作系统,并在Apache2.0许可下使用. ...

  10. sketchup 255个su常用插件)_SketchUp领域的知乎,有胆来问!

    你知道知乎.豆瓣.果壳-- 但你可能不知道[问吧] 这是一个 SketchUp 领域的知乎 (点击文末"阅读原文"可直接进入[问吧]) 你可以找到关于 SketchUp 的任何话题 ...

最新文章

  1. 求一个简单的java线程代码,Java线程代码的实现方法
  2. 字符串排序 墨迹了半天的自闭题目
  3. XCTF WEB simple_php
  4. 233网校计算机二级c语言,[233网校]2018年全国计算机二级Office高级应用精讲班_计算机二级视频教程...
  5. Spring Data JPA使用Sort进行排序(Using Sort)(转)
  6. python折线图实线虚线_python – matplotlib中的虚线而不是缺失值
  7. IOS 学习笔记 2015-04-10 OC-常用常量
  8. 查找算法——二分查找
  9. 勒让德方程(多项式)和缔合勒让德方程(多项式)和球谐函数
  10. 对接网络摄像头——使用RTSP协议进行取流
  11. win7我的计算机无法搜索,win7搜索功能无法正常使用的有效解决方法
  12. 私活必备11个免费后台管理系统模板
  13. yiisoft/yii2-imagine 使用方法
  14. [整理][VBA]Excel合并表格
  15. 搞深度学习需掌握的基础数学知识
  16. Beaglebone Black Root账号问题
  17. OpenCV—python 图像相似度算法(dHash,方差)
  18. win32编程的经典书籍
  19. 阿德勒《被讨厌的勇气》
  20. 什么是鉴权?一篇文章带你了解postman的多种方式

热门文章

  1. 【69元】茗振 捶打按摩披肩100种模式 颈肩颈椎按摩器 腰部敲敲乐
  2. win7计算机怎么初始化,Win7系统网络初始化的设置方法
  3. Qt/Windows 获取 MITSUBISHI P95DW 打印机状态信息
  4. deepin有线网卡无法连接网络
  5. C语言删除注册表某个键值,怎么批量快速删除注册表中指定的某个键值
  6. Java SSL HTTPS进行双重认证开发实践
  7. SVN文件夹图标显示不正常的解决办法
  8. 使用python批量压缩图片文件
  9. MYSQL 随机字符串
  10. ubuntu18.04使用calibration_toolkit进行相机和三维激光雷达的联合标定