private void UpdateTriangles()//根据倍数重新计算三角面片 { var mesh = GetComponent <SkinnedMeshRenderer>().sharedMesh; var vertices = mesh.vertices; if (triangleMultiNum == 1)//1倍直接把原来存好的三角形给它 { MeshACopyToMeshB(oldMesh, mesh); return; } var verticesList = new List <Vector3>(); var normalsList = new List <Vector3>(); var uvList = new List <Vector2>(); int triangleNum = (int)(oldMesh.triangles.Length * triangleMultiNum); triangleNum += 3 - triangleNum % 3; Debug.Log("triangleNum: " + triangleNum); //var triangles = new int[triangleNum]; var trianglesList = new List <int>(); foreach (var item in oldMesh.vertices) { verticesList.Add(item); } foreach (var item in oldMesh.normals) { normalsList.Add(item); } foreach (var item in oldMesh.uv) { uvList.Add(item); } var sd = new SortedDictionary <Cost, int[]>(new CostComparer()); int id = 0;//新加入sd的cost的id for (int i = 0; i < oldMesh.triangles.Length; i += 3) { int[] outTriangle; int[] triangle = new int[] { oldMesh.triangles[i], oldMesh.triangles[i + 1], oldMesh.triangles[i + 2] }; float len = DivideTriangle(triangle, out outTriangle, verticesList); sd.Add(new Cost(len, ++id), triangle); } while (sd.Count * 3 < triangleNum) { var e = sd.GetEnumerator(); e.MoveNext(); var ec = e.Current; int[] triangle = ec.Value; //取最长边最长的三角形进行划分 sd.Remove(ec.Key); //从sd中删掉该三角形 int[] outTriangle; DivideTriangle(triangle, out outTriangle, verticesList); int tot = verticesList.Count; //新加的点的index verticesList.Add((verticesList[outTriangle[0]] + verticesList[outTriangle[1]]) / 2); //加入最长边中点 var normal = new Vector3(0, 0, 0); var uv = new Vector2(0, 0); foreach (var i in triangle) { if (haveNormals) { normal += normalsList[i]; } if (haveUv) { uv += uvList[i]; } } normal /= triangle.Length; uv /= triangle.Length; if (haveNormals) { normalsList.Add(normal); } if (haveUv) { uvList.Add(uv); } var t1 = new int[] { outTriangle[0], tot, outTriangle[2] }; var t2 = new int[] { outTriangle[1], outTriangle[2], tot }; var len = DivideTriangle(t1, out outTriangle, verticesList); sd.Add(new Cost(len, ++id), t1); len = DivideTriangle(t2, out outTriangle, verticesList); sd.Add(new Cost(len, ++id), t2); } int cc = 0; var enumerator = sd.GetEnumerator(); for (int i = 0; enumerator.MoveNext(); i++) { //Debug.Log("length: "+enumerator.Current.Key.cost); int[] triangle = enumerator.Current.Value; for (int j = 0; j < 3; j++) { //triangles[i * 3 + j] = triangle[j]; trianglesList.Add(triangle[j]); cc++; } } mesh.Clear(); mesh.vertices = verticesList.ToArray(); if (haveNormals) { mesh.normals = normalsList.ToArray(); } if (haveUv) { mesh.uv = uvList.ToArray(); } mesh.triangles = trianglesList.ToArray(); panelStatusController.UpdateTextTriangleNum(); }