关于 Unity NavMesh 数据的导出和使用
上周的工作重点转移到服务器寻路上来,刚刚做完没几天,总结一下,当时团队讨论的结果是使用 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 数据的导出和使用的更多相关文章
- 关于 Unity NavMesh 数据的访问
目前的工作需要加入自动寻路,后来决定使用 unity 自带的 NavMesh,但有个问题是这个寻路数据,服务器也是需要的,那么我就要把这个数据导出为服务器所用才行. 但 NaveMesh 暂 ...
- 让Unity NavMesh为我所用
Unity里面整合了一个NavMesh功能,虽然让人又爱又恨. 但当你在其他地方需要这个NavMesh的数据时,就更让人欲罢不能了. 比如说服务器需要Unity的NavMesh数据时. 比如说你想将U ...
- unity A*寻路 (一)导出NavMesh数据
使用unity的API NavMesh.CalculateTriangulation 可以获取NavMesh数据 首先 我们创建一个新的工程 保存一个test场景 然后在场景中添加一个Plane作 ...
- unity A*寻路 (二)读取NavMesh数据
上一章节我们已经看了怎么获得NavMesh数据保存为obj 这一章节我们来读取NavMesh数据 首先我们要定义两个结构体 点 和 三角形 为什么不用unity自带的Vector3呢? 相信你们应该已 ...
- Unity关于用LoadLevelAdditiveAsync导致新场景的Navmesh数据不正确Loading条的实践
为了解决用Application.LoadLevelAdditiveAsync 导致新场景的Navmesh数据不正确(我们用的是4.63),我们现在loading条做法是先切到Loading的场景,然 ...
- Unity NavMesh 格式 解析 分析 对比 Recast Navigation
工具软件 Excel Nodepad++ Sublime Unity 5.4 / 5.6 VS RecastDemo CodeBlocks 分析过程以Unity项目-Demo13为例 一. 创建测试模 ...
- ITTC数据挖掘平台介绍(五) 数据导入导出向导和报告生成
一. 前言 经过了一个多月的努力,软件系统又添加了不少新功能.这些功能包括非常实用的数据导入导出,对触摸进行优化的画布和画笔工具,以及对一些智能分析的报告生成模块等.进一步加强了平台系统级的功能. 马 ...
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)
<Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)
<Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...
随机推荐
- java线程中生产者与消费者的问题
一.概念 生产者与消费者问题是一个金典的多线程协作的问题.生产者负责生产产品,并将产品存放到仓库:消费者从仓库中获取产品并消费.当仓库满时,生产者必须停止生产,直到仓库有位置存放产品:当仓库空时,消费 ...
- 暑假集训(1)第四弹 -----Find a way(Hdu2612)
Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Nin ...
- 2015 Multi-University Training Contest 1 题解&&总结
---------- HDU 5288 OO’s Sequence 题意 给定一个数列(长度<$10^5$),求有多少区间[l,r],且区间内有多少数,满足区间内其它数不是他的约数. 数的范围$ ...
- jsonp 使用示例
客户端: <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>< ...
- javaScript & jquery完美判断图片是否加载完毕
好久没写东西了,正好最近因为工作需要,写了一个瀑布流异步加载的程序. 今天就不谈瀑布流,来谈一下关于load的问题. ----------------------------------------- ...
- ng表单验证,提交以后才显示错误
只在提交表单后显示错误信息 有时候不想在用户正在输入的时候显示错误信息. 当前错误信息会在用户输入表单时立即显示. 由于Angular很棒的数据绑定特性,这是可以发生的. 因为所有的事务都可以在一瞬间 ...
- Soy文件生成JS文件 - 一个使用Google soy模板的例子
1.下载工具包,后解压. http://closure-templates.googlecode.com/files/closure-templates-for-javascript-latest.z ...
- ubuntu杂记
安装ssh: sudo apt-get install openssh-server sudo /etc/init.d/ssh start 将主机中vmware8的网络改为自动获取ip,就可以ping ...
- CSS3------background-size(背景图片尺寸属性)
background-size 可以设置背景图片的大小,数值包括 长度length和百分比percentage. 并且会根据背景原点位置 background-origin 设置其图片覆盖的范围.那么 ...
- The Unified Modeling Language(UML)
统一过程建模语言UML 统一过程建模语言UML是一种标准的可视化建模语言,使用在: 业务建模和类似的过程 居于软件系统的分析.设计.和实现 UML 是一门通用语言,提供给业务分析员,软件架构师和开发 ...