Recastnavigation解析

一、什麼是Recastnavigation

Recastnavigation是一個用於Mesh導航、尋路方面的底層庫,由Mikko Mononen製作,可以高效、精確地為遊戲、模擬、虛擬現實等領域中的靜態或動態環境生成導航網格。Recastnavigation利用了構建和搜索圖形存儲在網格上的路徑的技術,並具有強大的問題空間分割,自適應代理大小,快速尋路和緩存以及多線程支持。Recastnavigation庫開發始於2006年,目前支持Windows,Mac OSX,Linux和Android。Recastnavigation在遊戲、工程、兵棋推演等領域廣泛應用。

二、Recastnavigation的特點

Recastnavigation有哪些突出和獨特的特性卓越,可以適應需求呢?以下是Recastnavigation的幾個特徵。

1. 三角形網格建模

Recastnavigation可以處理多邊形,但最好使用三角形作為Recastnavigation的輸入。在三角網格上可生成更準確的、沒有分gon的或漏洞的多邊形地形。

2. 智能拼接單元格:

Recastnavigation使用一維線網格,而不是二維網格作為底層數據結構,它有助於Recastnavigation在巨大的網格上解決舒適取出的問題。大規模的單個網格會導致性能問題和內存使用問題,Recastnavigation將代理單元格子分成矩形網格進行處理,從而可以處理大規模世界。Recastnavigation採用粘合Trimmed K-D樹的局部化搜索,以避免在搜索路徑時耗費太多時間。

3. 凸性體積的智能代理縮放

Recastnavigation可以根據需要自動縮放代理,以適應現實世界中的不同類型的代理。Recastnavigation可以自適應改變代理的大小,區分原始數據的地形和代理的大小之間的關係,可以產生更加精確的地圖,並以更快的速度計算出路徑。

4. 快速路徑檢索

Recastnavigation相對Agenta*和其他技術有較快的尋路演算法。Recastnavigation緩存最短路徑,緩存同一個代理請求的路徑,這就降低了尋路時間。

5. 多線程優化:

Recastnavigation被優化了多線程,它的路徑搜索演算法非常可擴展,使Recastnavigation能夠在具有多核心處理器的現代計算機上快速計算路徑。

三、如何使用Recastnavigation

Recastnavigation的使用步驟如下:

1. 獲取Recastnavigation

Recastnavigation可以在網上下載最新的源,當前最新的版本為1.5.1。開發人員需要將源代碼包解壓並將其包含在程序項目中。

2. 載入三角形網格

首先載入三角形網格。Recastnavigation最好處理通過三角形,因此在進行人工建模時,需要確保將建模頂點轉化成三角形。將三角形網格導出為OBJ格式的文件,並在RCA濾芯中使用它。

3. 配置代理

代理有始於延續的過程。Recastnavigation通過代理評估代理的高度、寬度和長度,並為每個代理確定一個縮放半徑。使用單角代理時,需要根據代理尺寸設置縮放環境變數,以保證代理可以在地形上充分運用。

4. 構建導航網格數據

輸入三角形網格和代理尺寸,執行構建導航網格,Recastnavigation將生成和存儲導航網格數據。

BuildContext ctx;
InputGeom inputGeom;
if (!inputGeom.loadMesh(&ctx, sceneFilename)
    return;//導入地形
float* bmin = inputGeom.getMeshBoundsMin();
float* bmax = inputGeom.getMeshBoundsMax();
float* vertices = inputGeom.getMesh()->getVerts();
int nverts = inputGeom.getMesh()->getVertCount();
int* faces = inputGeom.getMesh()->getTris();
int ntris = inputGeom.getMesh()->getTriCount();
rcHeightfield* solid = rcAllocHeightfield();
rcChunkyTriMesh* chunkyMesh = rcAllocChunkyTriMesh();
if (!solid || !chunkyMesh)
    return; //無法正常申請相應大小的內存

5. 搜索路徑

在構建導航網格後,就可以開始在導航網格上執行搜索路徑。根據需求設置起點和終點,調用尋路演算法得到路徑。

rcContext ctx;
rcPolyMesh* m_navMesh = nullptr; //導航網格信息
rcCompactHeightfield* m_chf = nullptr;  //高度圖信息
rcConfig m_cfg;    //方格配置信息
rcPolyMeshDetail* m_pmdtl = nullptr;  //網格細節,用於尋路路徑的偏移量
rcContext m_ctx;   //地形數據信息
dtNavMeshQuery* m_navQuery = nullptr;  //查詢導航網格信息
//設置起始位置和目的地位置
dtPolyRef endPoly;
float endPos[3] = { dest[0], dest[1], dest[2] };
float startPos[3] = { start[0], start[1], start[2] };
dtStatus findStatus = m_navQuery->findNearestPoly(startPos, queryExtents, &filter, &m_startRef, 0);
dtStatus status = m_navQuery->findNearestPoly(endPos, queryExtents, &filter, &endPoly, 0);
//尋找路徑
int npath = 0;
status = m_navQuery->findPath(m_startRef, endPoly, startPos, endPos, &filter, polys, &npath, MAX_POLYS);
if (status != DT_SUCCESS || !(npath > 0))
    return; //尋路失敗

四、Recastnavigation的應用

Recastnavigation可以應用於虛擬現實、遊戲、工程、軍事模擬等眾多領域。以下是Recastnavigation的一些應用示例。

1.遊戲領域

顯然,尋路是遊戲的重要組成部分,Recastnavigation作為一款優秀、可靠的尋路引擎,已被許多遊戲和遊戲引擎所採納。例如:Unreal Engine 4、Unity、Cry Engine等。

2.軍事模擬領域

在軍事模擬領域,Recastnavigation可以用於模擬計算中的路徑搜索,以及部隊、交通工具移動的指揮和控制。Recastnavigation在模擬領域的精度和可靠性更有優勢。

3.虛擬現實領域

在虛擬現實領域,Recastnavigation可以為VR世界的導覽和交互提供導航解決方案。

五、總結

Recastnavigation是一款優秀、高效、可靠的尋路引擎,並具有智能代理縮放、快速路徑檢索、多線程支持等優秀特點。Recastnavigation已廣泛應用於遊戲、工程領域、兵棋推演領域等多個領域。如果你需要一個高效且可擴展的尋路解決方案。那麼,請嘗試適用Recastnavigation。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/248177.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:26
下一篇 2024-12-12 13:26

發表回復

登錄後才能評論