转自:https://blog.csdn.net/nanggong/article/details/54728823
我这里是有写法线的,这位博主没写也能显示出来,很奇怪?我没写法线,就会全黑。。。
正方形/三角形贴图
void DrawTriangle()
{
this.GetComponent<MeshRenderer>().material = mat;
Mesh mesh = GetComponent<MeshFilter>().mesh;
mesh.Clear();
//设置顶点
mesh.vertices = new Vector3[] { new Vector3(10,10, 0), new Vector3(10, 20, 0), new Vector3(20, 20, 0),new Vector3(20,10,0) };
//设置三角形顶点顺序,顺时针设置
mesh.triangles = new int[] {
0, 1, 2,
0 ,2, 3
};
mesh.uv = new Vector2[] { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0) };
Vector3[] normals= new Vector3[4];
normals[0] = -Vector3.forward;
normals[1] = -Vector3.forward;
normals[2] = -Vector3.forward;
normals[3] = -Vector3.forward;
mesh.normals = normals;
}
效果图:
圆的贴图
解释:我们要将整个圆覆盖在贴图上,这里以我们的圆中心点在原点为例,我们先将圆单位化,也就是所有点坐标除以半径,得到半径为1的单位圆,而覆盖在贴图上的圆,半径为0.5,所以我们再除以2,最后将原点移至(0.5,0.5)即可。
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;
Vector2[] uvs = new Vector2[vertices.Length];
for(int i=0;i<vertices.Length;i++)
{
uvs[i] = new Vector2(vertices[i].x / radius / 2 + 0.5f, vertices[i].y / radius / 2 + 0.5f);
}
int k = 0;
//法线要与顶点数组大小一致,否则越界
Vector3[] normals = new Vector3[vertices.Length];
for (int i = 0; i < vertices.Length; i++)
{
normals[k] = -Vector3.forward;
k++;
}
Mesh mesh = GetComponent<MeshFilter>().mesh;
mesh.Clear();
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.uv = uvs;
mesh.normals = normals;
}
效果图:
自己的小疑问?同一个脚本中生成多个图形?