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. msp430入门编程37

    msp430中C语言的可移植--屏蔽实现细节

  2. Codeforces 659E New Reform【DFS】

    题目链接: http://codeforces.com/problemset/problem/659/E 题意: 给定n个点和m条双向边,将双向边改为单向边,问无法到达的顶点最少有多少个? 分析: 无 ...

  3. P2820 局域网 洛谷

    https://www.luogu.org/problem/show?pid=2820 题目背景 某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成 ...

  4. 使用Spring Data Redis操作Redis(集群版)

    说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...

  5. 学习swift从青铜到王者之Swift控制语句04

    1 if语句基本用法 if boolean_expression { /* 如果布尔表达式为真将执行的语句 */ } 如果布尔表达式为 true,则 if 语句内的代码块将被执行.如果布尔表达式为 f ...

  6. 从ASP.NET Core 3.0 preview 特性,了解CLR的Garbage Collection

    前言 在阅读这篇文章:Announcing Net Core 3 Preview3的时候,我看到了这样一个特性: Docker and cgroup memory Limits We conclude ...

  7. ASP.NET Core 奇淫技巧之动态WebApi

    一.前言 接触到动态WebApi(Dynamic Web API)这个词的已有几年,是从ABP框架里面接触到的,当时便对ABP的这个技术很好奇,后面分析了一波,也尝试过从ABP剥离一个出来作为独立组件 ...

  8. 我被C++开发欺辱的岁月

    前言 人被压迫了,为什么不斗争?——鲁迅 作为一个C#开发者,我经历了,也见证了很多同行饱受C++开发的歧视和欺辱. 而且,这种行为,现在依然持续的发生在C#开发者的身上,就目前为止,绝大部分C#开发 ...

  9. kvm虚拟化学习笔记(一)之kvm虚拟化环境安装

    平时一直玩RHEL/CentOS/OEL系列的操作,玩虚拟化也是采这一类系统,kvm在RHEL6系列操作系统支持比较好,本文采用采用OEL6.3操作系统,网上所有文章都说KVM比xen简单,我怎么感觉 ...

  10. Linux 快照

    10个方法助你轻松完成Linux系统恢复 提交 我的留言 加载中 已留言 这也就是为什么系统恢复功能会让人感觉如此神奇.你可以很快地重新回到工作中去,就像什么事情都没有发生一样,也不用去管造成系统故障 ...