鱼群AI群聚算法

通过模拟鱼群或是雁群的群聚AI算法主要的有三种行为分别是分散,对齐,凝聚
即当鱼群之间距离靠的过近时它们会主动散开,当距离过远时它们又会往一起凝聚,其实散开和凝聚更多的都是左右两侧的力,但是如果还要整齐的向前行动,还需要一个对齐的力,这个力一般是指向行进方向上的,即周围个体的平均速度方向

下面基于Unity,提供一个概括实现思路

分散:每个单位行动时,要避免撞上其临近单位。

//1.首先要获得周围的鱼个体
//通过如下方法获得检测半径内的鱼,也就是附近的鱼(注意去除掉自己)
Collider[] colliders = Physics.OverlapSphere(transfrom.position,检测半径)
//得到得到去除自己后的ecm_colliders

#2计算出分离的力
#通过遍历附近的鱼与当前位置的方向计算出相互间排斥力的大小(每隔一段时间调用)
foreach(var c in ecm_colliders)
{
    Vector3 dir = transform.position - c.transform.position;
    //由于相互之间是排斥力,所以向量长度dir.magnitude越长,该方向上的力越小,反之亦然
    //注意:repulsionForceALL 是外部定义的,计算附近鱼群给当前目标的合力
    repulsionForceALL += dir.normalized / dir.magnitude;
}
//repulsionForceALL仅仅计算的是分离的力,总的力的大小,包括分离聚集和对齐的力为allForce
allForce += repulsionForceALL;
//得到附近给的力的合力之后,则可以在FixedUpdate中求出加速度
void FixedUpdate()
{
    //根据牛二定律计算出加速度 和 当前速度包含方向
    velocity += (allForce / m) * Time.fixedDeltaTime;
    //将鱼的朝向转向速度的方向
    transfrom.rotation = Quaternion.Slerp(transfrom.rotation,transform.LookAt(velocity),Time.fixedDeltaTime);
}

对齐:每个单位行动时,都要把自己对齐在其临近单位的平均方向上。

//大致同上,这里仅仅讲诉如何获取对齐的力
//这里ecm_colliders2不等于上面的ecm_colliders不同,因为它们的检测半径范围不一样
foreach(var c in ecm_colliders2)
{
    //对齐的力实际上就应该等于附近每个鱼当前的方向,取所有方向总的朝向
    allDir += c.transform.forward;
}
//将目标方向减去当前方向,得到使当前个体向周围方向对齐的力
allForce += allDir.normalized - transform.forward;       //后面在fixedUpdate中同理调用

凝聚:每个单位都往其临近单位的平均位置行动。

N个点的中心坐标(x,y) = ( (x1+x2+x3+...+xN)/N , (y1+y2+y3+...+yN)/N )

//大致同上,这里仅仅讲诉如何获取聚集的力
//这里ecm_colliders等同于上面分散的ecm_colliders
foreach(var c in ecm_colliders)
{
    //聚集的力实际上就应该是先计算周围所有点的中心,然后将当前物体向中心靠近
    centerPosition += c.transform.position;
}
//得到中心的位置
centerPosition /= ecm_colliders.Length; 
//中心位置减去当前的位置,得到朝向中心位置的方向,直接将其当作聚集的作用力
allForce +=  centerPosition  - tranform.position; 

PS:由于最后所有的分散,对齐,聚集的力的大小都没有做权值处理,所有可能模拟的不够真实,可以分别将其乘以对应的分量控制其权值大小,来做到更真实的模拟

分散,对齐,聚集.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335