【发布时间】:2018-11-30 01:50:14
【问题描述】:
我有一些代码可以创建一个圆形网格,它需要一个半径、多个边(一个圆选择为 100 左右)和一个轮廓宽度。它初始化网格如下:
MeshFilter mf = GetComponent<MeshFilter>();
Mesh mesh = new Mesh();
mf.mesh = mesh;
mesh.subMeshCount = 2;
它用一些不完全自我解释的数学来分配顶点,但我想相信它会将顶点分配为具有 n 边的正多边形,然后再分配一个轮廓:
//vertices
List<Vector3> verticesList = new List<Vector3> { };
float x;
float y;
for (int i = 0; i < n; i++)
{
x = radius * Mathf.Sin((2 * Mathf.PI * i) / n);
y = radius * Mathf.Cos((2 * Mathf.PI * i) / n);
verticesList.Add(new Vector3(x, y, 0f));
}
for (int i = 0; i < n; i++)
{
x = (radius + OLwidth) * Mathf.Sin((2 * Mathf.PI * i) / n);
y = (radius + OLwidth) * Mathf.Cos((2 * Mathf.PI * i) / n);
verticesList.Add(new Vector3(x, y, 0f));
}
Vector3[] vertices = verticesList.ToArray();
然后有两个三角形列表,mesh.SetTriangles() 稍后用这两个三角形数组制作两个子网格:
//triangles
List<int> trianglesList = new List<int> { };
List<int> OLtrianglesList = new List<int> { };
for (int i = 0; i < (n - 2); i++)
{
trianglesList.Add(0);
trianglesList.Add(i + 1);
trianglesList.Add(i + 2);
}
for (int i = 0; i < (n - 2); i++)
{
trianglesList.Add(n);
trianglesList.Add(i + n + 1);
trianglesList.Add(i + n + 2);
}
int[] triangles = trianglesList.ToArray();
int[] OLtriangles = OLtrianglesList.ToArray();
所有法线都只是-Vector3.forward:
//normals
List<Vector3> normalsList = new List<Vector3> { };
for (int i = 0; i < vertices.Length; i++)
{
normalsList.Add(-Vector3.forward);
}
Vector3[] normals = normalsList.ToArray();
然后我初始化网格如下:
//initialise
mesh.vertices = vertices;
mesh.normals = normals;
mesh.SetTriangles(triangles, 0);
mesh.SetTriangles(OLtriangles, 1);
所以完整的代码如下所示(最后设置了一个 polycollider,但这与此无关):
public void PolyMesh(float radius, int n, float OLwidth)
{
MeshFilter mf = GetComponent<MeshFilter>();
Mesh mesh = new Mesh();
mf.mesh = mesh;
mesh.subMeshCount = 2;
//vertices
List<Vector3> verticesList = new List<Vector3> { };
float x;
float y;
for (int i = 0; i < n; i++)
{
x = radius * Mathf.Sin((2 * Mathf.PI * i) / n);
y = radius * Mathf.Cos((2 * Mathf.PI * i) / n);
verticesList.Add(new Vector3(x, y, 0f));
}
for (int i = 0; i < n; i++)
{
x = (radius + OLwidth) * Mathf.Sin((2 * Mathf.PI * i) / n);
y = (radius + OLwidth) * Mathf.Cos((2 * Mathf.PI * i) / n);
verticesList.Add(new Vector3(x, y, 0f));
}
Vector3[] vertices = verticesList.ToArray();
//triangles
List<int> trianglesList = new List<int> { };
List<int> OLtrianglesList = new List<int> { };
for (int i = 0; i < (n - 2); i++)
{
trianglesList.Add(0);
trianglesList.Add(i + 1);
trianglesList.Add(i + 2);
}
for (int i = 0; i < (n - 2); i++)
{
trianglesList.Add(n);
trianglesList.Add(i + n + 1);
trianglesList.Add(i + n + 2);
}
int[] triangles = trianglesList.ToArray();
int[] OLtriangles = OLtrianglesList.ToArray();
//normals
List<Vector3> normalsList = new List<Vector3> { };
for (int i = 0; i < vertices.Length; i++)
{
normalsList.Add(-Vector3.forward);
}
Vector3[] normals = normalsList.ToArray();
//initialise
mesh.vertices = vertices;
mesh.normals = normals;
mesh.SetTriangles(triangles, 0);
mesh.SetTriangles(OLtriangles, 1);
//polyCollider
polyCollider.pathCount = 1;
List<Vector2> pathList = new List<Vector2> { };
for (int i = 0; i < n; i++)
{
pathList.Add(new Vector2(vertices[i + n].x, vertices[i + n].y));
}
Vector2[] path = pathList.ToArray();
polyCollider.SetPath(0, path);
}
据我所知,这应该设置两个网格,一个比另一个稍大。这可行,但是尽管为网格渲染器分配了两种不同的材质,它们始终显示为相同的颜色。
这是网格在游戏中的显示方式:
这表明显然有两个网格:
我的Mesh Renderer如下:
这些是正在使用的材料:
我尝试在渲染器中简单地交换材质,但这只会使对象成为与其他材质的单一材质。
经过进一步的实验,我想澄清这不是由 Z-fighting 引起的,我通过更改轮廓的 z 坐标进行了实验,并实时更改了材质,无论我做什么,它们都具有相同的材质出于某种原因。
【问题讨论】: