上周的工作重点转移到服务器寻路上来,刚刚做完没几天,总结一下,当时团队讨论的结果是使用 Unity 原生的 NavMesh 系统,然后将数据导出到服务器使用。我最初的思路是将导出的网格加载到服务器后,自己写 A* 算法来寻路,但看了 RecastNavigation 后,果断放弃想法,想使用已导出的数据到 RecastNavigation 中使用,按照作者的简介是可以,但是并没有相关的代码,后来翻到了一篇关于这个的帖子,作者明确回答说没有时间做这个功能,所以就只能自己动手,丰衣足食了,有这么个系统已经很棒了。

  第一步工作就是分析 RecastNavigation 的工作流,我后来着重分析了 rcPolyMesh 的结构,计划并利用通过普通 Mesh 生成 rcPolyMesh,然后再生成 dtNavMesh 的过程,只要 dtNavMesh 生成就可以保存真正的导航数据了。

  第二部就开始尝试将任意的 Mesh 转换成 rcPolyMesh,这一步最主要的过程是生成相应的多边形以及它们的邻边,你可以把所有的多边形都用 Mesh 的三角形替代,但是可能导致最终的 NavMesh 并不是最优化的,并且通过试验发现,三角形过多,多边形过细,反而出现了寻路不精确的情况,不知道是否是我的数据有问题,我的方法是先用上述方法把每个多边形设置为基础的三角形,然后用内建的函数来优化合并多边形,接着再建立邻边即可,这样就可以得出最优化的 NavMesh 最终数据。

  第三部仅限于使用 Unity 导出的 NavMesh 的情况,这里发现了很有意思的问题,Unity 在导出 NavMesh 的接口里做了一点小小的 Smart Trick,这里面的 Mesh 数据是包含 NavMesh 中得多边形 Poly 信息的!是的,你没有看错!我也是走了弯路才发现这个,因为当你直接用第二部的方法将 Unity 导出的 NavMesh 到 RecastNavigation 中,发现整个 Mesh 的内部出现了好多的 Outer Border,这说明这些边和其它多边形没有公共边,可是明明肉眼是能看到非常确定他们是共享某条被标记为 Outer Border 的边的,查了多遍建立邻边算法(一开始是自己写的)确实没有问题,后来猜测唯一的原因应该是出现了重复顶点-多个顶点具有相同的位置,将其原始数据导入到 Max 中发现果然如此!将数据导出成 obj,打开文件也发现了相同顶点数值。既然这样,你当然可以利用这些信息来建立多边形,这样多边形信息和 Unity 中会一模一样,是最完美的结果,很可惜迫于时间的压力我暂时没想到合适的分析算法,选择了第二种方案:在进行第二步之前,先将 Unity 导出的 NavMesh 中相同数值的顶点进行合并,然后再优化合并多边形,建立邻边,这样可能最终的多边形未必和 Unity 中一样,但是并不影响寻路,而且也足够优化,是目前性价比最高的方案。

  目前局限:不支持 DetailMesh(上述情况 DetailMesh 和 NavMesh 是相同的),不支持 OffMeshLink,但目前够我们的项目使用了,而且效果也非常理想。感兴趣的朋友可以按照上述方法尝试。

  另外:RecastNavigation 有非常好的 Demo 和代码注释,但是几乎没有什么文档来讲解整个 Pileline 后面的原理,但找到了个 CritterAI 系统,一个基于 RecastNavigation 系统,用 C# 实现的 AI 寻路系统,有着非常详细的文档,对理解 RecastNavigation 有很大的帮助。我自己也在学习整个系统,还有很多地方还不理解有待挖掘。

  文档地址:

    http://critterai.org/projects/cainav/doc/

  关于理解 NavMesh 生成:

    http://critterai.org/projects/cainav/doc/html/6fb3041b-e9be-4f03-868b-dcac944df19b.htm

    http://critterai.org/projects/cainav/doc/html/e72bd1ee-04b0-4bbb-a21d-d8d7ecaa11af.htm

    http://critterai.org/projects/cainav/doc/html/21046960-3dc1-4369-a092-5f5bba4f752c.htm

  关于 PolyMesh 的理解,尤其是其有关多边形信息的格式,对于理解 rcPolyMesh 非常关键:

    http://www.critterai.org/projects/cainav/doc/html/DE9679E3.htm

    http://www.critterai.org/projects/cainav/doc/html/B8C2F0F4.htm

  一则关于 Mesh 导入转换成 NavMesh 的讨论帖子:

    https://groups.google.com/forum/#!topic/critterai/WY1mj9mz5AE

  一则关于作者说不添加导入普通 Mesh 到 NavMesh 功能的讨论贴子:

    https://groups.google.com/forum/#!searchin/recastnavigation/import/recastnavigation/PJbyOPUtcaU/KoyGUkExkl8J

  这几天又开始转移到客户端,做其它的功能了,大家还得继续加油。

关于 Unity NavMesh 数据的导出和使用的更多相关文章

  1. 关于 Unity NavMesh 数据的访问

    目前的工作需要加入自动寻路,后来决定使用 unity 自带的 NavMesh,但有个问题是这个寻路数据,服务器也是需要的,那么我就要把这个数据导出为服务器所用才行.      但 NaveMesh 暂 ...

  2. 让Unity NavMesh为我所用

    Unity里面整合了一个NavMesh功能,虽然让人又爱又恨. 但当你在其他地方需要这个NavMesh的数据时,就更让人欲罢不能了. 比如说服务器需要Unity的NavMesh数据时. 比如说你想将U ...

  3. unity A*寻路 (一)导出NavMesh数据

    使用unity的API   NavMesh.CalculateTriangulation 可以获取NavMesh数据 首先 我们创建一个新的工程 保存一个test场景 然后在场景中添加一个Plane作 ...

  4. unity A*寻路 (二)读取NavMesh数据

    上一章节我们已经看了怎么获得NavMesh数据保存为obj 这一章节我们来读取NavMesh数据 首先我们要定义两个结构体 点 和 三角形 为什么不用unity自带的Vector3呢? 相信你们应该已 ...

  5. Unity关于用LoadLevelAdditiveAsync导致新场景的Navmesh数据不正确Loading条的实践

    为了解决用Application.LoadLevelAdditiveAsync 导致新场景的Navmesh数据不正确(我们用的是4.63),我们现在loading条做法是先切到Loading的场景,然 ...

  6. Unity NavMesh 格式 解析 分析 对比 Recast Navigation

    工具软件 Excel Nodepad++ Sublime Unity 5.4 / 5.6 VS RecastDemo CodeBlocks 分析过程以Unity项目-Demo13为例 一. 创建测试模 ...

  7. ITTC数据挖掘平台介绍(五) 数据导入导出向导和报告生成

    一. 前言 经过了一个多月的努力,软件系统又添加了不少新功能.这些功能包括非常实用的数据导入导出,对触摸进行优化的画布和画笔工具,以及对一些智能分析的报告生成模块等.进一步加强了平台系统级的功能. 马 ...

  8. Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)

    <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...

  9. Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)

    <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...

随机推荐

  1. 九度OJ 1078 二叉树遍历

    题目地址:http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历 ...

  2. (转)UIButton用法详解一

    (注明 来源网址 http://blog.csdn.net/cheneystudy/article/details/8115092)这段代码动态的创建了一个UIButton,并且把相关常用的属性都列举 ...

  3. [CUDA] ubuntu14.04+cuda7.5下安装cudnn7.0

    cuda:7.5 cudnn:cudnn-7.0-linux-x64-v4.0-prod.tgz cudnn样例:cuDNN v4 Code Samples 1. 解压 tar -zxvf cudnn ...

  4. webstorm快捷方式

    刚开始在使用webstrom的时候,不知道快捷方式,感觉自己把webstorm当做记事本使用,真的挺傻的,在朋友的指导下,原来webstorm有快捷方式 一.界面操作 快捷键 说明 ctrl+shif ...

  5. Spring MVC框架理解

    原文链接:ITeye SpringMVC深度探险专栏 基本要素 1. 指定SpringMVC的入口程序(在web.xml中) <!-- Processes application request ...

  6. MySQL事务隔离级别初探

    MySQL有四种隔离级别,分别是: READ UNCOMMITTED(未提交读) READ COMMITTED(提交读) REPEATABLE READ (可重复读) SERIALIZABLE(可串行 ...

  7. yii 使用renderPartial调用另外一个控制器的视图

    以下由我们在信易网络公司开发项目的时候终结出的一些经验 我们可以使用renderPartial访问存储在不同控制器的视图文件夹中的部分视图文件. 在Yii1.1.3中,我们使用双斜线“//”,程序就会 ...

  8. C#中的反射 Assembly.Load() Assembly.LoadFrom()

    一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集, ...

  9. C#中多线程写DataGridView出现滚动条导致程序卡死(无响应)的解决办法

    因为写的程序涉及到多线程维护一个DataGridView,然后蛋疼的发现经常卡死...一开始以为是读写冲突的原因,然后就加了锁,问题依旧...然后发现每次出现滚动条的时候程序才会无响应,所以感觉应该是 ...

  10. Swift(二,元组,可选类型,类型转化)

    一,首先,元组是Swift中特有的,OC中没有元组相关类型,具体怎么用,看下面的例子吧 //1.使用元组来定义一组数据 let infoTuple = (,1.8) let nameTuple = i ...