上周的工作重点转移到服务器寻路上来,刚刚做完没几天,总结一下,当时团队讨论的结果是使用 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. HDU 1176 免费馅饼(数字三角形)

    免费馅饼 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉 ...

  2. 九度OJ 1087 约数的个数

    题目地址:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  3. Maven多层嵌套

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  4. shell sort

    sort is awesome! 22 hpp_national:talk:recentAtUsers-64490 23 hpp_national:talk:site_online_users:178 ...

  5. libz.so库分析

    from:http://blog.chinaunix.net/uid-12773189-id-84605.html 1.查看库文件是由哪个软件包提供的空闲时打开/usr/lib目录(因为我知道这个目录 ...

  6. PL/SQL学习(二)条件和循环语句

      原文参考:http://plsql-tutorial.com/   PLSQL条件语句 IF THEN ELSE STATEMENT 1) IF condition THEN  statement ...

  7. 跨域、sql注入、xss攻击

    这几天遇到这三个问题,现在简单的记录下来. 1.跨域 如我服务器的域名是www.test1.com,我在另一个服务器www.test2.com通过ajax访问www.test1.com的数据时,就引起 ...

  8. TDirectory.IsEmpty判断指定目录是否为空

    使用函数: System.IOUtils.TDirectory.IsEmpty class function IsEmpty(const Path: string): Boolean; static; ...

  9. task_struct

    Linux中task_struct用来控制管理进程,结构如下: struct task_struct { //说明了该进程是否可以执行,还是可中断等信息    volatile long state; ...

  10. std::copy的使用

    看到有人在用std::copy这个东西,很简洁和爽啊,,所以找些帖子学习学习 http://blog.sina.com.cn/s/blog_8655aeca0100t6qe.html https:// ...