zoukankan      html  css  js  c++  java
  • 让Unity NavMesh为我所用

    Unity里面整合了一个NavMesh功能,虽然让人又爱又恨。

    但当你在其他地方需要这个NavMesh的数据时,就更让人欲罢不能了。

    比如说服务器需要Unity的NavMesh数据时。

    比如说你想将Unity的场景导出到其他引擎时,比如时下流行的H5。

     

    最近我就碰到了这样一个需求,走了一些弯路,研究了Unity的NavMesh

    1. 将Unity的NavMesh数据导出

    先说代码,我编写了一个导出脚本,将navmesh数据可以导出成一个obj,也可以导出成一个json文件

    你可以用svn 获取代码

    http://code.taobao.org/svn/falconconv/trunk/babylonfan/webgl/res_navmeshexport

     

     

    原理是Unity提供了一个接口可以得到NavMesh的三角形数据

    这里直接有vertices 顶点,和 indices顶点索引

    但是这个数据不可直接导出,这个数据不可直接导出这个数据不可直接导出。

    导出来的三角形基本上都是不共边的,不共边怎么做连通图呢,这不行,所以要先分析他。

    我已经帮你分析过了,这里unity发明了一个方法表达多边形,我没有搜到类似这样的做法,姑且认为是Unity发明的方法

     

    Unity的NavMeshData有一些共边的三角形,共边的三角形其实不是连通关系,共边的三角形只是他们共同构成一个凸多边形,并且这种共边的三角形,全部都是扇形排列。

    首先先以此划分,生成多边形列表。这个多边形列表,当然没有共边。

     

    Unity的NavMeshData 那些不共边的多边形只是index索引不共边,从坐标上还是有共边的,所以我们合并掉重合顶点,重新排列多边形的index索引,就可以恢复到有共边的多边形列表和顶点列表

     

    做了如上两步以后,我们就得到了原始的navmesh数据,有共边的多边形列表和顶点列表

    然后将它写入obj文件或者json文件就可以了。

    具体Unity的花招就是上面两步,代码可以拉svn研究。

    二、外部使用这些数据

    然后我们就可以脱离Unity来实现一个NavMesh了,到这里其实如果你接触过寻路,已经不用看了,如果你懒,接着往下看

     

    我先在winform环境用c#实现了一个navmesh

    你可以用svn拉取测试程序源码

    http://code.taobao.org/svn/falconconv/trunk/babylonfan/webgl/navmesh_pathfinding_test

    用导出的json文件画出了连通图,鼠标左右键,完成寻路。

    Navmesh的寻路原理是两步

    1. 先用astar 算法从navmesh连通图找出经过的三角形,图中的灰色部分
    2. 用照射法在经过的三角形中找出一条路径

    然后将c#代码移植为TypeScript代码,就将navmesh带到h5了

    一样可以从svn拉取代码:

    http://code.taobao.org/svn/falconconv/trunk/babylonfan/webgl/canvas/canvasWebgl_NavMesh

  • 相关阅读:
    redis的安装
    thinkphp5学习
    php数组排序和查找的算法
    phprpc的简单使用
    apache学习教程
    mysql的存储过程,函数,事件,权限,触发器,事务,锁,视图,导入导出
    php设计模式八-----装饰器模式
    php设计模式七 ---组合模式
    64bit ubuntu14.04编译PlatinumKit出现的arm-linux-androideabi-g++: not found错误解决方法
    TS相关知识点
  • 原文地址:https://www.cnblogs.com/crazylights/p/5732078.html
Copyright © 2011-2022 走看看