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

未完待续 ......

RecastNavigation(3D场景建模、网格导航)的更多相关文章

  1. 微软Hololens学院教程-Hologram 230-空间场景建模(Spatial mapping )【微软教程已经更新,本文是老版本】

    这是老版本的教程,为了不耽误大家的时间,请直接看原文,本文仅供参考哦!原文链接:https://developer.microsoft.com/EN-US/WINDOWS/HOLOGRAPHIC/ho ...

  2. 关于Unity中网格导航与寻路

    寻路思路 1.烘焙出地形数据,导航数据,区分哪些是路径,哪些是障碍物 2.给要寻路的角色添加寻路的组件,加好了以后就会有速度和目的地之类的参数设置 3.只要设置好目的地,角色就会根据烘焙好的地图自己走 ...

  3. 点云深度学习的3D场景理解

    转载请注明本文链接: https://www.cnblogs.com/Libo-Master/p/9759130.html PointNet: Deep Learning on Point Sets ...

  4. Ngui 五种点击事件实现方式及在3d场景中点透的情况

    http://www.unity蛮牛.com/thread-22018-1-1.html ngui作为unity界面插件之一中,无疑是最好用,使用最多的了从自学unity到现在界面一直使用它 由于它的 ...

  5. 第一章 用three.js创建你的第一个3D场景

    第一章 用three.js创建你的第一个3D场景 到官网下载three.js的源码和示例. 创建HTML框架界面 第一个示例的代码如下: 01-basic-skeleton.html 位于 Learn ...

  6. 基于 HTML5 WebGL 的 3D 场景中的灯光效果

    构建 3D 的场景除了创建模型,对模型设置颜色和贴图外,还需要有灯光的效果才能更逼真的反映真实世界的场景.这个例子我觉得既美观又代表性很强,所以拿出来给大家分享一下. 本例地址:http://www. ...

  7. Three-js 创建第一个3D场景

    1.一个场景至少需要的三种类型组件 相机/决定哪些东西将在屏幕上渲染    光源/他们会对材质如何显示,以及生成阴影时材质如何使用产生影响    物体/他们是在相机透视图里主要的渲染队形:方块.球体等 ...

  8. 3D场景中的鼠标响应事件

    原文:3D场景中的鼠标响应事件 今天要讲的是3D场景中的鼠标响应事件的处理,首先Button的响应是大家熟知的,只要加上一个click事件,然后写一个响应的处理时间就行了.对于二维平面上的一些控件也很 ...

  9. 基于 HTML5 WebGL 构建智能城市 3D 场景

    前言 随着城市规模的扩大,传统的方式很难彻底地展示城市的全貌,但随着 3D 技术的应用,出现了 3D 城市群的方式以动态,交互式地把城市全貌呈现出来.配合智能城市系统,通过 Web 可视化的方式,使得 ...

随机推荐

  1. mysql5.7初始化密码报错ERROR1820(HY000):YoumustresetyourpasswordusingALTERUSERstateme

    1,mysql5.6是密码为空直接进入数据库的,但是mysql5.7就需要初始密码 cat /var/log/mysqld.log | grep password 或者:grep 'temporary ...

  2. Django - Ajax基本内容整理

    将原来的请求结果普通字符串,变更为类字典的字符串 从这段代码中,可以看到,对原有函数,进行了一个try ...except....操作,进行异常捕捉,将捕捉过程及结果,存入在初始化的字典中,将字典通过 ...

  3. JavaScript day3(数据类型)

    数据类型(data type) JavaScript提供七种不同的数据类型(data types),它们是string(字符串), symbol(符号), number(数字), undefined( ...

  4. 瑞芯微ROCK960 RK3399固件烧录总结

    1 下载固件 进入瑞芯微ROCK960下载主页 https://www.96boards.org/documentation/consumer/rock/downloads/ 选择os固件, Debi ...

  5. 熟悉RHEL7登录界面使用

    Linux操作系统提供了图像界面和字符界面两种操作环境. 图像界面: 1.开启RHEL7后进入到该界面,图中用户是我们创建的本地用户,如果我们要以管理员身份登录则点击Not listed(未列出). ...

  6. Python面向对象----继承, 重载

    1. 面向对象三大特性之继承. 继承的便捷是子类可以直接调用父类里面的方法和属性.(在强类型语言里面是只能调用公有成员), 不用重复的造轮子. 减少程序猿的负担.实现多态等上层结构 2. 父类代码 3 ...

  7. JavaSE 学习笔记之多态(七)

    多 态:函数本身就具备多态性,某一种事物有不同的具体的体现. 体现:父类引用或者接口的引用指向了自己的子类对象.//Animal a = new Cat(); 多态的好处:提高了程序的扩展性. 多态的 ...

  8. crontab定时任务安装、使用方法

    本文介绍下,在linux中安装crontab的方法,以及crontab的具体用法,有需要的朋友参考下. 这里使用yum方式安装crontab:  复制代码代码示例: [root@CentOS ~]# ...

  9. class类加载机制

    1.类的加载过程 a.加载-链接-初始化-使用-卸载 加载: 查找并加载类的二进制数据 链接: 验证类的正确性,为类的静态变量分配内存,并将其初始化为默认值,把类的符号引用转换为直接引用. 初始化: ...

  10. iOS:去除UITableView的空白行

    要去除UITableView在运行时显示的多余空白行,只需要将TableView的Style从Plain改为Grouped即可.