一、什么是Mesh
Unity是基于mesh去做渲染的,也就是说你想在Unity里看见东西的话,就必须要使用mesh。
从概念上讲,mesh是图形硬件用来绘制复杂事物的的框架。它至少包含一个顶点集合(这些顶点是三维空间中的一些坐标,)以及连接这些点的一组三角形(最基本的2D形状)。构成这些三角形的点和边的集合就是Mesh。
在Unity Game视图当中 你肉眼所见的东西都是通过一个三角面 组成各种各样的模型 Mesh就是存放这些数据,并且渲染 显示在场景当中。
如果你想用一个GameObject展示一个3D的模型,那么它必须要两个components才可以。第一个是Mesh Filter 网格过滤器,它决定了你想展示那个mesh;第二个是Mesh Renderer 网格渲染器,它决定了你应该如何渲染mesh,比如使用什么材质球,是否接受阴影或者投影等等。
二、Mesh的属性
网格的正面、反面是因为渲染顺序的不同所形成的(渲染顺序指顺时针、逆时针渲染)
Mesh{
vertices 顶点坐标数组
triangles 绘制顺序
{mesh.triangles = new int[]{0,1,2,2,1,0} //必须是3的倍数}
Normal 法线 {告诉你光怎么反射的}
UV 坐标
{坐标 二维坐标
显示贴图的坐标
0-1的值
和顶点相同数量
//给mesh网格添加uv坐标}
三、如何绘制网格
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MeshTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Mesh mesh = new Mesh();
#region Cube
//给mesh网格添加顶点
List<Vector3> vectors = new List<Vector3>();
//vectors.Add(Vector3.zero);
//vectors.Add(Vector3.up);
//vectors.Add(Vector3.right);
vectors.Add(new Vector3(0, 3, 0));
vectors.Add(new Vector3(0, 3, 3));
vectors.Add(new Vector3(3, 3, 3));
vectors.Add(new Vector3(3, 3, 0));
vectors.Add(new Vector3(0, 0, 0));
vectors.Add(new Vector3(0, 0, 3));
vectors.Add(new Vector3(3, 0, 3));
vectors.Add(new Vector3(3, 0, 0));
mesh.vertices = vectors.ToArray();
//给mesh网格添加绘制顺序
mesh.triangles = new int[] {
4,3,0,
3,4,7,
7,2,3,
7,6,2,
6,1,2,
6,5,1,
5,0,1,
5,4,0,
0,2,1,
0,3,2,
5,7,4,
7,5,6
}; 必须是3的倍数
//重新计算法线
mesh.RecalculateNormals();
//给mesh网格添加uv坐标
List<Vector2> uv = new List<Vector2>();
uv.Add(new Vector2(0.1f, 0.3f));
uv.Add(new Vector2(0.9f, 0.3f));
uv.Add(new Vector2(0.9f, 0.9f));
uv.Add(new Vector2(0.1f, 0.9f));
uv.Add(new Vector2(0, 0));
uv.Add(new Vector2(1, 0));
uv.Add(new Vector2(1, 1));
uv.Add(new Vector2(0, 1));
mesh.uv = uv.ToArray();
#endregion
}
}
四、画球
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MeshTest : MonoBehaviour
{
public int n = 4;
public float r = 5;
// Start is called before the first frame update
void Start()
{
Mesh mesh = new Mesh();
//每份的弧度
float ang = 2 * Mathf.PI / n;
List<Vector3> vertices = new List<Vector3>();
vertices.Add(Vector3.zero);//圆心
List<int> triangles = new List<int>();
for (int i = 0; i < n / 2 + 1; i++)
{
float xr = Mathf.Sin(i * ang) * r;
float y = Mathf.Cos(i * ang) * r;
for (int j = 0; j < n; j++)
{
float x = Mathf.Sin(j * ang) * xr;
float z = Mathf.Cos(j * ang) * xr;
vertices.Add(new Vector3(x, y, z));
if (j == n - 1)
{
float x0 = Mathf.Sin(0) * xr;
float z0 = Mathf.Cos(0) * xr;
vertices.Add(new Vector3(x0, y, z0));
}
if (i < n/2 && j < n)
{
triangles.Add(i * (n + 1) + j);
triangles.Add(i * (n + 1) + j + 1);
triangles.Add(( i + 1) * (n + 1) + j);
triangles.Add(( i + 1) * (n + 1) + j);
triangles.Add(i * (n + 1) + j + 1);
triangles.Add((i + 1) * (n + 1) + j + 1);
}
}
}
mesh.vertices = vertices.ToArray();//给mesh网格添加顶点
mesh.triangles = triangles.ToArray();//给mesh网格添加绘制顺序
GetComponent<MeshFilter>().mesh = mesh;
GetComponent<MeshCollider>().sharedMesh = mesh;
}
}