1. 前言

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

2. Mesh数据简介

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

3.创建简单的Mesh

 Vector3[] newVertices = { 
        new Vector3(-0.5f, 0, 0), new Vector3(0.5f, 0, 0), 
        new Vector3(-0.5f, 0, 1), new Vector3(0.5f, 0, 1) 
    };
 Vector2[] newUV = { 
        new Vector2(0, 0), new Vector2(1, 0), 
        new Vector2(0, 1), new Vector2(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格子地图的边界处理方式,在边缘上铺上一层破碎效果的边
            



    


创建Mesh->格子地图转NavMesh->可破坏墙壁的更多相关文章

  1. cocos2dx中的格子地图TileMap

    格子地图的优点: a.节省内存,我们知道对于一款游戏来说,如果以图片来作为地图的话,对于神庙逃亡,魂斗罗这样的场景很多,地图很长的游戏显然不现实,因为图片很占内存,但是这些游戏的地图有一个特点就是:重 ...

  2. 创建用户故事地图(User Story Mapping)的8个步骤

    [小编]上周六了解了用户故事地图后,小编又查阅了一些资料,找到了以下这篇关于如何组织用户故事地图规划的文章,分享给大家.也希望大家如果有好的实践,也可以留言一起交流. 原文地址:http://winn ...

  3. threeJS创建mesh,创建平面,设置mesh的平移,旋转、缩放、自传、透明度、拉伸

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

  4. javascript 百度地图无秘钥(appkey)创建marker标记地图

    创建简单的marker地图不一定需要去百度地图申请key,简单代码实现marker地图,效果如图: html代码如下,代码中的baidu.api.js参考后面的隐藏代码: <!DOCTYPE h ...

  5. Unity通过脚本创建Mesh(网格)

    ##1.创建一个带Mesh的物体 Unity中的网格作为组件不能脱离物体单独存在 新建脚本CreateMesh public class CreateMesh: MonoBehaviour { voi ...

  6. Unity3D学习笔记4——创建Mesh高级接口

    目录 1. 概述 2. 详论 3. 其他 4. 参考 1. 概述 在文章Unity3D学习笔记2--绘制一个带纹理的面中使用代码的方式创建了一个Mesh,不过这套接口在Unity中被称为简单接口.与其 ...

  7. unity2018使用tileMap生成地图 类似泰拉瑞亚创建和销毁地图块

    参考网站:https://blog.csdn.net/pz789as/article/details/79540890 using System.Collections; using System.C ...

  8. unity, 用脚本创建mesh

    创建一个空gameObject,添加Mesh Filter和Mesh Renderer两个component,再添加一个脚本createMeshScript: using UnityEngine;us ...

  9. Unity中动态创建Mesh

    什么是Mesh? Mesh是指的模型的网格,3D模型是由多边形拼接而成,而多边形实际上又是由多个三角形拼接而成的.即一个3D模型的表面其实是由多个彼此相连的三角面构成.三维空间中,构成这些三角形的点和 ...

随机推荐

  1. iOS url带中文下载时 报错解决方法

    问题描述:下载文件时, 请求带中文的URL的资源时,比如:http://s237.sznews.com/pic/2010/11/23/e4fa5794926548ac953a8a525a23b6f2/ ...

  2. union关键字和字节大小端序的确定

    union 关键字的用法与struct 的用法非常类似. union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间 ...

  3. java Map集合对比分析

    1.Map:Map是所有map集合的顶级父接口,用于key/value形式的键值对,其中每一个key都映射到一个值,key不能重复. 2.TreeMap:该map将存储的键值对进行默认排序,并且还能够 ...

  4. idea2019设置智能提示忽略大小写

    2019的设置和2018的不太一样,话不多说,直接上干货.setting --> Editor --> General --> Code Completion 直接把这个选项前面的勾 ...

  5. 海量数据处理面试题学习zz

    来吧骚年,看看海量数据处理方面的面试题吧. 原文:(Link, 其实引自这里 Link, 而这个又是 Link 的总结) 另外还有一个系列,挺好的:http://blog.csdn.net/v_jul ...

  6. vim配置为IDE环境(超详细,极力推荐 git)

    https://github.com/yangyangwithgnu/use_vim_as_ide 1. 用法 git clone https://github.com/VundleVim/Vundl ...

  7. Hive中行列转换

    1.演示多列转为单行 数据文件及内容: student.txt xiaoming|english|92.0 xiaoming|chinese|98.0 xiaoming|math|89.5 huahu ...

  8. List<Guid?> a = new List<Guid?>();

    正常写法 泛型 类型 为 Guid? List<Guid?> a = new List<Guid?>(); Guid? b = null; Nullable<Guid&g ...

  9. 嵌入式开发之davinci---DM8168 8127 8148 HDVPSS中的一些英文缩写解释

    BLEND:Alpha blends input with the graphics.将输入的视频与图形做Alpha融合. CPROC:Color Processing.颜色处理.如动态对比度增强.饱 ...

  10. 【网站支付PHP篇】thinkPHP集成支付宝支付(担保交易)

    目录 系列说明 开发环境 部署支付宝 支付请求 支付宝返回处理 系列说明 最近在帮朋友的系统安装支付模块(兑换网站积分),现在总结一些开发心得,希望对大家有用.这个系列会讲以下第三方支付平台的集成: ...