结合队伍就是诱导各个人到周围的人的平均位置。这是队伍一起行动的三大步骤之一。通过结合,各个人就会聚合到一起,出现队伍。
效果:
人刚开始是随机移动,但遇到其他的人时,就会跟随他。但碰到障碍物等时有可能无法跟上,而又开始随机移动。当一群(boids)遇到另外一群时有可能结合在一起,也有可能队员发生互换后分开。
得到周围的人
每一个人有一个视野距离与视野范围。比如某个机器人可以看到 100m ,眼睛的夹角在120度 以内的物体。其中"100m"为视野距离(以下称为 r),"120度"为视野范围(以下称为 th)。
核心代码:
//周围的人列表。
internal var aroundList:Array;
//可视列表。
internal var inViewList:Array; //创建可视列表。
public function resetViewList():void {
inViewList = [];
aroundList = [];
for each(var u:C2Unit in onwer.unitsList) {
if(!u.following && u != this) {
if(inAround(u)) {
aroundList.push(u);
if(inView(u)) {
inViewList.push(u);
}
}
}
}
} //判断是否在周围。
public function inAround(u:C2Unit):Boolean {
if(Vector2d.distance(pos, u.pos) > VIEW_DISTANCE) {//VIEW_DISTANCE 为 r
return false;
}
return true;
}
//判断是否在视野范围内。
public function inView(u:C2Unit):Boolean {
var dsu:Vector2d = new Vector2d().sub(u.pos, pos);//dsu = u - pos (pos为自己的坐标)
if(dsu.angle2(pos)>VIEW_WIDTH) {//VIEW_WIDTH 为 th/2
return false;
}
return true;
}
结合
实现结合,其实很简单,就是把速度(方向和长度)设为周围的人的平均速度即可。
核心代码:
//结合。
internal function follow():void {
if(inViewList.length) {
var avg:Vector2d = new Vector2d();
for each(var u:C2Unit in inViewList) {
avg.addTo(u.v);
}
avg.scaleTo(1/inViewList.length);
v.reset(avg);
following = true;
}else{
following = false;
}
}
![[Google]](http://www.google.com/logos/Logo_25wht.gif)
![[Synchronous Space]](http://weihe924stephen.googlepages.com/syncspace-banner.jpg)
![[Creative Commons License]](http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png)
![[Add to Google]](http://buttons.googlesyndication.com/fusion/add.gif)
![[Aggregated by MXNA]](http://weblogs.macromedia.com/mxna/images/mxna88x31.gif)
![[Flex.org]](http://www.flex.org/images/flexorg.gif)
![Validate my Atom 1.0 feed [Valid Atom 1.0]](http://validator.w3.org/feed/images/valid-atom.png)
![Validate my RSS feed [Valid RSS]](http://resource.googlecode.com/files/valid-rss.png)
![[I heart FeedBurner]](http://www.feedburner.com/fb/images/pub/i_heart_fb.gif)
没有评论:
发表评论