◆王永霞
Boids算法在Unity3D开发平台中模拟生物群组行为中的应用研究
◆王永霞
(山西经济管理干部学院 山西 030000)
本文结合Unity3D开发平台,对Boids算法在生物群组行为中的模拟应用展开了深入研究。并针对群组中移动轨迹随机更新的复杂行为模拟,提出了Boids算法的改进策略,重点解决了群组行为的随机更新问题。
Unity3D;3D模拟;群组行为;Boids算法
Unity3D是一款3D模拟软件开发引擎,基于Unity3D实现组群行为模拟控制,其提供有典型的算法参考模型是基于Craig Reynold(逃出克隆岛)模拟场景的群组行为示例[2]。Boids算法就是在Craig Reynold中被首次提出的。
Boids算法中每个boid都会应用群组行为的三个规则[3]。分离规则,保证相邻的boid之间能够保持适当的距离,不会发生拥挤与碰撞;队列规则,保证了群组在移动速度和移动方向上对各个boid的有效约束;凝聚规则,对boid的移动位置进行约束,避免其脱离群组行为的控制范围。通过规则的应用,模拟场景生成的若干boid,会自动形成群组。
在Boids算法设计中首先会创建一个群组的核心节点,再通过核心节点来生成其他的群组成员,并对其进行行为约束。也就是说在Boids算法中主要包括两个被控制对象:群组的领导者(核心节点FlockBoid)与其他boid。当群组的领导者的移动行为发生变化,boid也将随之进行调整。设计思路为:首先由FlockBoid动态生成很多个boid,然后在每个boid上实现群组规则。其中分离规则用于依次检查boid的间距,并相应地调整速度;队列规则通过群组的平均速度与航向、boid的随机速度,获得当前boid的最速度与角度;凝聚规则是以FlockBoid为中心,预设群组的凝聚范围和FlockBoid与各个boid的之间的向量值,用于更新当前boid的移动速度与方向。
Boids算法主要是运用空间几何的概念实现对群组行为的模拟控制,在核心部分需要遍历每一个boid,分别计算当前boid与其他相邻节点的间距,再通过与预设的各个规则下所生成的约束值比对,来动态更新boid的移动速度与角度。
假设FlockBoid为组群原点,三维坐标为(,,),当前boid为,三维坐标值为(1,1,1),相邻任一节点为,三维坐标值为(2,2,2),依据向量三角形法则及投影定律可知:
在Unity3d中,Boids算法仅实现了一个简单的鸟群移动行为,能够适用于大部分生物类群组行为的3D模拟,但在真实环境中,很多生物群组行为要比这复杂得多,例如群组行为中障碍物的躲避、群组移动路径的随机更新等。群组中个体行为通常会比较简单,但群组行为绝不是个体行为的简单叠加,任何一件随机事件的产生都可能导致群组行为在结构、模式和行为上发生变化[4]。为了使得群组行为模拟更加接近真实自然的效果,对一些较为复杂的群组行为实现模拟控制是非常必要的。
在Boids算法中随机性策略的算法改进思路主要是通过随机生成的移动目标来改变群组的移动轨迹。
在Boids算法中,FlockBoid作为群组的领导者,群组中的boid都是跟随着FlockBoid移动的。因此在改进算法中,随机目标的更新主要是针对FlockBoid的,当FlockBoid的轨迹发生变化,群组中所有成员的轨迹也会跟着发生变化,如图1所示:
图1 随机移动轨迹中随机策略的应用思路
在Unity3D内部封装的Random类提供的Range()函数可以在用户自定义的最小数与最大数之间随机返回一个浮点型的数值,(这个范围包含最小数,但不包含最大数)[5]。
float posX=Random.Range(initPos.x-bound.x,init Pos.x+bound.x);
float posY=Random.Range(initPos.y-bound.y,initPos.y+bound.y);
float posZ=Random.Range(initPos.z-bound.z,initPos.z+bound.z);
最后Range函数每被调用一次,就会对偏移量进行一次刷新,从而实现目标向量的不断更新。因此还需要设置一个刷新机制,以确保每隔一段时间就可以对目标向量进行更新。
Unity3D内置有Update()函数,该函数在系统运行时会被自动调用,调用频率为每帧调用一次,大约每秒Update()函数会被调用千次以上。如果要在Update()内实现移动目标的定时更新,还需要重新设定代码的刷新频率。具体实现步骤如下:
( 1 ) 获取FlockBoid当前的移动位置,以三维坐标(,,)表示;
( 2 ) 获取FlockBoid当前的移动目标,以三维坐标(,,)表示;
( 3 ) 计算FlockBoid从当前位置到移动目标的间距,公式如下:
( 4 ) 设定FlockBoid从当前位置到移动目标的最小间距为space,将与space进行比较,如果>space,说明FlockBoid距离移动目标还比较远,对移动目标不做位置更新;如果 当随机策略更新了移动目标后,FlockBoid也会随之更新移动轨迹,向新的目标点移动,群组中所有节点也会通过对FlockBoid的追踪,重新规划各自的移动路径。 本研究主要围绕Boids算法在Unity3D模拟生物群组行为中的应用展开深入研究,并在此基础上对衍生出的复杂群组行为进行了讨论,最后针对群组行为的移动轨迹更新问题,提出了基于Boids的随机性改进策略。改进后的算法策略能够为很多复杂的群组行为提供随机性问题与路径规划问题的解决思路,从而有效改善群组行为的模拟效果。 [1]Tenney R,Hebbert R,Sandell N Jr. A tracking filterfor maneuvering sources[J]. IEEE Transactions on AutomaticControl,1977,22(2):246-251. [2]Craig Reynolds. Boids Background and Update[EB/OL]. http://www.red3d.com/cwr/boids/,2001.5 总结