Mesh是Unity内的一个组件,称为网格组件。
- Mesh 网格
- MeshFilter 网格过滤器
- Mesh Renderer 网格渲染器
Mesh:是指模型的网格,建模就是建网格。细看Mesh,可以知道Mesh的主要属性内容包括顶点坐标,法线,纹理坐标,三角形绘制序列等其他有用属性和功能。因此建网格,就是画三角形;画三角形就是定位三个点。
Mesh Filter:内包含一个Mesh组件,可以根据MeshFilter获得模型网格的组件,也可以为MeshFilter设置Mesh内容。
Mesh Render:是用于把网格渲染出来的组件。MeshFilter的作用就是把Mesh扔给MeshRender将模型或者说是几何体绘制显示出来。
Mesh的属性:
- 顶点坐标(vertex)
- 法线(normal)
- 纹理坐标(uv)
- 三角形序列(triangle)
顶点坐标:顶点坐标数组存放Mesh的每个顶点的空间坐标,假设某mesh有n个顶点,则vertex的size为n
法线:法线数组存放mesh每个顶点的法线,大小与顶点坐标对应,normal[i]对应顶点vertex[i]的法线
纹理坐标:它定义了图片上每个点的位置的信息. 这些点与3D模型是相互联系的, 以决定表面纹理贴图的位置. UV就是将图像上每一个点精确对应到模型物体的表面. uv[i]对应vertex[i]
三角形序列:每个mesh都由若干个三角形组成,而三角形的三个点就是顶点坐标里的点,三角形的数组的size = 三角形个数 * 3.
例如:某mesh有四个顶点0,1,2,3,
V0(1, 1, 0),
V1(-1, 1, 0),
V2(1, -1, 0),
V3(-1, -1, 0)
那么它们可以组成这样的一个网格,
tri[0] = ver[0],ver[3],ver[1],tri[1] = ver[0],ver[2],ver[3],
注意:三角形的顶点顺序必须是顺时针,顺时针表示正面,逆时针表示背面,而unity3d在渲染时默认只渲染正面,背面是看不见的。
那么该三角形可以表示为:
tri = new int[2 * 3]{0, 3, 1, 0, 2, 3};
如何要获取第N个三角形对应的三个顶点坐标,则:v1 = tri[N*3 + 0], v2 = tri[N*3 + 1], v3 = tir[N*3 + 2]
示例:
1.创建一个GameObject并添加MeshFilter以及MeshRender组件,并创建一个“CreateMesh.cs”脚本给它。
2.获取该对象的filter组件,并创建一个mesh给它。
3.为该mesh设置属性,这里先设置顶点,然后将三角形与顶点绑定
using UnityEngine;
using System.Collections;
public class CreateMesh : MonoBehaviour {
private MeshFilter filter;
private Mesh mesh;
// Use this for initialization
void Start () {
// 获取GameObject的Filter组件
filter = GetComponent<MeshFilter>();
// 并新建一个mesh给它
mesh = new Mesh();
filter.mesh = mesh;
// 初始化网格
InitMesh();
}
// Update is called once per frame
void Update () {
}
/// <summary>
/// Inits the mesh.
/// </summary>
void InitMesh()
{
mesh.name = "MyMesh";
// 为网格创建顶点数组
Vector3[] vertices = new Vector3[4]{
new Vector3(1, 1, 0),
new Vector3(-1, 1, 0),
new Vector3(1, -1, 0),
new Vector3(-1, -1, 0)
};
mesh.vertices = vertices;
// 通过顶点为网格创建三角形
int[] triangles = new int[2 * 3]{
0, 3, 1, 0, 2, 3
};
mesh.triangles = triangles;
}
}
效果图
网格已经成功生成,接下来该给网格贴图了,在Inspector视图里选中Mesh Render,并拖一个材质给它,
Mesh Render是负责渲染的,将Mesh Filter里的mesh通过自身的Materials渲染出来。
设置完材质后,我们需要将纹理贴图与网格顶点一一对应起来,这样才能渲染出来
// 为mesh设置纹理贴图坐标
Vector2[] uv = new Vector2[4]{
new Vector2(1, 1),
new Vector2(0, 1),
new Vector2(1, 0),
new Vector2(0, 0)
};
mesh.uv = uv;
效果图
mesh还有两个重要的属性,法线和颜色