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. POJ 1661 Help Jimmy【DP】

    基础DP,过程想明白了其实也不复杂,从上面的推下面的比倒着推要简单很多.调试了半个多小时..简单dp依然不能快速AC..SAD.. 题目链接: http://poj.org/problem?id=16 ...

  2. 【Java源码】树-概述

    树的基本术语 结点(node)由数据元素以及指向子树的地址构成. 若 X 结点有子树,则子树的根结点称为 X 的孩子(child)结点,相应地, X 称为其孩子的双亲(parents)结点,又称父母结 ...

  3. 51nod 1499 (最小割)

    题意 分析 将一些点分成两个集合,很明显的最小割问题 设一个S.T,和S相连的点表示在B集合中,和T相连的点表示在A集合中 因为原题是完美值最大,我们转换一下,变成损失的价值最小,那么就是最小割问题了 ...

  4. Java的方法

    以下内容引用自http://wiki.jikexueyuan.com/project/java/methods.html: 一个Java方法是为了执行某个操作的一些语句的组合.举个例子来说,当调用Sy ...

  5. @Aspect注解无效

    Pointcut的execution配置正确的话,检查下,是否加了以下jar包 <!-- http://mvnrepository.com/artifact/org.aspectj/aspect ...

  6. arcgis安装路径的获得

    //Get the ArcGIS install location string sInstall = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path; / ...

  7. 【转载】TCP和TCP/IP的区别

    TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议, 又叫网络通讯协议,这个协议是Internet国际互联网络的基 ...

  8. css hack原理

    近期看了几篇关于css hack的文章,认为不错整理一下. css hack非常多人不理解它的原理,事实上大家都知道对于不同的浏览器,CSS的解析程度不一样.因此会导致生成的页面效果不一样:特别是对于 ...

  9. 2016/4/7 datatype:①json ②XML

    ①JSON 1,postjsonxml.php     json用循环方式处理传来的值  for(key in data) for(var i=0;i<data.length;i++){data ...

  10. Webapp兼容性布局