群落 (Biocoenosis)或称为“生物群落”。指的是生态学中,在一个群落生境内相互之间具有直接或间接关系的所有生物,或曰生物的总合。也有人作如下定义:生存在一起并与一定的生存条件相适应的动植物的总体。群落生境是群落生物生活的空间。一个生态系统则是群落和群落生境的系统性相互作用。
从定义可知,它是由在一个群落生境里生活的动物群落和植物群落,也称为生物系统组成的。生物地理群落是生物和地理因素,就是说无生命的环境的总和。这些关系的总和则是生态系统。这个概念1877年由卡尔·奥古斯都·莫比奥斯提出,他将一个牡蛎海岸上的所有生物称作“生物社区”或是“生物群落”。
一个群落的生物物种占据不同的小生境。一个群落的生物相互之间有着不同的关系。

Demo中的机车们就是一个群落。

这里使用的方法是Craig Reynolds和他的"boilds"模拟系统。
以鸟群为例,它含有三个主要角色:
首先,鸟们都保持在同一个区域。如果有只鸟离队伍远了,就该马上归队。这叫凝聚。
其次,尽管鸟们都在一起飞,但是要避免不会互相碰到。为此,它们各自都有一个空间来预防其它鸟太接近。这叫分离。
最后,鸟们飞行在同一个方向。当然各自的角度不一定相同,但是大方向是差不多的。这叫队列。
这三个行为——凝聚、分离和队列——组成了复杂的群落行为。
当考虑鸟群时,就以整个群落是一条心去想象,或者认为每个鸟都充分认识群中的其它鸟。我不想为此去争论什么,但我要说,当开始理解这三个行为,何以促成群落 行为时,你会发现,每个鸟根本不需要知道多少东西,也不需要什么民主集中一条心来指挥群落。实际上,每个鸟就只需要看看临近的几只伙伴。如果靠太近就离远 点,如果方向差太多就转过来点,最终以此形成了传说中的群落行为。
尽管群落行为技术上被拆成了三个子行为,然而它们几乎总是捆绑出现的。一般不太会只对角色使用其中一两个行为,所以就把这仨放于同一个函数中好了。这样效率也高,避免要做三次循环。

代码如下:

//群落行为
private var _inSightDist: Number = 200;
private var _tooCloseDist: Number = 60;
public function flock (vehicles: Array):void {
	var averageVelocity: Vector2D = _velocity.clone();
	var averagePosition: Vector2D = new Vector2D();
	var inSightCount:int=0;
	for (var i: int=0; i < vehicles.length; i++) {
		var vehicle:Vehicle=vehicles[i] as Vehicle;
		if (vehicle!=this&&inSight(vehicle)) {
			averageVelocity=averageVelocity.add(vehicle.velocity);
			averagePosition=averagePosition.add(vehicle.position);
				if (tooClose(vehicle)) {
					flee (vehicle.position);
				}
				inSightCount++;
			}
		}
		if (inSightCount>0) {
			averageVelocity=averageVelocity.divide(inSightCount);
			averagePosition=averagePosition.divide(inSightCount);
			seek (averagePosition);
			_steeringForce.add(averageVelocity.subtract(_velocity));
		}
	}
//视野范围判断
public function inSight (vehicle: Vehicle):Boolean {
	if (_position.dist(vehicle.position) > _inSightDist) {
		return false;
	}
	var heading:Vector2D=_velocity.clone().normalize();
	var difference:Vector2D=vehicle.position.subtract(_position);
	var dotProd:Number=difference.dotProd(heading);
	if (dotProd<0) {
		return false;
	}
	return true;
}
//距离判断
public function tooClose (vehicle: Vehicle):Boolean {
	return (_position.dist(vehicle.position) < _tooCloseDist);
}

inSight 函数判定一个机车是否能看到另一个机车。为此,先要检测两者间距离是否在视野范围内,如果不是就返回false。接着用向量的数学运算判断机车的前后关 系,这里采用的实现方式比较死板,只认前方的机车,在后面就当作看不见。这个做做例子够用了,如果要作改进,可以先考虑做一个可变化的视野范围。窄的视野 范围意味着角色只能沿着视野方向,注意不到两边,宽的视野意味着角色可以看到边上的一些东西。不同的视野范围,会导致不同的群落模式。
呵呵,以上基本完全是pdf中的内容,感觉没什么需要特别说明的。