◆王永霞
Boids算法在Unity3D開發(fā)平臺中模擬生物群組行為中的應用研究
◆王永霞
(山西經(jīng)濟管理干部學院 山西 030000)
本文結(jié)合Unity3D開發(fā)平臺,對Boids算法在生物群組行為中的模擬應用展開了深入研究。并針對群組中移動軌跡隨機更新的復雜行為模擬,提出了Boids算法的改進策略,重點解決了群組行為的隨機更新問題。
Unity3D;3D模擬;群組行為;Boids算法
Unity3D是一款3D模擬軟件開發(fā)引擎,基于Unity3D實現(xiàn)組群行為模擬控制,其提供有典型的算法參考模型是基于Craig Reynold(逃出克隆島)模擬場景的群組行為示例[2]。Boids算法就是在Craig Reynold中被首次提出的。
Boids算法中每個boid都會應用群組行為的三個規(guī)則[3]。分離規(guī)則,保證相鄰的boid之間能夠保持適當?shù)木嚯x,不會發(fā)生擁擠與碰撞;隊列規(guī)則,保證了群組在移動速度和移動方向上對各個boid的有效約束;凝聚規(guī)則,對boid的移動位置進行約束,避免其脫離群組行為的控制范圍。通過規(guī)則的應用,模擬場景生成的若干boid,會自動形成群組。
在Boids算法設計中首先會創(chuàng)建一個群組的核心節(jié)點,再通過核心節(jié)點來生成其他的群組成員,并對其進行行為約束。也就是說在Boids算法中主要包括兩個被控制對象:群組的領導者(核心節(jié)點FlockBoid)與其他boid。當群組的領導者的移動行為發(fā)生變化,boid也將隨之進行調(diào)整。設計思路為:首先由FlockBoid動態(tài)生成很多個boid,然后在每個boid上實現(xiàn)群組規(guī)則。其中分離規(guī)則用于依次檢查boid的間距,并相應地調(diào)整速度;隊列規(guī)則通過群組的平均速度與航向、boid的隨機速度,獲得當前boid的最速度與角度;凝聚規(guī)則是以FlockBoid為中心,預設群組的凝聚范圍和FlockBoid與各個boid的之間的向量值,用于更新當前boid的移動速度與方向。
Boids算法主要是運用空間幾何的概念實現(xiàn)對群組行為的模擬控制,在核心部分需要遍歷每一個boid,分別計算當前boid與其他相鄰節(jié)點的間距,再通過與預設的各個規(guī)則下所生成的約束值比對,來動態(tài)更新boid的移動速度與角度。
假設FlockBoid為組群原點,三維坐標為(,,),當前boid為,三維坐標值為(1,1,1),相鄰任一節(jié)點為,三維坐標值為(2,2,2),依據(jù)向量三角形法則及投影定律可知:
在Unity3d中,Boids算法僅實現(xiàn)了一個簡單的鳥群移動行為,能夠適用于大部分生物類群組行為的3D模擬,但在真實環(huán)境中,很多生物群組行為要比這復雜得多,例如群組行為中障礙物的躲避、群組移動路徑的隨機更新等。群組中個體行為通常會比較簡單,但群組行為絕不是個體行為的簡單疊加,任何一件隨機事件的產(chǎn)生都可能導致群組行為在結(jié)構(gòu)、模式和行為上發(fā)生變化[4]。為了使得群組行為模擬更加接近真實自然的效果,對一些較為復雜的群組行為實現(xiàn)模擬控制是非常必要的。
在Boids算法中隨機性策略的算法改進思路主要是通過隨機生成的移動目標來改變?nèi)航M的移動軌跡。
在Boids算法中,F(xiàn)lockBoid作為群組的領導者,群組中的boid都是跟隨著FlockBoid移動的。因此在改進算法中,隨機目標的更新主要是針對FlockBoid的,當FlockBoid的軌跡發(fā)生變化,群組中所有成員的軌跡也會跟著發(fā)生變化,如圖1所示:
圖1 隨機移動軌跡中隨機策略的應用思路
在Unity3D內(nèi)部封裝的Random類提供的Range()函數(shù)可以在用戶自定義的最小數(shù)與最大數(shù)之間隨機返回一個浮點型的數(shù)值,(這個范圍包含最小數(shù),但不包含最大數(shù))[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函數(shù)每被調(diào)用一次,就會對偏移量進行一次刷新,從而實現(xiàn)目標向量的不斷更新。因此還需要設置一個刷新機制,以確保每隔一段時間就可以對目標向量進行更新。
Unity3D內(nèi)置有Update()函數(shù),該函數(shù)在系統(tǒng)運行時會被自動調(diào)用,調(diào)用頻率為每幀調(diào)用一次,大約每秒Update()函數(shù)會被調(diào)用千次以上。如果要在Update()內(nèi)實現(xiàn)移動目標的定時更新,還需要重新設定代碼的刷新頻率。具體實現(xiàn)步驟如下:
( 1 ) 獲取FlockBoid當前的移動位置,以三維坐標(,,)表示;
( 2 ) 獲取FlockBoid當前的移動目標,以三維坐標(,,)表示;
( 3 ) 計算FlockBoid從當前位置到移動目標的間距,公式如下:
( 4 ) 設定FlockBoid從當前位置到移動目標的最小間距為space,將與space進行比較,如果>space,說明FlockBoid距離移動目標還比較遠,對移動目標不做位置更新;如果 當隨機策略更新了移動目標后,F(xiàn)lockBoid也會隨之更新移動軌跡,向新的目標點移動,群組中所有節(jié)點也會通過對FlockBoid的追蹤,重新規(guī)劃各自的移動路徑。 本研究主要圍繞Boids算法在Unity3D模擬生物群組行為中的應用展開深入研究,并在此基礎上對衍生出的復雜群組行為進行了討論,最后針對群組行為的移動軌跡更新問題,提出了基于Boids的隨機性改進策略。改進后的算法策略能夠為很多復雜的群組行為提供隨機性問題與路徑規(guī)劃問題的解決思路,從而有效改善群組行為的模擬效果。 [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 總結(jié)