网格的绘制
Unity中想要可视化一个3D模型,就需要Mesh网格,而绘制一个网格,需要必备Mesh Filter(网格过滤器)和 Mesh Renderer(网格渲染器)
Mesh Filter 可以根据MeshFilter获得模型网格的组件,也可以为MeshFilter设置Mesh内容。
可以根据MeshFilter获得模型网格的组件,也可以为MeshFilter设置Mesh内容。
Mesh Renderer 是用于把网格渲染出来的组件
绘制正方体网格
绘制一个8个顶点网格的正方体代码如下
private void Start()
{
Mesh mesh = new Mesh();
List<Vector3> vertices = new List<Vector3>();
vertices.Add(new Vector3(0, 1, 0));
vertices.Add(new Vector3(0, 1, 1));
vertices.Add(new Vector3(1, 1, 1));
vertices.Add(new Vector3(1, 1, 0));
vertices.Add(new Vector3(0, 0, 0));
vertices.Add(new Vector3(0, 0, 1));
vertices.Add(new Vector3(1, 0, 1));
vertices.Add(new Vector3(1, 0, 0));
mesh.vertices = vertices.ToArray();
mesh.triangles = new int[] {
0,1,2,
2,3,0,
4,0,3,
3,7,4,
4,5,1,
1,0,4,
3,2,6,
6,7,3,
2,1,5,
5,6,2,
6,5,4,
4,7,6
};
mesh.RecalculateNormals();
transform.GetComponent<MeshFilter>().mesh = mesh;
transform.AddComponent<MeshCollider>();
GetComponent<MeshCollider>().convex = true;
}
以此类推绘制一个24个顶点网格的正方体代码如下
Mesh mesh = new Mesh();
//利用顶点帮助类添加顶点
VertexHelper vh = new VertexHelper();
//添加顶点 颜色 uv坐标(渲染图片)
vh.AddVert(new Vector3(0, 1, 0), Color.white, new Vector2(0, 0));
vh.AddVert(new Vector3(0, 1, 1), Color.white, new Vector2(0, 1));
vh.AddVert(new Vector3(1, 1, 1), Color.white, new Vector2(1, 1));
vh.AddVert(new Vector3(1, 1, 0), Color.white, new Vector2(1, 0));
vh.AddVert(new Vector3(0, 0, 0), Color.white, new Vector2(0, 0));
vh.AddVert(new Vector3(0, 0, 1), Color.white, new Vector2(0, 1));
vh.AddVert(new Vector3(1, 0, 1), Color.white, new Vector2(1, 1));
vh.AddVert(new Vector3(1, 0, 0), Color.white, new Vector2(1, 0));
vh.AddVert(new Vector3(0, 0, 0), Color.white, new Vector2(0, 0));
vh.AddVert(new Vector3(0, 1, 0), Color.white, new Vector2(0, 1));
vh.AddVert(new Vector3(1, 1, 0), Color.white, new Vector2(1, 1));
vh.AddVert(new Vector3(1, 0, 0), Color.white, new Vector2(1, 0));
vh.AddVert(new Vector3(1, 0, 0), Color.white, new Vector2(0, 0));
vh.AddVert(new Vector3(1, 1, 0), Color.white, new Vector2(0, 1));
vh.AddVert(new Vector3(1, 1, 1), Color.white, new Vector2(1, 1));
vh.AddVert(new Vector3(1, 0, 1), Color.white, new Vector2(1, 0));
vh.AddVert(new Vector3(0, 0, 1), Color.white, new Vector2(0, 0));
vh.AddVert(new Vector3(0, 1, 1), Color.white, new Vector2(0, 1));
vh.AddVert(new Vector3(0, 1, 0), Color.white, new Vector2(1, 1));
vh.AddVert(new Vector3(0, 0, 0), Color.white, new Vector2(1, 0));
vh.AddVert(new Vector3(1, 0, 1), Color.white, new Vector2(0, 0));
vh.AddVert(new Vector3(1, 1, 1), Color.white, new Vector2(0, 1));
vh.AddVert(new Vector3(0, 1, 1), Color.white, new Vector2(1, 1));
vh.AddVert(new Vector3(0, 0, 1), Color.white, new Vector2(1, 0));
vh.FillMesh(mesh);
List<int> triangles = new List<int>();
triangles.Add(0);
triangles.Add(1);
triangles.Add(2);
triangles.Add(2);
triangles.Add(3);
triangles.Add(0);
triangles.Add(6);
triangles.Add(5);
triangles.Add(4);
triangles.Add(4);
triangles.Add(7);
triangles.Add(6);
triangles.Add(8);
triangles.Add(9);
triangles.Add(10);
triangles.Add(10);
triangles.Add(11);
triangles.Add(8);
triangles.Add(12);
triangles.Add(13);
triangles.Add(14);
triangles.Add(14);
triangles.Add(15);
triangles.Add(12);
triangles.Add(16);
triangles.Add(17);
triangles.Add(18);
triangles.Add(18);
triangles.Add(19);
triangles.Add(16);
triangles.Add(20);
triangles.Add(21);
triangles.Add(22);
triangles.Add(22);
triangles.Add(23);
triangles.Add(20);
mesh.triangles = triangles.ToArray();
GetComponent<MeshFilter>().mesh = mesh;
}
绘制网格后渲染图片
绘制一个圆
//每一份的弧度
float angle = 2 * Mathf.PI / n;
Mesh mesh = new Mesh();
VertexHelper vh = new VertexHelper();
//因为最小的复数是-r 所以所有的书都+r就都是正数
vh.AddVert(Vector3.zero, Color.white, new Vector2(0.5f, 0.5f));
for (int i = 0; i < n; i++)
{
//求出x,y坐标
float x = Mathf.Sin(i * angle) * r;
float y = Mathf.Cos(i * angle) * r;
//求出uv坐标
float uvx = (x + r) / (2 * r);
float uvy = (y + r) / (2 * r);
vh.AddVert(new Vector3(x, y, 0), Color.white, new Vector2(uvx, uvy));
if (i == n - 1)
{
vh.AddTriangle(0, i + 1, 1);
}
else
{
vh.AddTriangle(0, i + 1, i + 2);
}
}
vh.FillMesh(mesh);
//mesh.RecalculateNormals();
GetComponent<MeshFilter>().mesh = mesh;
GetComponent<MeshCollider>().sharedMesh = mesh;
GetComponent<MeshRenderer>().material = Resources.Load<Material>("Headicon/Materials/5");
绘制一个Plane
private void Start()
{
Mesh mesh = new Mesh();
VertexHelper vh = new VertexHelper();
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
Vector2 uvPos = new Vector2((i / 10), (j / 10));
vh.AddVert(new Vector3(i, 0, j), Color.white, uvPos);
if (i < 9 && j < 9)
{
vh.AddTriangle(i * 10 + j, i * 10 + j + 1, (i + 1) * 10 + j);
vh.AddTriangle((i + 1) * 10 + j, i * 10 + j + 1, (i + 1) * 10 + (j + 1));
}
}
}
}