RecastNavigation(3D場景建模、網格導航)


一、RecastNavigation詳解

  RecastNavigation定義:
    RecastNavigation是一個導航尋路工具集,使用鄰接的凸多邊形集合描述一個3D場景,A*尋路算法使3D場景的可達性得到保證。
    Polygon是Detour的基本尋路單元,在Poly(Polygon凸多邊形)中,任意兩個點是可以直線到達的。
    github:https://github.com/recastnavigation/recastnavigation

  RecastNavigation功能:
    能表達一個3D場景;
    能接近精確的賦予游戲對象3維坐標屬性;
    能判斷3D場景表面2個點的可達性;
    能動態改變3D場景地形。

  RecastNavigation內容:
    NavMesh(導航網格尋路)= 鄰接的凸多邊形(Recast) + A*尋路(Detour)
    1、Recast,用於生成鄰接的凸多邊形集合數據,使用參照示例:RecastDemo/Sample_SoloMesh.cpp
      ① Solo Mesh,純粹的鄰接凸多邊形集合。
      ② Tile Mesh,基於Tile划分的N個鄰接凸多邊形集合。
      ③ Temp Obstacles,支持動態障礙物的,基於tile划分的N個鄰接的凸多邊形集合。
    2、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)

二、RecastNavigation構建
  RecastNavigation使用Premake5構建,需要自行安裝,如果使用make進行構建,需要編寫Makefile。
  Premake下載地址:https://premake.github.io/download.html

  Windows下使用vs編譯
    1、RecastNavigation依賴於SDL庫,下載SDL源碼,解壓到RecastNavigation/RecastDemo/Contrib/目錄下
    2、進入SDL/VisualC/目錄,打開開解決方案,編譯在SDL/VisualC/Win32/Debug下生成 SDL2.dll、SDL2.lib、SDL2main.lib
    3、復制到SDL/lib/x86下,實際上這些文件下載的時候已經存在了,不需要2中的步驟
    4、下載premake5.exe到工程目錄RecastNavigation/RecastDemo/下,cmd命令行進入此目錄,執行premake.exe vs2017 premake5.lua,生成解決方案在RecastNavigation/RecastDemo/build/下。
    5、打開解決方案,在RecastNavigation/RecastDemo/Bin/下生成RecastDemo.exe可執行文件

  Linux下編譯
    1、git clone https://github.com/recastnavigation/recastnavigation.git
    2、安裝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文件
    3、cd recastnavigation/RecastDemo/
    4、premake5 gmake
    5、cd Build/gmake/
    6、make

三、相關知識
  1、包圍球:
    ......
  2、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;
    }
  3、OBB包圍盒:
    ......

  地形建模方法:
    grid(方格)
    waypoint(路徑點)
    navmesh(導航網格)

四、服務器使用RecastNavigation
  1、從Unity導出場景,使用navigation尋路組件bake完成生成好的導航網格(navmesh),生成recast可識別的obj文件。
  2、使用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)
      ......
    }

  3、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/

未完待續 ......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM