mesh简介
mesh为网格组件,3D模型是由多边形拼接而成,而多边形实际上是由多个三角形拼接而成的。
Mesh组成:
1、顶点坐标数组vertices
2、顶点在uv坐标系中的位置信息数组uvs
3、三角形顶点顺时针或者逆时针索引数组triangles
4、MeshFiler组件,用于增加mesh属性
5、MeshRender组件,增加材质并渲染出来。
6、可能还需要每个顶点的法线的数组normals
画三角形
我们简单的2d三角形,只需用到vertices和triangles
准备工作:
1.新建空物体,添加MeshFiler组件和MeshRender组件
2.再新建1个材质
3.然后新建c#脚本
public Material mat;
// Start is called before the first frame update
void Start()
{
DrawTriangle();
//DrawCircle(10, 50, Vector3.zero);
}
void DrawTriangle()
{
//mat为我们外界的材质球
gameObject.GetComponent<MeshRenderer>().material = mat;
Mesh mesh = GetComponent<MeshFilter>().mesh;
mesh.Clear();
//设置顶点
mesh.vertices = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0) };
//设置三角形顶点顺序,顺时针设置
mesh.triangles = new int[] { 0, 1, 2 };
}
这里你要运行之后,再Scene里查看,如果你的颜色是黑色,是因为我们还没有设置uv,所以我们先将材质球的shader为这样子:
画正方形
就是两个三角形而已
void DrawTriangle()
{
this.GetComponent<MeshRenderer>().material = mat;
Mesh mesh = GetComponent<MeshFilter>().mesh;
mesh.Clear();
//设置顶点
mesh.vertices = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0),new Vector3(1,0,0) };
mesh.triangles = new int[] {
0, 1, 2,
0 ,2, 3
};
}
画圆
void Start()
{
DrawTriangle();
//半径为6,就是六边形,圆的话大一些即可,我写50
DrawCircle(10, 50, Vector3.zero);
}
void DrawCircle(float radius, int segments, Vector3 centerCircle)
{
gameObject.GetComponent<MeshRenderer>().material = mat;
//顶点
Vector3[] vertices = new Vector3[segments + 1];
vertices[0] = centerCircle;
float deltaAngle = Mathf.Deg2Rad * 360f / segments;
float currentAngle = 0;
for (int i = 1; i < vertices.Length; i++)
{
float cosA = Mathf.Cos(currentAngle);
float sinA = Mathf.Sin(currentAngle);
vertices[i] = new Vector3(cosA * radius + centerCircle.x, sinA * radius + centerCircle.y, 0);
currentAngle += deltaAngle;
}
//三角形
int[] triangles = new int[segments * 3];
for (int i = 0, j = 1; i < segments * 3 - 3; i += 3, j++)
{
triangles[i] = 0;
triangles[i + 1] = j + 1;
triangles[i + 2] = j;
}
triangles[segments * 3 - 3] = 0;
triangles[segments * 3 - 2] = 1;
triangles[segments * 3 - 1] = segments;
Mesh mesh = GetComponent<MeshFilter>().mesh;
mesh.Clear();
mesh.vertices = vertices;
mesh.triangles = triangles;
}
转自:https://blog.csdn.net/nanggong/article/details/54311090