Unity3D中的Mesh
2015-08-09 11:12
489 查看
之前一直对unity中Mesh到底是什么和实现不清楚,花了时间把这部分看了一下,终于比较清楚了。
Unity3D中的Mesh(网格)事实上就是我们所说的三角网格。而三角网格是什么呢,三角网格就是由一系列三角形组成的多边形网格,主要用于模拟复杂物体的表面,事实上游戏开发过程中美术给我们的人体、车辆模型都是由一个或多个三角网络(mesh)组成的。下面我们来通过程序实现一些简单的三角网格:
http://blog.csdn.net/littleadr/article/details/47374341
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; //存放三角形的链表
};
在这种实现方法中,索引三角形网格隐含了邻接的信息,可以通过搜索三角形链表得到公共顶点的索引以此来得出公共边(好吧,是有点费效率),但是这种方法要比之前的省空间的多,因为信息都存在顶点级,三角形级只存储顶点索引信息,而顶点索引信息的重复一般要比顶点信息重复占用的空间小的多。
Unity3D中的Mesh(网格)事实上就是我们所说的三角网格。而三角网格是什么呢,三角网格就是由一系列三角形组成的多边形网格,主要用于模拟复杂物体的表面,事实上游戏开发过程中美术给我们的人体、车辆模型都是由一个或多个三角网络(mesh)组成的。下面我们来通过程序实现一些简单的三角网格:
http://blog.csdn.net/littleadr/article/details/47374341
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; //存放三角形的链表
};
在这种实现方法中,索引三角形网格隐含了邻接的信息,可以通过搜索三角形链表得到公共顶点的索引以此来得出公共边(好吧,是有点费效率),但是这种方法要比之前的省空间的多,因为信息都存在顶点级,三角形级只存储顶点索引信息,而顶点索引信息的重复一般要比顶点信息重复占用的空间小的多。
相关文章推荐
- Unity武器系统的优化
- Unity3D NGUI制作进度条
- Unity内置的shader include files
- Unity 真机调试
- Unity3D新手教学,让你十二小时,从入门到掌握!(二)
- 基于unity的直升机模拟设计
- Unity5.0 EventSystem事件系统的详细说明
- 于Unity3D动态创建对象和创建Prefab三种方式的原型对象
- Unity NGUI实现2048(三)反编译APK文件
- Unity NGUI实现2048(二)逻辑分析
- Unity-Tween
- Unity3D试题
- Unity3D 游戏贴图(法线贴图,漫反射贴图,高光贴图)
- Unity NGUI实现2048(一)源代码
- Unity编辑器-创建单独编辑框,折叠框,提示框
- [Unity-7] Update和FixedUpdate
- Unity3D中uGUI事件系统简述及使用方法总结
- Get and Post(Unity3D六个发展)
- unity代码反混淆
- unity 反编译 step2 dll -->reflector