Unity3D中的Mesh

  http://www.cnblogs.com/zhanghaipeng-Unity3D/p/4714973.html

  之前一直对unity中Mesh到底是什么和实现不清楚,花了时间把这部分看了一下,终于比较清楚了。

  Unity3D中的Mesh(网格)事实上就是我们所说的三角网格。而三角网格是什么呢,三角网格就是由一系列三角形组成的多边形网格,主要用于模拟复杂物体的表面,事实上游戏开发过程中美术给我们的人体、车辆模型都是由一个或多个三角网络(mesh)组成的。下面我们来通过程序实现一些简单的三角网格:

  1、一个简单的三角网格类

  struct Triangle{   //组成三角网格的基本单位三角形类

  Vector3 p[3];  //三角形的顶点数组

};

 //维护一个三角形数组

  struct TriangleMesh{  //简单的三角网格类

  int triCount;     //网格中三角形的总数

  Triangle *triList;  //存放三角形的链表

};

  这种表示方法的优点就是实现简单,对于一些情况也许已经能满足需求,但是这种表示方法却不能体现"网格"所隐含的三角形连通性,毕竟所有的三角形都一股脑的放在了三角形链表中。

  实际中的三角网格,每个三角形都和其他三角形共享边,所以三角网格需要存储三类信息:

    顶点:每个三角形由3个顶点。各顶点都有可能和其他三角形共享。

    边:连接两个顶点的边。每个三角形有3条边。

  面:每个三角形对应一个面。我们可以用顶点或者边的列表表示面。

  因此出现了很多有效的网格表示方法,下面我们来讨论一种标准的存储格式:索引三角网格。

2.索引三角网格:

  与上面实现的维护一个三角形数组不同,我们在索引三角网格中维护两个列表,顶点表和三角形表。

  每个顶点包含一个3D位置,一般也会包括纹理映射坐标(UV坐标),表面法向量,光照值等附加信息(这些信息我们在后面的文章讨论)。通常来说我们要考虑顶点列出的顺序,根据顶点列出的顺序来得出三角面的“正面”或“反面”。下面是一个高度简化的代码用于表示索引三角形网格。

  struct Vertex{   //由于存储三角形顶点级信息

    Vector3 p;

   .......    //其他信息 纹理映射坐标 法向量 光照信息

  };

  struct Triangle{  //保存三角形级信息

    int vertex[3];  //三个顶点在顶点列表的索引

  };

  //存放三角网格的结构 维护两个表 定点表和三角形表

  struct TriangleMesh{

    int vertexCount; //顶点数

  Vertex *vertexList; //顶点存放链表

  int triangleCount; //三角形数量

  Triangle *triangleCount; //存放三角形的链表

  };

  在这种实现方法中,索引三角形网格隐含了邻接的信息,可以通过搜索三角形链表得到公共顶点的索引以此来得出公共边(好吧,是有点费效率),但是这种方法要比之前的省空间的多,因为信息都存在顶点级,三角形级只存储顶点索引信息,而顶点索引信息的重复一般要比顶点信息重复占用的空间小的多。

时间: 2024-08-29 17:56:19

Unity3D中的Mesh的相关文章

Unity3d中使用assetbundle

1.导出assetbundle: ①单个资源导出成assetbundle: ②多个资源导出成一个assetbundle: 2.读取assetbundle: ①加载到内存: ②解压为具体资源. 1.导出assetbundle: ①单个资源导出成assetbundle: BuildPipeline.BuildAssetBundle(Object obj, null, string path, BuildAssetBundleOptions.CollectDependencies, BuildTarg

Unity3d中3D Text对模型的穿透显示

昨晚,好友在电话里问我在Unity3d中使用3D Text,不想让其穿透模型显示,即想让场景中的3D Text与模型有正确的遮挡关系,怎么解? 今早谷歌上查了查,明白了原因,因为3D Text的默认材质的shader是GUI/Text Shader(自然就有了GUI的穿透显示的特性),而且不可以去手动更改. 记录解决方式如下: 1.自己写个想要的shader,并建个使用它的材质球: 2.导入自己的中文字体: 3.替换掉3D Text上的默认材质球. 首先,搭建一个好友在电话里描述的场景: 新建一

Unity3D 动态创建Mesh(一)

1.Mesh.MeshFilter.MeshRenderer关系整理 在Unity3D中创建一个Cube,在Inspector可以看到其中含有MeshFilter.MeshRenderer组件. MeshFilter含有一个Public成员 Mesh. 在Mesh中存储着三维模型的数据:vertices(顶点数据数组Vector3[]).triangles(三角形顶点索引数组,int[]).normals(法线向量数组,Vector3[]).uv(纹理坐标数组,Vector2[]). 2.使用M

(转载)Unity3d中3D Text对模型的穿透显示

Unity3D中使用3D Text(Text Mesh)时,如何让场景中的物体和3D Text有正确的遮挡关系.由于3D Text默认材质是(Font Material),他的shader是GUI/Text Shader,自然也就有了GUI的穿透特性,所以我们使用自定义材质就可以解决这个问题了. 1.新建材质,并将如下shader设置给它 Shader "Custom/3D Text Shader" { Properties { _MainTex ("Font Texture

Unity3D中的多线程及使用多线程

Unity3D中的多线程.线程是一个相当复杂的话题,但如果掌握了它,就可以从容的使用多个硬件处理器或处理很难划分管理数据块. 如在场景中用A*算法进行大量的数据计算,变形网格中操作大量的顶点,持续的要运行上传数据到服务器,二维码识别等图像处理,如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine. 线程是在程序中与其他线程同时运行的进行.在多处理器的计算机上可以做到多个线程的真正的同步,更多的线程取决于有多个处理核心. Unity3D编程时,总有个主

Unity3D 中的灯光与渲染

最近仔细研究了Unity3D中的灯光以及渲染,有了全新的认识,在这里整理记录下来.博主所使用的是Unity3D 2017.3.1f1这个版本. 一.Unity3D中的灯光 Directional Light:平行光,用来模拟太阳发射的光. Point Light:点光源,用于模拟场景中的灯和其他本地光源. Spot Light:聚光灯,通常用于人造光源,如手电筒,汽车前灯和探照灯. Area Light:区域光,只能用于烘焙中. Reflection Group:反射探针,用于准确反射周围环境.

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因: 多半是因为物体所属Layer与照相机的culling mask不一致导致的,或者超出照相机的可视范围. 如果游戏中有多个相机,每个相机都有自己的可视范围和culling mask,物体在移动的过程中,进入不同的相机,其可见性可能是变化的,取决与物体所属Layer与当前相机是否一致

(转)Unity3D中移动物体位置的几种方法

1. 简介 在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale). 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position). 2.1 Transform.Tra

Windows系统Unity3D中的快捷键

[狗刨学习网] Windows系统Unity3D中的快捷键[td] 组合键 键 功能 File 文件 Ctrl   N New Scene 新建场景 Ctrl   O Open Scene 打开场景 Ctrl   S Save Scene 保存 Ctrl Shift S Save Scene as 保存场景为 Ctrl Shift B Build Settings... 编译设置... Ctrl   B Build and run 编译并运行 Edit 编辑 Ctrl   Z Undo 撤消 C