找回密码
 立即注册

Unity3d中实现群集之Separation(分离)、Alignment(队列)、Cohesion(聚集)

热度 1已有 1036 次阅读2012-12-30 21:51 |个人分类:Unity3D| 3Alignment

Reynolds提出的Flocking(群集)只是这3组行为的组合。

 

1.为每一个智能体定义一个邻近半径,在邻近半径内的就是他的邻居。我们要把他们存储在一个容器中,或者做一个标记。
如果想具体的观察到他们,可以让每一个智能体都添加一个只维护自己邻居的容器。另外还可以给智能体添加自身fov的限制。

因为大部分行为都使用相似的邻近半径,所以为了优化一般把这步单独提取出去。

 

2.Separation行为产生一个力,控制智能体离开在它的邻近区域中的那些智能体。当应用在许多智能体上时,他们将向四周展开。

力的大小反比于智能体到它邻居的距离
diff = 归一化(智能体位置-邻居位置)
在除以智能体位置到邻居位置的距离
diff /= d;  
我们想要的力 = 把所有邻居的diff相加

 

3.Alignment行为企图保持智能体的朝向与邻居一致。通过遍历所有邻居,平均他们的朝向向量来计算出一个力。

平均朝向 = 所有邻居的朝向总和/邻居数量
我们想要的力 = 平均朝向 - 智能体当前朝向

 

4.Cohesion行为会产生一个使智能体移向邻居质心的操控力。
邻居质心 =所有邻居的位置总和/邻居数量
我们想要的力 =seek(邻居质心)

 

5.疑问
书中描述对于遵守规则(flocking)的智能体并不知道总体目标;他们只知道他们自己,可能还有一些他们的邻居。

那么是否是说flocking方法并不能像之前的seek,flee,arrive一样指定他们的目标位置?


因为cohesion时最后也会seek,所以我试了下在seek时追加上一个我指定的目标位置。但是结果却变的很奇怪,有时很难回到我指定的目标点。那么到底是不是flock方法就不能指定目标位置了呢?

 

再有很想知道有什么方法改变智能群体的外形比例,默认总是近似一个1:1:1的正方形,如想改成2:1:1的长方形呢?

以上疑问希望有知道的朋友可以指点一下。


路过

雷人

握手

鲜花

鸡蛋

发表评论 评论 (1 个评论)

回复 monery8 2012-12-31 15:37
新手表示有困难

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-3 11:53 , Processed in 0.067814 second(s), 17 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

返回顶部