unity3D通过MeshFilter实现动态生成模型(二)凸多边形
上一章实现了简单的三角形的创建,这章实现稍微复杂的凸多边形,并且设置顶点的法线和uv。
首先,明确几个关键点:
1.多变形的顶点按顺时针或逆时针顺序存放在顶点数组中(为了方便划分三角形),我用的是顺时针顺序。
2.将多边形划分成若干个三角形,三角形数量为:(verNum - 2) * 3(verNum为多边形顶点数)。顺时针顶点的多边形,如下图,三角形的划分有如下规则:
startIndex = 0;
endIndex = verNum - 1;
第奇数个三角形顶点索引:{startIndex, startIndex + 1, endIndex}
startIndex++;
第偶数个三角形顶点索引:{startIndex, endIndex - 1, endIndex}
endIndex--;
3.设置UV值的意义是指定多边形顶点与贴图的对应关系。贴图四个点的坐标为:(0,0),(1,0),(0,1),(1,1),如下图,将多边形顶点的uv设置成0到1之间的任意值即可截取贴图相应的部分显示。如果贴图的循环模式为Repeat,
uv可以设置成任意值,超出(0,1)范围的自动循环填充。

完整代码:
Vector3[] verArr;//按顺时针顺序的顶点数组,
GameObject obj = new GameObject("plane"); MeshFilter mFilter = obj.AddComponent<MeshFilter>(); MeshRenderer mRen = obj.AddComponent<MeshRenderer>(); int verNum = verArr.Length;// int triangleNum = verNum - 2;int[] triangles = new int[triangleNum * 3]; int currentCount = 0; int startIndex = 0; int lastIndex = verNum - 1; for (int i = 1; i <= triangleNum; i++) { if (i % 2 == 1) { triangles[currentCount++] = startIndex++; triangles[currentCount++] = startIndex; triangles[currentCount++] = lastIndex; } else { triangles[currentCount++] = startIndex; triangles[currentCount++] = lastIndex - 1; triangles[currentCount++] = lastIndex--; } } // Vector2[] uvs = new Vector2[AllVerList.Count]; for (int i = 0; i < AllVerList.Count; i++) {
//直接用顶点的坐标值截取贴图 uvs[i] = new Vector2(verList[i].x, verList[i].y); } mFilter.mesh.vertices = verNum; mFilter.mesh.triangles = triangles; mFilter.mesh.RecalculateNormals(); //根据顶点和三角形计算网格的法线 mFilter.mesh.uv = uvs;
这样就可以创建任意顶点的多边形了,当然只能是凸多边形,下面贴张效果图:

浙公网安备 33010602011771号