博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unity ai car demo
阅读量:5876 次
发布时间:2019-06-19

本文共 3257 字,大约阅读时间需要 10 分钟。

目的

  此例子的AI效果就是要车子在一条连续的封闭的曲线上面不停的自己循环移动。

其它

  对车子运动控制,请看上一篇http://www.cnblogs.com/zkzk945/p/5146474.html

基本思路

  利用样条曲线(catmull-rom spline)将路径点通过插值形成连续的曲线,根据车子离开路径起始点的距离计算出车子在路径上的目标点,目标点决定了车子的朝向、油门、刹车。

target.position = circuit.GetRoutePoint(progressDistance + m_lookAheadForTargetOffset +                                                m_lookAheadForTargetFactor*speed).pos;        target.rotation = Quaternion.LookRotation(circuit.GetRoutePoint(progressDistance + m_lookAheadForTargetOffset +                                                m_lookAheadForTargetFactor * speed).dir);

以上代码就是根据和初始点的距离计算目标点,包括了目标点的位置和朝向。

progressPoint = circuit.GetRoutePoint(progressDistance);        //Debug.Log(progressDistance);        Vector3 progressDelta = progressPoint.pos - transform.position;        if (Vector3.Dot(progressDelta, progressPoint.dir) < 0)        {            progressDistance += progressDelta.magnitude*0.5f;        }

以上代码是为了判断车子是否在目标点的前面,如果是,那么增加progressDistance,可以让target目标点定位到车子的前方去,这样target点就会在样条曲线上面循环移动,那么车子也会尾随其移动。

//遇到转角或者控制节点,减速处理                float desiredSpeed = m_carController.MaxSpeed;                Vector3 delta = m_target.position - transform.position;                float distanceCautiousFactor = Mathf.InverseLerp(m_cautiousMaxDistance, 0, delta.magnitude);                float spinningAngle = m_rigidbody.angularVelocity.magnitude*m_cautiousMaxDistance;                float cautiousnessRequired = Mathf.Max(Mathf.InverseLerp(0, m_cautiousMaxAngle, spinningAngle),                    distanceCautiousFactor);                desiredSpeed = Mathf.Lerp(m_carController.MaxSpeed, m_carController.MaxSpeed*m_cautiousSpeedFactor,                    cautiousnessRequired);

以上代码是在转角点时对期望速度的处理,根据车子和目标点的距离、车子本身的角速度,求得一个紧张系数,当车子距离目标点越紧或者角速度越大,紧张系数也就越大,这样车子就需要减慢速度,以防止翻车。

Vector3 offsetTargetPos = m_target.position;                offsetTargetPos += m_target.right*                                   (Mathf.PerlinNoise(Time.time*m_lateralWanderSpeed, m_randomPerlin)*2 - 1)*                                   m_lateralWanderDistance;                Vector3 localTarget = transform.InverseTransformPoint(offsetTargetPos);                float targetAngle = Mathf.Atan2(localTarget.x, localTarget.z) * Mathf.Rad2Deg;                float steer = Mathf.Clamp(targetAngle * m_steerSensitivity, -1, 1);                float accelBrakeSensitivity = (desiredSpeed < m_carController.CurrentSpeed)                    ? m_brakeSensitivity                    : m_accelSensitivity;                float accle = Mathf.Clamp((desiredSpeed - m_carController.CurrentSpeed)*accelBrakeSensitivity, -1, 1);                //Debug.Log(accle);                //Debug.Log((1 - m_accelWanderAmount) +                //         (Mathf.PerlinNoise(Time.time*m_accelWanderSpeed, m_randomPerlin)*m_accelWanderAmount));                accle *= (1 - m_accelWanderAmount) +                         (Mathf.PerlinNoise(Time.time*m_accelWanderSpeed, m_randomPerlin)*m_accelWanderAmount);                //Debug.Log(accle);                m_carController.Move(steer, accle, accle, 0f);

首先对目标点进行柏林噪声随机,然后根据目标点算出方向盘的方向。然后根据期望速度和当前速度计算出油门或者刹车输入,最后手动传给控制汽车移动的函数,实现了汽车的自动化运行。

源码

http://git.oschina.net/zkzk945/CarAIDemo521

转载于:https://www.cnblogs.com/zkzk945/p/5153688.html

你可能感兴趣的文章
ABP理论学习之仓储
查看>>
centos7下使用yum安装mysql
查看>>
How can I set ccshared=-fPIC while executing ./configure?
查看>>
2.移植uboot-添加2440单板,并实现NOR、NAND启动
查看>>
hadoop-2.6.5安装
查看>>
vmware虚拟机里的LINUX不能上网的原因一:虚拟网卡设置
查看>>
监控摄像机的区别和分类
查看>>
Java学习——对象和类
查看>>
ElasticSearch 组合过滤器
查看>>
HttpClient连接池的连接保持、超时和失效机制
查看>>
1-4 多文档界面处理(2)
查看>>
《Essential Linux Device Drivers》中文版第1章
查看>>
让远程传输大文件变得更快
查看>>
complex的小困惑
查看>>
十进制、十六进制、二进制的转换
查看>>
双网卡centos7 iptables防火墙与/etc/rc.d/rc.local开机运行
查看>>
tomcat PermGen space 不足的解决方法
查看>>
STM32系统滴答_及不可不知的延时技巧 - (上)
查看>>
Linux下企业级分区方案
查看>>
CentOS下LAMP一键yum安装脚本
查看>>