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/
未完待续 ......
RecastNavigation(3D场景建模、网格导航)的更多相关文章
- 微软Hololens学院教程-Hologram 230-空间场景建模(Spatial mapping )【微软教程已经更新,本文是老版本】
这是老版本的教程,为了不耽误大家的时间,请直接看原文,本文仅供参考哦!原文链接:https://developer.microsoft.com/EN-US/WINDOWS/HOLOGRAPHIC/ho ...
- 关于Unity中网格导航与寻路
寻路思路 1.烘焙出地形数据,导航数据,区分哪些是路径,哪些是障碍物 2.给要寻路的角色添加寻路的组件,加好了以后就会有速度和目的地之类的参数设置 3.只要设置好目的地,角色就会根据烘焙好的地图自己走 ...
- 点云深度学习的3D场景理解
转载请注明本文链接: https://www.cnblogs.com/Libo-Master/p/9759130.html PointNet: Deep Learning on Point Sets ...
- Ngui 五种点击事件实现方式及在3d场景中点透的情况
http://www.unity蛮牛.com/thread-22018-1-1.html ngui作为unity界面插件之一中,无疑是最好用,使用最多的了从自学unity到现在界面一直使用它 由于它的 ...
- 第一章 用three.js创建你的第一个3D场景
第一章 用three.js创建你的第一个3D场景 到官网下载three.js的源码和示例. 创建HTML框架界面 第一个示例的代码如下: 01-basic-skeleton.html 位于 Learn ...
- 基于 HTML5 WebGL 的 3D 场景中的灯光效果
构建 3D 的场景除了创建模型,对模型设置颜色和贴图外,还需要有灯光的效果才能更逼真的反映真实世界的场景.这个例子我觉得既美观又代表性很强,所以拿出来给大家分享一下. 本例地址:http://www. ...
- Three-js 创建第一个3D场景
1.一个场景至少需要的三种类型组件 相机/决定哪些东西将在屏幕上渲染 光源/他们会对材质如何显示,以及生成阴影时材质如何使用产生影响 物体/他们是在相机透视图里主要的渲染队形:方块.球体等 ...
- 3D场景中的鼠标响应事件
原文:3D场景中的鼠标响应事件 今天要讲的是3D场景中的鼠标响应事件的处理,首先Button的响应是大家熟知的,只要加上一个click事件,然后写一个响应的处理时间就行了.对于二维平面上的一些控件也很 ...
- 基于 HTML5 WebGL 构建智能城市 3D 场景
前言 随着城市规模的扩大,传统的方式很难彻底地展示城市的全貌,但随着 3D 技术的应用,出现了 3D 城市群的方式以动态,交互式地把城市全貌呈现出来.配合智能城市系统,通过 Web 可视化的方式,使得 ...
随机推荐
- IOS内购--后台PHP认证
参考网址:https://blog.csdn.net/que_csdn/article/details/80861408 http://www.php.cn/php-weizijiaocheng-39 ...
- (C/C++学习)5.C++中的虚继承-虚函数-多态解析
说明:在C++学习的过程中,虚继承-虚函数经常是初学者容易产生误解的两个概念,它们与C++中多态形成的关系,也是很多初学者经常产生困惑的地方,这篇文章将依次分别对三者进行解析,并讲述其之间的联系与不同 ...
- DOMContentLoaded 与onload区别以及使用
一.何时触发这两个事件? 1.当 onload 事件触发时,页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成了. 2.当 DOMContentLoaded 事件触发时,仅当DOM加载完 ...
- JDK,JRE,JVM三者关系
已上图,如有疏漏错误请在下面评论区指出,感激不尽!
- 00105_UDP和TCP协议
1.UDP协议 (1)UDP是User Datagram Protocol的简称,称为用户数据报协议: (2)UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接: (3)当一台 ...
- MAC OS下JDK版本切换指南
刚上手的用MAC开发的小伙伴们会发现,MAC自带JDK版本为1.6,通常会安装在 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/目录下,但是更多 ...
- hdu 3064
1:前n项和公式:1+2+3+...+n = n*(n+1)/2 2:前n项平方和公式:1^2+2^2+.........+n^2=n*(n+1)*(2n+1)/6 #include<stdio ...
- CODEVS2144 砝码称重2 (哈希表)
由于m很大,所以不能使用DP. 注意到n≤30,直接暴力2^n会TLE. 所以,将砝码平均分成两份,对一份进行一次暴力,用哈希表存下可能的结果. 对下一份再进行一次暴力,在哈希表中搜索剩余的砝码重量是 ...
- nyoj_171_聪明的kk_201402281518
聪明的kk时间限制:1000 ms | 内存限制:65535 KB 难度:3描述 聪明的“KK”非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国不断变换和绚丽多彩的自然风光 ...
- HIHO 16 C
树分治.对于一棵子树的根节点,至少有一条边与儿子相连的属于重边.对于一条轻边,它的贡献值是两端子树大小的乘积,所以,重边应该是贡献值最大的一边. 至于要求所有的点,进行深度优先搜索,因为移动一个点只会 ...