1. 前言

最近连续做了很多代码动态生成Mesh的工作,从动态生成修改瞄准范围的Mesh到可破坏的墙壁,以及之前写了一半导航网格生成.
想借此机会整理下最近的积累,如果在阅读过程中发现一些问题或是有争议的地方,欢迎交流

2. Mesh数据简介

一个Mesh的必要结构有: 顶点,三角形
用于渲染的Mesh一般就会有:
UV:   一般会有多组,一般0是主贴图uv,Unity中1是lightmaps使用 2是dynamic GI使用
法线: 处理光照等
颜色: 一般作为额外数据存储
其他数据;

3.创建简单的Mesh

Vector3[] newVertices = { 
newVector3(-0.5f, 0, 0), newVector3(0.5f, 0, 0), 
newVector3(-0.5f, 0, 1), newVector3(0.5f, 0, 1) 
};
Vector2[] newUV = { 
newVector2(0, 0), newVector2(1, 0), 
newVector2(0, 1), newVector2(1, 1) 
};
int[] newTriangles = { 0, 2, 1, 2, 3, 1 };
LineMesh = new Mesh();
LineMesh.vertices= newVertices;
LineMesh.uv= newUV;
LineMesh.triangles = newTriangles;
LineMesh.RecalculateBounds();    
应用在游戏里:
a. 拖尾,轮胎印
b. 技能瞄准特效
4.格子地图转NavMesh
过程概述:
1 划分区域       
这步比较简单,把相连的局域划分再一起就可以了
2 每个范围的边缘点
针对每个局域计算边界,先用Marching squares 算法 获取轮廓再用Douglas-Peucker算法压缩轨迹

3 生成全Mesh
将空间内的关键点,边数据,用 Delaunay 德洛内三角划分,该算法比较复杂,但网上有很多实现
一个Unity中的实现: https://github.com/Scrawk/Hull-Delaunay-Voronoi 
一个纯算法的实现: https://www.cs.cmu.edu/~quake/triangle.html   
需要注意的是,有时候划分出来的边,和预想中的边不一致,需要处理一下

4 剔除阻挡内的三角形

5 对比Unity原生的导航网格生成数据

最终结果分析
这里给的过程只是由格子地图数据往导航网格数据转化的一种方法,并不是真正的导航网格生成算法.
缺少了关于半径的处理,多层空间的处理,凸多边形划分等操作

5. 可破坏的墙壁

可破坏的墙壁一般有三种实现方法
1. 将有限种类的砖块按照简单逻辑组合成一面墙,破损时,按砖块掉落
如彩虹6号中的木板墙就是用这种方法做的
2. 将原本的Mesh离线拆分为几块,在破碎时整体爆开
一般的整体可破坏物都是这么做的,比如木栅栏
3. 某个部位被破坏时,实时在Mesh上扣一个洞
把墙壁被破坏的部分当做是阻挡,和之前所讨论的格子地图转导航网格的算法十分类似
4. 有一些额外的数据要处理
a 将2D的Mesh片生成为3D的墙壁
需要将顶点位移复制一份,背面三角形反向,边缘补上侧面
b 显示部分数据,需要额外计算顶点的uv值
c 破碎边缘的处理,参考2D格子地图的边界处理方式,在边缘上铺上一层破碎效果的边

转载于:https://www.cnblogs.com/Hichy/p/9145857.html

创建Mesh-格子地图转NavMesh-可破坏墙壁相关推荐

  1. threejs创建3d交互地图

    文章目录 前言 关键点 源码 总结 前言 基于react-hooks创建的三维地图,只实现了基本的交互展示,可根据个人喜好增加各种交互和展示效果,效果如下. 关键点 使用threejs创建3d地图注意 ...

  2. mesh threejs 属性_threeJS创建mesh,创建平面,设置mesh的平移,旋转、缩放、自传、透明度、拉伸...

    这个小案例是当初我在学习的时候,小的一个小案例,代码还需要进一步优化:还请谅解~~:主要用到了threeJS创建mesh,创建平面,设置mesh的平移,旋转.缩放.自传.透明度.拉伸等这些小功能: 采 ...

  3. 建立桌面文件管理格子_win10如何创建桌面格子_win10怎么建立桌面文件管理格子...

    为了更加方便用户的操作,win10系统中也增加了不少功能,其中就包括桌面格子,能够给予用户将各种文件保存在各个桌面下,但是有些用户可能还不懂得怎么使用,那么win10如何创建桌面格子呢?接下来就来告诉 ...

  4. 开源WebGIS开发——如何创建一张地图

    一.创建一张地图分为五个步骤 1.下载openlayers开发包 2.创建一个HTML网页并引入openlayers(包括css样式和js文件) 3.创建图层对象,引入地图资源  ol.Layer ( ...

  5. 六边形格子地图的基本实现

    六边形格子地图的基本实现 基本思路 这是一张大小为 21 × 15 的六边形格子地图 我们将左上角的格子定义为 (1, 1) 则部分地图的坐标如下 易知: 若起点为(x, y) 当y为奇数时 可以前往 ...

  6. 如何简单高效的创建用户故事地图?

    或许您也遇到如下的问题: 1. 这个产品大概有哪些主要功能? 2. 不知道每个迭代什么时候发布,更不知道每个迭代要做哪些功能? 3. 某个功能能给客户带来什么好处? 相信读完这篇文章之后可以回答这些问 ...

  7. 杂篇-01-Unity中创建Mesh时遇到的问题

    摘要 今天在做水渲染时,需要手动创建一个顶点数很多的Mesh让波形更加精准,写一个MeshCreater脚本,其中遇到了一些Unity限制的问题. MeshCreater 首先了解Unity的Mesh ...

  8. ECharts 创建中国气泡地图和定位图表点 点击地区域高亮显示

    ECharts 创建中国气泡地图和定位图表点 点击地区域高亮显示 ECharts 官方案例: https://www.makeapie.com/editor.html?c=x_kEnG-Ggq 效果如 ...

  9. Unity使用Isometric Z As Y Tilemap创建2.5D地图(一)如何创建Tilemap

    Unity2019使用Isometric Z as Y Tilemap创建2.5D地图 (一)创建Tilemap 1.Tilemap的类型 2.新建Isometric Z As Y Tilemap 2 ...

最新文章

  1. 计算机视觉开源库OpenCV之CommandLineParser使用方法
  2. 如何在ubuntu下安装detectron2_Anaconda中安装Cascade RCNN(Detectron)的若干问题
  3. 纽约大学计算机和信息科学专业排名,纽约大学计算机科学与信息系统世界排名2018年最新排名第33(QS世界排名)...
  4. 17秋 软件工程 团队第五次作业 Alpha Scrum3
  5. 基础的shell编程问题(一)
  6. 【MySQL】 如何在“海啸”下保命
  7. aspx repeater 用法_ASP.NET-----Repeater数据控件的用法总结
  8. gcc在64位系统上一个史诗级WARNING
  9. 北京大学2019年数学分析考研试题
  10. 前端(jQuery)(10)-- jQuery标签切换
  11. 【底层原理】x86-64体系下一个奇怪问题的定位
  12. app接码教程,附源码
  13. 看图找茬找不同小程序源码
  14. IDEA快速启动ssm项目
  15. python简单实现爬取小说《天龙八部》,并在页面本地访问
  16. Pycharm删除键、复制粘贴键失灵解决方案
  17. 小目标 | Power BI新人快速上手手册
  18. 5个超实用的浏览器插件,让你的上网体验翻天覆地!
  19. 创建一个docker容器
  20. 计算机图形学算法总结

热门文章

  1. 人类高质量文章:阿里大佬的回顾
  2. win7音量图标点了没反应的修复方法
  3. 如何把视频压缩,视频压缩软件哪个最好
  4. 用HBuilderX开发小程序的一些问题
  5. 简单的视频压缩大小技巧来了,小白也能轻松上手
  6. PHP获取客户端真实IP的方法
  7. C++函数模板和模板函数的区别
  8. 微软原版系统安装Win7篇
  9. linux去除pdf页头,删除PDF水印小妙招
  10. 解决 ERROR 1044 (42000): Access denied for user ‘‘@‘localhost‘ to database ‘mysql‘