天空鸟群模拟,海底鱼群模拟效果

每个单独的鱼都会有独立的行为:
  • 1.自由移动行为,
  • 2.躲避前方范围物体的行为(包括鱼)
  • 3.跟随鱼并保持距离的行为(形成鱼群)
  • 4.随时跟随最近的鱼群(分离与对齐)
躲避行为算法效果图

核心代码:

(仅提供算法参考,无法使其单独运行)

public class Boid : MonoBehaviour {BoidSettings settings;// State[HideInInspector]public Vector3 position;[HideInInspector]public Vector3 forward;Vector3 velocity;// To update:Vector3 acceleration;[HideInInspector]public Vector3 avgFlockHeading;[HideInInspector]public Vector3 avgAvoidanceHeading;[HideInInspector]public Vector3 centreOfFlockmates;[HideInInspector]public int numPerceivedFlockmates;// CachedMaterial material;Transform cachedTransform;Transform target;void Awake () {material = transform.GetComponentInChildren<MeshRenderer> ().material;cachedTransform = transform;}public void Initialize (BoidSettings settings, Transform target) {this.target = target;this.settings = settings;position = cachedTransform.position;forward = cachedTransform.forward;float startSpeed = (settings.minSpeed + settings.maxSpeed) / 2;velocity = transform.forward * startSpeed;}public void SetColour (Color col) {if (material != null) {material.color = col;}}public void UpdateBoid () {Vector3 acceleration = Vector3.zero;if (target != null) {Vector3 offsetToTarget = (target.position - position);acceleration = SteerTowards (offsetToTarget) * settings.targetWeight;}if (numPerceivedFlockmates != 0) {centreOfFlockmates /= numPerceivedFlockmates;Vector3 offsetToFlockmatesCentre = (centreOfFlockmates - position);var alignmentForce = SteerTowards (avgFlockHeading) * settings.alignWeight;var cohesionForce = SteerTowards (offsetToFlockmatesCentre) * settings.cohesionWeight;var seperationForce = SteerTowards (avgAvoidanceHeading) * settings.seperateWeight;acceleration += alignmentForce;acceleration += cohesionForce;acceleration += seperationForce;}if (IsHeadingForCollision ()) {Vector3 collisionAvoidDir = ObstacleRays ();Vector3 collisionAvoidForce = SteerTowards (collisionAvoidDir) * settings.avoidCollisionWeight;acceleration += collisionAvoidForce;}velocity += acceleration * Time.deltaTime;float speed = velocity.magnitude;Vector3 dir = velocity / speed;speed = Mathf.Clamp (speed, settings.minSpeed, settings.maxSpeed);velocity = dir * speed;cachedTransform.position += velocity * Time.deltaTime;cachedTransform.forward = dir;position = cachedTransform.position;forward = dir;}bool IsHeadingForCollision () {RaycastHit hit;if (Physics.SphereCast (position, settings.boundsRadius, forward, out hit, settings.collisionAvoidDst, settings.obstacleMask)) {return true;} else { }return false;}Vector3 ObstacleRays () {Vector3[] rayDirections = BoidHelper.directions;for (int i = 0; i < rayDirections.Length; i++) {Vector3 dir = cachedTransform.TransformDirection (rayDirections[i]);Ray ray = new Ray (position, dir);if (!Physics.SphereCast (ray, settings.boundsRadius, settings.collisionAvoidDst, settings.obstacleMask)) {return dir;}}return forward;}Vector3 SteerTowards (Vector3 vector) {Vector3 v = vector.normalized * settings.maxSpeed - velocity;return Vector3.ClampMagnitude (v, settings.maxSteerForce);}}
public class BoidManager : MonoBehaviour {const int threadGroupSize = 1024;public BoidSettings settings;public ComputeShader compute;Boid[] boids;void Start () {boids = FindObjectsOfType<Boid> ();foreach (Boid b in boids) {b.Initialize (settings, null);}}void Update () {if (boids != null) {int numBoids = boids.Length;var boidData = new BoidData[numBoids];for (int i = 0; i < boids.Length; i++) {boidData[i].position = boids[i].position;boidData[i].direction = boids[i].forward;}var boidBuffer = new ComputeBuffer (numBoids, BoidData.Size);boidBuffer.SetData (boidData);compute.SetBuffer (0, "boids", boidBuffer);compute.SetInt ("numBoids", boids.Length);compute.SetFloat ("viewRadius", settings.perceptionRadius);compute.SetFloat ("avoidRadius", settings.avoidanceRadius);int threadGroups = Mathf.CeilToInt (numBoids / (float) threadGroupSize);compute.Dispatch (0, threadGroups, 1, 1);boidBuffer.GetData (boidData);for (int i = 0; i < boids.Length; i++) {boids[i].avgFlockHeading = boidData[i].flockHeading;boids[i].centreOfFlockmates = boidData[i].flockCentre;boids[i].avgAvoidanceHeading = boidData[i].avoidanceHeading;boids[i].numPerceivedFlockmates = boidData[i].numFlockmates;boids[i].UpdateBoid ();}boidBuffer.Release ();}}public struct BoidData {public Vector3 position;public Vector3 direction;public Vector3 flockHeading;public Vector3 flockCentre;public Vector3 avoidanceHeading;public int numFlockmates;public static int Size {get {return sizeof (float) * 3 * 5 + sizeof (int);}}}
}
public static class BoidHelper {const int numViewDirections = 300;public static readonly Vector3[] directions;static BoidHelper () {directions = new Vector3[BoidHelper.numViewDirections];float goldenRatio = (1 + Mathf.Sqrt (5)) / 2;float angleIncrement = Mathf.PI * 2 * goldenRatio;for (int i = 0; i < numViewDirections; i++) {float t = (float) i / numViewDirections;float inclination = Mathf.Acos (1 - 2 * t);float azimuth = angleIncrement * i;float x = Mathf.Sin (inclination) * Mathf.Cos (azimuth);float y = Mathf.Sin (inclination) * Mathf.Sin (azimuth);float z = Mathf.Cos (inclination);directions[i] = new Vector3 (x, y, z);}}}

是不是感觉很复杂,代码我没有放全,因为实在有点多
点击

Unity 3D AI鸟群算法 AI鱼群算法相关推荐

  1. matlab球落点的数学建模,MATLAB数学建模:智能优化算法-人工鱼群算法

    MATLAB 数学建模: 人工鱼群算法 1. 基本原理 人工鱼群算法是一种受鱼群聚集规律而启发的优化算法. 在人工鱼群算法中, 我们假定鱼群的活动行为分为: 觅食行为, 群聚行为, 追随行为和随机行为 ...

  2. 人工鱼群算法python代码_人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区......

    本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...

  3. 人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区...

    本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...

  4. 人工鱼群算法python_蚁群算法、免疫优化算法、鱼群算法 Python 库

    github地址guofei9987/scikit-opt​github.com 安装 $pip install scikit-opt 蚁群算法(ACA, Ant Colony Algorithm) ...

  5. 《MATLAB智能算法30个案例》:第19章 基于模拟退火算法的TSP算法

    <MATLAB智能算法30个案例>:第19章 基于模拟退火算法的TSP算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析&g ...

  6. 《MATLAB智能算法30个案例》:第20章 基于遗传模拟退火算法的聚类算法

    <MATLAB智能算法30个案例>:第20章 基于遗传模拟退火算法的聚类算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析& ...

  7. 进化算法——其他进化算法

    目录 禁忌搜索 人工鱼群算法 群搜索优化器 混合蛙跳算法 萤火虫算法 细菌觅食优化 人工蜂群算法 引力搜索算法 和声搜索 基于教学的优化 禁忌搜索 禁忌搜索,Tabu,或taboo,意味着禁止或不许可 ...

  8. Unity 3D之简单鱼群算法(直接套上就好)

    鱼群算法在捕鱼达人类似的游戏中是不可或缺的,还有很多项目中都要用到,我本人觉得这条算法帮助我做过诸多的项目,其中有AR,VR,捕鱼达人秀等,简单粗暴,如果有需要改正的地方还请大佬们指正: public ...

  9. 【含泪提速!】一文全解相似度算法、跟踪算法在各个AI场景的应用(附代码)

    大家好,我是cv君,大家是否为深度学习算法速度感到困扰?本次cv君倾力分享一个优秀的方法,通过相似度+跟踪方案优化速度问题,并提高了检测.分割算法稳定性,附带代码,一起肝起来吧~ 今天给大家全解一下图 ...

  10. 在阿里AI实验室做NLP高级算法工程师是一种什么样的体验?

    最近应届生的拼抢大战的号角已经吹响.正如昨天那篇雄文,年薪25万也只是个白菜价......这让营长真心羞愧啊.....同样敲键盘的...不说也罢 绝不将小小的忧桑带入工作. 这几天,群里一直有很多小伙 ...

最新文章

  1. spark指定hive字段_Spark2.0集成Hive操作的相关配置与注意事项
  2. RocketMQ-初体验RocketMQ(09)-广播消息、延时消息、批量消息
  3. react页面数据过多怎么办_解决 React-Native 加载数据页面卡顿问题
  4. Fabric 学习笔记-架构初探
  5. 涨姿势了,raise...from... 是个什么操作?
  6. [视频教程] ubuntu系统下安装最新版PHP7.3.X环境
  7. 数据结构基础:树结构的学习笔记
  8. Spark之RDD实战2
  9. linux系统sed语法,22. Linux sed命令
  10. 齐齐哈尔计算机二级,2020齐齐哈尔市计算机二级报名时间|网上报名入口【8月20日9时开通】...
  11. AAAI'22 | 中稿的论文网友找出致命漏洞?
  12. 区块链实现的关键技术_保险中的区块链:实现关键的增长机会
  13. 混合现实:地面高度不准确
  14. 在当前项目组中引入敏捷开发思想
  15. 网页的登录和注册页面
  16. 大学生金融欺诈现状出炉 微博借钱提示四大典型骗局
  17. 28-1.kubernetes
  18. Rust权威指南之编写自动化测试
  19. SNS游戏主题餐厅即将上线了!
  20. 易语言 突破新长文本常量最大30000限制 的方法

热门文章

  1. Python实现:超分子化学的建模------如何操控客体分子穿过主体分子和计算该过程能量变化(高斯(Gauss)输入文件为例,一键批量处理)
  2. Ubantu16.04+CUDA10.0安装mmaction以及提取UCF101的frame和optical flow
  3. JavaScript 中URL编码方式
  4. android 改机型玩王者,全机型60帧一键修改
  5. 递归实现斐波那契数列(Java)
  6. python读取csv数据出错_使用Pandas在python中读取csv文件时出错
  7. CAD制图初学入门:CAD图案填充之图案加洞
  8. 回到十七世纪,让我来编算一本常用对数表(对数结果是小数,要有分数的思想,指数的幂是分数,这样可以实现小数分数转化位整数的幂的求法)
  9. 单片微型计算机原理和应用答案,《单片微机原理及应用》 试卷A及参考答案
  10. 配置管理基本概念、配置管理计划、配置管理主要活动