(没有关注波纹效果和之后具体的速度控制,只是挑出了模拟鱼群的部分。)
使用Unity引擎+C#脚本,能使结果能形象化的展示出来。
模拟鱼群的思路各大网站都能查到,叫做flocking集群模拟,也有人叫boids集群模拟。Flocks 和 Boids 类似,都可以模拟大量个体的群体行为。
Boids算法背景
是由 Craig Reynolds 于1986 年开发的人工生命项目,模拟鸟类的群聚行为。与大多数人工生命模拟一样,Boids是emergent行为的一个例子,boids的复杂性源于各个智能体,它们遵循一系列规则的交互。Boids 是复杂系统的典型例子,由简单的智能体之间的响应式互动,通过局部空间配置或响应环境,产生了连贯的集体行为。每个智能体的行为都由行为规则之间的相互作用产生,多智能体系统的行为来自许多智能体与环境的交互。
通常用于计算机图形学,提供鸟群和其他生物(如鱼群)的逼真表现。第一部使用 Boids 制作的动画是 1987 年的 Breaking the Ice。随后在 Tim Burton 的电影「蝙蝠侠归来」(1992 年)中首次亮相大屏幕,用计算机生成的蝙蝠群和企鹅军队在高谭市街头游行。在1998年的电子游戏《半条命 Half-Life》中,游戏结束时Xen中出现的类似鸟类的飞行生物就使用了该框架(游戏文件中命名为“ boid”)。也用于集群机器人中简单的无人地面车辆或微型飞行器群体的直接控制和稳定。
有兴趣的同学可以再查询再研究,这里只关注鱼群模拟的修改。
具体实现过程
Boids算法已经比较成熟,具体的思路百度百科和各个网站都有给出,这里以B站视频为例。
每个个体都遵循三个规则:
分离Separation:移动以避开群体拥挤处
对齐Alignment:转向群体的平均航向
靠近Cohesion:朝群体的平均位置(质心)移动
每一个个体都要去遵循着三个规则,所以以每一个个体为单位。一个大团体可以去分成若干个小团体,小团体的划分界限就是每一个个体的视野范围。每一个个体去搜寻它的视野范围内(鱼的视野范围是360°)其他个体的信息。这些信息包括,它们的位置,朝向,和与自身的距离。统计这三个信息的目的如下:(分别对应的规则在后面括号中)
与自身的距离:为了加权出分离程度 (分离Separation)
位置:为了加权出整体凝聚位置 (靠近Cohesion)
朝向:为了加权出整体朝向 (对齐Alignment)
具体修改过程
视频中根据这三点规则,模拟鱼群的核心代码如下:
实际效果如图:
不知道观看gif之后有什么感受,但看代码可能会有所发现。在实现这三个规则的时候,也用到了其他的手段,视频中也有提到,就是先限制出一块区域(水箱),所有的个体都无法逃离这个限制的区域(水箱),然后在这个区域(水箱)内去加权影响因素。当然也可以理解成一道保险,当鱼群中的个体偏离轨道时,这是一个能够让他们返回鱼群的保障。
(当然某种情况下,这种模拟的情况效果也不错)
但目前我个人的想法是想在此基础上让它们更有条理一点,以至后续更改出鱼群整体移动的效果。
所以就应当让每个个体更单纯的受三个规则的制约。
结合之前代码再加上新思路,更改后的代码如下:
实际效果如图:
修改后在保证每个个体遵循规则的同时也尽可能的保证条理性,方便后续其他需求的改动。
(gif录制软件:GifCam)
(软件:Unity,VS Code)
(才疏学浅,考虑不周,欢迎批评指正,后续也会更加认真谨慎。)