流場,通常爲網格圖,網格中的每個節點包含一個向量,該向量是物體在該位置時指望的速度。html
利用流場的速度信息指導大量物體同時進行尋路。換句話說,如何生成能夠尋路的流場,纔是問題的關鍵。git
這裏有一篇英文的文章和一個示例[3],閱讀文章有助理解流場尋路,英文不夠好的同窗也能夠從例子中獲取感性的認識。
流場尋路
在線示例github
流場的簡單生成:算法
流場根據迪傑斯特拉圖生成的,而迪傑斯特拉圖是依據衆多智能移動體共同目的地以及節點運動消耗圖生成。編程
節點運動消耗圖,用0表示可正常經過,用極大值表示障礙物,用其餘值表示河水,沼澤,斜坡,樹林等地形信息。瀏覽器
首先,須要依據節點運動消耗圖以及衆多智能移動體共同目的地生成迪傑斯特拉圖。緩存
迪傑斯特拉圖中的每一節點包含其距離目的地節點的最少運動消耗。性能
細節就是以目的地爲起點進行迪傑斯特拉算法搜索到圖中其餘全部節點的最短運動消耗,其餘非目的地節點保存這到目的節點的最短運動消耗。優化
什麼迪傑斯特拉算法,請參看。
迪傑斯特拉算法人工智能
須要注意的是,本文中的例子生成的迪傑斯特拉圖,其實使用廣度優先算法生成的,這是由於邊權值所有爲1(路徑消耗均爲1)。
其次,依據迪解釋特拉圖生成流場。流場每個節點包含一個指向某個鄰居節點的向量,而且該向量所指向的鄰居節點,在全部鄰居節點中其距離目的路徑消耗最少。而向量的大小能夠爲移動智能體的最大速率,或者單位化。
當位於流場某一位置時,如何選取對應的速度向量,可使用簡單的歸整法獲取速度向量。 也能夠採用雙線性內插法依據上下左右其餘四個節點值來計算[1]。
什麼是線性內插?請參看線性內插
流場的生成的速度向量不必定徹底最佳,可使用一些修正算法,好比視線修正法[2],來適當的調節速度向量的方向或者無視流場給出的方向。
流場能夠和其餘行爲結合起來,實現更復雜的組合操控行爲。例如,流場+羣聚(分離,彙集,對齊)。這一點在Game AI Pro - Efficient Crowd Simulation for Mobile Games給出了具體的實現思路。
「最高指揮官2」和「堅守陣地2」這兩款遊戲確定是用了流場尋路。最近比較火的「皇室戰爭」也可能使用流場尋路(固然我猜的)。其實,流場尋路適合兩種類型的遊戲RTS和MOBA(即時戰略和塔防),說白了最適合大量智能運動物體擁有共同目的地尋路。
你們能夠輕易的發現,HowToRTS例子有不少明顯的問題,我在研究時作了一些優化。包括以下內容:
用瀏覽器就能夠下載HowToRTS示例代碼,我建議你們自動動手改一改玩一玩。
參考文獻:
[1]Graham Pentheny,Game AI Pro : Efficient Crowd Simulation for Mobile Games
[2]Elijah Emerson,Game AI Pro :Crowd Pathfinding and Steering Using Flow Field Tiles
[3]https://howtorts.github.io/2014/01/04/basic-flow-fields.html
[4]Mat Buckland,遊戲人工智能編程案例精粹
[5]Daniel Shiffman,代碼本色-用編程模擬天然
[6]http://aigamedev.com/open/tutorial/theta-star-any-angle-paths/
後記
早年的一些RTS,好比紅色警惕,帝國時代2,星際爭霸都被尋路的性能問題各類折磨。
帝國時代2的農民,反應延遲很是嚴重(一個接一個的尋路)。
星際爭霸一隊只有12個單位(同時尋路,但沒法支持更多單位同時尋路)。
紅色警惕2部隊多了直接死機。流場尋路專治RTS尋路各類不服。
原創文章,謝絕轉載。