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

智能推荐

C语言——数组逆置(内含递归实现)-程序员宅基地

文章浏览阅读5k次,点赞5次,收藏25次。一.什么是数组的逆置呢?int a[10]={1,2,3,4,5,6,7,8,9,10};将数组变为 a[10]={10,9,8,7,6,5,4,3,2,1};这就叫做数组的逆置。二.1.循环实现数组的逆置这个是我们在初学C语言时最容易的实现方法!a.通过for循环实现//通过循环完成对数组的逆置#include<stdio.h>#define size 10void Inversion(int[], int);int main(void){ i_数组逆置

esp32-cam Thonny 烧录以及通信-程序员宅基地

文章浏览阅读229次,点赞4次,收藏3次。链接:https://pan.baidu.com/s/1cBsrCJ_TATFsuVhVdr0VmA?IO1和GND不再短接。重新插拔一下,就可以了。

字符,字节和编码-程序员宅基地

文章浏览阅读39次。级别:中级摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的办法。本文的内容涵盖了“中文问题”,“乱码问题”。掌握编码问题的关键是正确地理解相关概念,编码所涉及的技术其实是很简单的。因此,阅读本文时需要慢读多想,多思考。引言“字符与编码”...

Linux 修改 ELF 解决 glibc 兼容性问题_glibc_private-程序员宅基地

文章浏览阅读1.1k次。Linux glibc 问题相信有不少 Linux 用户都碰到过运行第三方(非系统自带软件源)发布的程序时的 glibc 兼容性问题,这一般是由于当前 Linux 系统上的 GNU C 库(glibc)版本比较老导致的,例如我在 CentOS 6 64 位系统上运行某第三方闭源软件时会报:[root@centos6-dev ~]# ldd tester./tester: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by._glibc_private

wxWidgets:常用表达式_wxwidget 正则表达式 非数字字符-程序员宅基地

文章浏览阅读282次。wxWidgets:常用表达式wxWidgets:常用表达式不同风味的正则表达式转义Escapes元语法匹配限制和兼容性基本正则表达式正则表达式字符名称wxWidgets:常用表达式一个正则表达式描述字符的字符串。这是一种匹配某些字符串但不匹配其他字符串的模式。不同风味的正则表达式POSIX 定义的正则表达式 (RE) 有两种形式:扩展正则表达式(ERE) 和基本正则表达式(BRE)。ERE 大致是传统egrep 的那些,而 BRE 大致是传统ed 的那些。这个实现增加了第三种风格:高级正则表达式_wxwidget 正则表达式 非数字字符

Java中普通for循环和增强for循环的对比_for循环10万数据需要时间-程序员宅基地

文章浏览阅读3.4k次,点赞5次,收藏11次。Java中普通for循环和增强for循环的对比_for循环10万数据需要时间

随便推点

Qt Creator 安装 VLD_qtcreater vld-程序员宅基地

文章浏览阅读509次。Qt Creator 安装 VLD2015-04-14 16:52:55你好L阅读数 2325更多分类专栏:qt版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/lin_jianbin/article/details/45044459一、环境说明1、VLD内存..._qtcreater vld

Linux 开发环境工具[zt]-程序员宅基地

文章浏览阅读120次。软件集成开发环境(代码编辑、浏览、编译、调试)Emacs http://www.gnu.org/software/emacs/Source-Navigator 5.2b2 http://sourceforge.net/projects/sourcenavAnjuta http://anjuta.sourceforge...._linux上安装flawfinder

java小易——Spring_spring的beanfactory是hashmap吗-程序员宅基地

文章浏览阅读109次。SpringIoC DI AOPspring底层用的是ConcurrentHashMap解耦合:工厂模式:需要一个模板控制反转 IoC将原来有动作发起者(Main)控制创建对象的行为改成由中间的工厂来创建对象的行为的过程叫做IoC一个类与工厂之间如果Ioc以后,这个时候,动作发起者(Main)已经不能明确的知道自己获得到的对象,是不是自己想要的对象了,因为这个对象的创建的权利与交给我这个对象的权利全部转移到了工厂上了所用包:DOM4j解析XML文件lazy-init = _spring的beanfactory是hashmap吗

温故而知新:部分常见的图像数学运算处理算法的用途_图像处理算啊-程序员宅基地

文章浏览阅读1.3k次,点赞29次,收藏24次。本文将图像处理中常用的数学运算算法及其对图像的作用做了个汇总介绍,有助于图像处理时针对对应场景快速选择合适的数学算法。_图像处理算啊

EM Agent Fatal agent error: State Manager failed at Startup_check agent status retcode=1-程序员宅基地

文章浏览阅读1.1k次。EM 不定期异常宕机,问题重复出现,之前几次因为忙于其它事,无力兼顾,等回头处理时,发现EM已恢复正常。这次问题又重现,准备彻底解决,过程如下:1. 重新启动EM失败,报错:/u01/oracle/agent/core/12.1.0.5.0/bin/emctl status agentOracle Enterprise Manager Cloud Control 12c Relea_check agent status retcode=1

JVM常用调优参数 ——JVM篇_jvm调优-程序员宅基地

文章浏览阅读1.9w次,点赞50次,收藏366次。JVM常用性能调优参数详解​ 在学习完整个JVM内容后,其实目标不仅是学习了解整个JVM的基础知识,而是为了进行JVM性能调优做准备,所以以下的内容就是来说说JVM性能调优的知识。一、性能调优​ 性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等等。​ 架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。性能调优基本上按照以下步骤进行:明确优化目标发现性能瓶颈性能调优通过监控及数据统计工具获得数据确认是否达到目标二、何时进_jvm调优