1、RecastNavigation詳解html
RecastNavigation定義:
RecastNavigation是一個導航尋路工具集,使用鄰接的凸多邊形集合描述一個3D場景,A*尋路算法使3D場景的可達性獲得保證。
Polygon是Detour的基本尋路單元,在Poly(Polygon凸多邊形)中,任意兩個點是能夠直線到達的。
github:https://github.com/recastnavigation/recastnavigationgit
RecastNavigation功能:
能表達一個3D場景;
能接近精確的賦予遊戲對象3維座標屬性;
能判斷3D場景表面2個點的可達性;
能動態改變3D場景地形。github
RecastNavigation內容:
NavMesh(導航網格尋路)= 鄰接的凸多邊形(Recast) + A*尋路(Detour)
一、Recast,用於生成鄰接的凸多邊形集合數據,使用參照示例:RecastDemo/Sample_SoloMesh.cpp
① Solo Mesh,純粹的鄰接凸多邊形集合。
② Tile Mesh,基於Tile劃分的N個鄰接凸多邊形集合。
③ Temp Obstacles,支持動態障礙物的,基於tile劃分的N個鄰接的凸多邊形集合。
二、Detour,基於鄰接的凸多邊形集合的A*尋路算法,示例參照:RecastDemo/NavMeshTesterTool.cpp算法
*RecastNavigation的全部操做都是基於地表面的,對於空中對象的交互是沒法完成的,這時能夠結合其餘引擎,如physx進行對象的空中交互。緩存
源碼結構:
DebugUtils 調試
Detour 利用導航網格作尋路操做。導航網格可使Recast生成的,也能夠是其餘工具生成的。
DetourCrowd 提供羣體尋路行爲的功能
DetourTileCache Tile緩存
Recast 根據提供的模型生成用於尋路的導航網格
RecastDemo 展示Recast、Detour提供的功能的Demo
Test 測試服務器
SoloMesh生成過程(RecastDemo/Sample_SoloMesh.cpp中handleBuild函數),導航網格生成步驟:
場景模型體素化(Voxelization),或者叫光柵化(Rasterization)。
過濾可行走表面(Walkable Suface)
區域生成(Region)
輪廓生成(Contour邊緣)
輪廓網格生成(Poly Mesh)
三角形化(Triangulation)生成細節網格(Detailed Mesh)函數
2、RecastNavigation構建
RecastNavigation使用Premake5構建,須要自行安裝,若是使用make進行構建,須要編寫Makefile。
Premake下載地址:https://premake.github.io/download.html工具
Windows下使用vs編譯
一、RecastNavigation依賴於SDL庫,下載SDL源碼,解壓到RecastNavigation/RecastDemo/Contrib/目錄下
二、進入SDL/VisualC/目錄,打開開解決方案,編譯在SDL/VisualC/Win32/Debug下生成 SDL2.dll、SDL2.lib、SDL2main.lib
三、複製到SDL/lib/x86下,實際上這些文件下載的時候已經存在了,不須要2中的步驟
四、下載premake5.exe到工程目錄RecastNavigation/RecastDemo/下,cmd命令行進入此目錄,執行premake.exe vs2017 premake5.lua,生成解決方案在RecastNavigation/RecastDemo/build/下。
五、打開解決方案,在RecastNavigation/RecastDemo/Bin/下生成RecastDemo.exe可執行文件測試
Linux下編譯
一、git clone https://github.com/recastnavigation/recastnavigation.git
二、安裝SDL,OpenGL
SDL要編譯
進入目錄 ./configure make make install
OpenGL能夠經過命令安裝
yum install mesa-libGL-devel.x86_64
yum install mesa-libGLU-devel.x86_64
設置環境變量export PKG_CONFIG_PATH=SDL目錄,不然make的時候找不到SDL.h文件
三、cd recastnavigation/RecastDemo/
四、premake5 gmake
五、cd Build/gmake/
六、makeui
3、相關知識
一、包圍球:
......
二、AABB包圍盒:
xmin < x < xmax
ymin < y < ymax
zmin < z < zmax
頂點 (xmin, ymin, zmin),(xmax, ymax, zmax)
中心點
float center()
{
center[0] = (min[0] + max[0]) * 0.5;
center[1] = (min[1] + max[1]) * 0.5;
center[2] = (min[2] + max[2]) * 0.5;
return center;
}
三、OBB包圍盒:
......
地形建模方法:
grid(方格)
waypoint(路徑點)
navmesh(導航網格)
4、服務器使用RecastNavigation
一、從Unity導出場景,使用navigation尋路組件bake完成生成好的導航網格(navmesh),生成recast可識別的obj文件。
二、使用RecastNavigation加載場景,並驗證其正確性。
// 這裏要用到Sample_TileMesh.h中結構體 struct NavMeshSetHeader { int magic; int version; int numTiles; dtNavMeshParams params; }; struct NavMeshTileHeader { dtTileRef tileRef; int dataSize; }; // 打開讀取客戶端生成的NavMesh文件 FILE* fp = fopen(navameshpath, "rb"); if (!fp) return 0; NavMeshSetHeader meshHeader; size_t len = fread(&meshHeader, sizeof(NavMeshSetHeader), 1, fp); f (len != 1 || meshHeader.magic != NAVMESHSET_MAGIC || meshHeader.version != NAVMESHSET_VERSION) { fclose(fp); return 0; } dtNavMesh* dtMesh = dtAllocNavMesh(); if (!dtMesh) { fclose(fp); return 0; } dtStatus dtStatus = dtMesh->init(&meshHeader.params); if (dtStatusFailed(dtStatus) { fclose(fp); return 0; } // 讀取全部Tiles,獲取MeshQuery對象,下一步能夠用MeshQuery對象進行尋路 for (int i =0; i < meshHeader.numTiles; ++i) { NavMeshTileHeader tileHeader; len = fread(&tileHeader, sizeof(NavMeshTileHeader), 1, fp) ...... }
三、Detour驅動AI尋路。
參考資料:
https://zhuanlan.zhihu.com/p/35100455 RecastNaviagtion
https://cloud.tencent.com/developer/article/1006053
http://chenshungen.cn/%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A83d%E5%AF%BB%E8%B7%AF%E5%BA%94%E7%94%A8-recastnavigation/
未完待續 ......