這篇是轉的文章,原文 http://blianchen.blog.163.com/blog/static/1310562992010324046930/
nav尋路一般包含兩部分,首先是使用工具根據地圖信息生成尋路用的nav mesh,接下來就是在游戲中根據生成的nav mesh來自動尋路。
一般人首先關心的就是尋路方法,所以這里把順序顛倒下,先說尋路。
一. 使用A*尋找所經過網格路徑
下圖為一個已經生成nav網格的地圖,深紅色區域為不可行走區域,淺紅色區域為可以行走的區域。
如下圖,現在如果要尋找從A點到B點的路徑,首先要從所有可行走的網格中找到一條最優的網格路徑(圖中紫色的網格),然后再根據這些網格生成所需要的路徑點。
計算最優網格路徑的方法可以使用流行的A*,也可以使用其它方法。A*算法網上很多就不說了,至於三角網格的A*實現因為涉及網格的數據結構會在系列的最后給出。
二. 生成路徑點
nav尋路最常用的就是光照射線法了,這個在neoragex2002的blog上有講,這里就不說了
http://www.cnblogs.com/neoragex2002/archive/2007/09/09/887556.html
另一種方法就是拐角點法,如下圖
下圖的5個凸多邊形是已經生成的導航網格,多邊形外部的區域為不可行走區域,current為起點,goal為終點,從圖中就可以看出最短路徑為圖中紅線,藍色圈出的點為我們需要找出的點。所有多邊形頂點均按逆時針方向存儲(這些均在生成導航網格時處理,以后會講到)。
(1)下圖顯示出各區域之間的入口,即多邊形的臨邊。由圖中可以看出每個臨邊均為起點穿出該多邊形區域的邊,故以下稱該邊為穿出邊。
(2)首先找到起始點所在的多邊形和穿出邊的兩個端點,由起點連接兩個端點,形成兩個線段lineLeft 和lineRight。如下圖。綠色圈表示左點,紅色表示右點(左點、右點是根據多邊形頂點保存順序而來)。
(3)繼續找到下一個穿出邊的兩個端點,判斷新的左點是否在lineLeft 和lineRigh之間,如果在,則更新lineLeft為起點到新左點的線段。
同樣處理新穿出邊的右點,如下圖
該步最后得到兩個新的線段,如下圖。
(4) 繼續判斷下一個穿出邊的兩個端點,如下圖,新的左點在lineLeft和lineRight的外面,則不更新線段。
下圖說明新的右點在兩條直線之間,更新lineRight。
該步最后得到兩個新的線段,如下圖。
(5) 繼續循環判斷下一個穿出邊的兩個端點,該穿出邊的兩個端點都在lineRight的右側,表示lineRight的終點即為路徑的一個拐角點。
(6) 循環以上步驟都可以找到從起點到終點的一條完整路徑。