參考:
critterai
http://www.critterai.org
recast & Detour
https://github.com/recastnavigation/recastnavigation
關於理解 NavMesh 生成:
關於 PolyMesh 的理解,尤爲是其有關多邊形信息的格式,對於理解 rcPolyMesh 很是關鍵:
一則關於 Mesh 導入轉換成 NavMesh 的討論帖子:
一則關於做者說不添加導入普通 Mesh 到 NavMesh 功能的討論貼子:
一個介紹CritterAI與Recast Navigation尋路的帖子
recast生成導航網格並非直接用Mesh的原始面片開始合併的
先從平面幾何體構建體素,再生成NavMesh
旋轉一個物體會影響他的NavMesh生成結果
![](http://static.javashuo.com/static/loading.gif)
recast.h 中有大的步驟函數的定義
recast生成的5個步驟:
1 體素化: 將場景中全部物體體素化,保證體素信息覆蓋所有原始幾何體
2 生成移動區域:
a 將體素的上表面取出,爲潛在可移動區域
b 剔除 距離阻擋(牆,傢俱)太近的 和 上表面過小不足以移動的(桌子,扶手)
c 合併能夠移動的面,根據高度差,中間有沒有阻擋等
d 剔除過小的面(最小面積)
![](http://static.javashuo.com/static/loading.gif)
3 生成輪廓(Contour):
a 從體素空間轉爲向量空間
b 從上一步的移動區域生成很是詳細的多邊形信息
Marching squares算法
https://en.wikipedia.org/wiki/Marching_squares
c 簡化相鄰多邊形的邊界
Douglas-Peucker算法
https://en.wikipedia.org/wiki/Polygonal_chain
b 簡化外部邊界(連接空的邊)
d 優化邊界長度(限定最長邊線)
![](http://static.javashuo.com/static/loading.gif)
4 生成凸多邊形:將輪廓幾何體細分爲凸多邊形
5 生成高度信息:將高度信息寫入頂點
Delaunay triangulation 讓三角形統一化
![](http://static.javashuo.com/static/loading.gif)