RecastNavigation(3D场景建模、网格导航)-程序员宅基地

技术标签: git  运维  操作系统  

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

未完待续 ......

转载于:https://www.cnblogs.com/damonxu/p/9858669.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aisaozhu1456/article/details/101971562

智能推荐

个人联想Thinkpad X1 carbon 笔记本遇到的问题及解决办法_thinkpad x1carbon开机黑屏-程序员宅基地

文章浏览阅读214次。新买的一台联想Thinkpad X1 carbon 12代笔记本,不知道怎么搞的,突然有一天启动后会出现一段黑屏时间,然后等一段时间才会正常,非常地烦人。打电话给联想客服只提供了附近的维修地点,但那得花时间跑去啊。今天下午自己摸索终于解决问题了。没什么好办法,我开始卸载电脑上很多的软件,一是不想用了,二是想卸载的这些软件可能就是导致这个问题出现的原因,在卸载的时候看到电脑上的相关应用,但是在点开相机应用的时候竞然发现相机不能用了。怎么这么奇怪,我想到我以前确实是设置了一下相机的权限,难道是这个问题引起的。_thinkpad x1carbon开机黑屏

Krpano:打造全景漫游体验—基础(一)-程序员宅基地

文章浏览阅读577次,点赞29次,收藏8次。由于基础知识太多,篇幅太长,本文只讲解了krpano的运作机制、tour.js的讲解以及krpano各个元素的简单介绍,下一篇文章将详细讲解krpano中的动作也就是< action >元素的使用和用法。

vue 前端表格导入与导出_vue fixdata-程序员宅基地

文章浏览阅读557次。excel导入到表格表格导入与导出,文末带Blob.js和Export2Excel.js导入按钮<input type="file" @change="import(this)" accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"/>导入方法import(obj) { _vue fixdata

Error: protect(): protection stack overflow [防护堆叠上溢] 解决方案①_r studio中保护堆栈溢出-程序员宅基地

文章浏览阅读6.4k次。在执行R代码是遇到防护堆叠上溢的error,有效方案①1、命令行到Rgui.exe的地址(cmd)2、输入Rgui.exe --max-ppsize=5000003、在打开的R中输入options("expressions"=20000)memory.limit(size=8000000)https://www.researchgate.net/post/error_protect_protection_stack_overflow_in_R..._r studio中保护堆栈溢出

ORA-01092、ORA-00704、ORA-39700 错误的处理方法_ora-01092: oracle instance terminated. disconnecti-程序员宅基地

文章浏览阅读7.6k次。场景:通过rman做一个数据库的异机恢复,进行到最关键的一步,打开数据库的时候报了错误,详细如下SQL&gt; startup mount;Oracle 例程已经启动。Total System Global Area 6797832192 bytesFixed Size 2241264 bytesVariable Size 3523218704 bytesDatabase Buffers 3254..._ora-01092: oracle instance terminated. disconnection forced ora-00704: boots

java 判断ftp文件是否存在_java如何检验ftp服务器中指定文件是否存在-程序员宅基地

文章浏览阅读202次。项目工作中,需要检验ftp服务器中指定文件是否存在,在网上查阅了相关资料,可以通过ftpClient类进行实现。免费学习视频教程分享:java课程具体实现代码:import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPR..._java判断ftp file是否存在

随便推点

高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)_高通提取dtb-程序员宅基地

文章浏览阅读5.8k次,点赞3次,收藏61次。本系列导航:高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)高通平台8953 Linux DTS(Device Tree Source)设备树详解之二(DTS设备树匹配过程)高通平台8953 Linux DTS(Device Tree Source)设备树详解之三(高通MSM8953 android7.1实例分析篇)一.什么是DTS?为..._高通提取dtb

ubuntu上opencv源码编译_libjasper-dev源码-程序员宅基地

文章浏览阅读301次。安装必备包sudo apt-get install build-essential cmake libjpeg-dev libtiff5-dev libjasper-dev安装gtkfor opencv3.2 and above:sudo apt-get install libgtk-3-devfor opencv2.4.x:sudo apt-get install libgtk2.0-dev安装v4l2sudo apt-get install v4l2ucp v4l-ut._libjasper-dev源码

安卓设备连接Unity Profiler进行性能分析_unity profile 手机-程序员宅基地

文章浏览阅读4.6k次,点赞2次,收藏7次。内容会持续更新,有错误的地方欢迎指正,谢谢!方式一:手机上运行游戏,以ADB方式连UnityProfiler分析游戏性能1.安卓环境:jdk、sdk:cmd(Win+R打开界面并输入cmd) 里直接输入 java 能正常输出即可 https://www.jianshu.com/p/21babde25dd5 adb:cmd 里直接输入 adb 能正常输出即可 https://www..._unity profile 手机

海思3559AV100实现8k文件编码_rk_mpi_cal_comm_getpicbuffersize-程序员宅基地

文章浏览阅读913次,点赞13次,收藏27次。有些小改动需要在common中改,都很简单就不写了,看一下就知道,另外我这边只测试了8k的一帧编码,如需连续编码视频需要再扩展一下,我这边由于公司项目安排就没再继续做了,测试出来8k文件编码的结果如下,颜色偏差是因为我的YUV和板子支持的YUV的存储顺序不一致,这里时间关系也就不调了,也算是顺利实现了芯片的8k文件编码。第二个函数是SAMPLE_VENC_CheckSensor,应该是检查镜头的分辨率支不支持要编的尺寸,这里我们先试的4k,所以也可以不管这个。_rk_mpi_cal_comm_getpicbuffersize

Android BLE 蓝牙通信库,2024年最新应届生面试销售岗位的面试问题技巧_android蓝牙通信-程序员宅基地

文章浏览阅读919次,点赞12次,收藏10次。然后根据自定义的协议,解析对应的 BeaconItem 中的 bytes,首先创建一个 BeaconParser,传入对应的 BeaconItem,然后根据协议不断读取数据, 如果协议中某个字段占 1 个字节,则调用 readByte,若占用两个字节则调用 readShort,如果要取某个字节的某个 bit 则调用 getBit。// 获取第 1 字节的第 1bit。可以在广播中携带设备的自定义数据,用于设备识别,数据广播,事件通知等,这样手机端无需连接设备就可以获取设备推送的数据。_android蓝牙通信

推荐文章

热门文章

相关标签