Unity3d生成Mesh

来源:互联网 发布:js设置延迟时间 编辑:程序博客网 时间:2024/06/05 23:02

因为项目需要导入已知点,根据已知点生成一个类似于圆胎的Mesh,所以想了下Mesh生成物体的代码逻辑。
这里写图片描述
假设现在有9个Vertice(Vector3),横向HorizontalNumber=3,纵向Horizontal=3,那么按照三角形生成原理,有索引145,152,256,263,478,485,589,596。总共24个int类型的索引Triangles(int),点的数量和索引数量之间的关系是triangles=(horizontalNumber-1)*(horizontal-1)*6。可以得到这样的代码,很神奇的算法,过了一段时间自己都忘了他是怎么来的。

for (int i = 0; i < (horizontalNumber - 1) * (horizontal - 1); i++)            {                trialges.Add(i + i / (horizontalNumber - 1));                trialges.Add(i + horizontalNumber + i / (horizontalNumber - 1));                trialges.Add(i + horizontalNumber + 1 + i / (horizontalNumber - 1));                trialges.Add(i + i / (horizontalNumber - 1));                trialges.Add(i + horizontalNumber + 1 + i / (horizontalNumber - 1));                trialges.Add(i + 1 + i / (horizontalNumber - 1));            }


然后,因为点过多,需要多个Mesh之间相互连接,需要共享一组横坐标相同的数据,allTireList.RemoveRange(0, oneMeshVertices - horizontalNumber);这一句保留了那一段点的数据。

 for (int oneMeshVertices = horizontalNumber * horizontal, ts = (horizontalNumber - 1) * (horizontal - 1) * 6; i < meshCount - 1; i++)            {                Mesh mesh = tireGameObject[i].GetComponent<MeshFilter>().mesh;                mesh.Clear();                mesh.SetVertices(tireVector3[i]);                mesh.SetTriangles(trianglesList[i], 0);                tireVector3[i] = new List<Vector3>();                tireVector3[i] = allTireList.Skip(0).Take(oneMeshVertices).ToList();                allTireList.RemoveRange(0, oneMeshVertices - horizontalNumber);                trianglesList[i] = trialges.Skip(0).Take(ts).ToList();            }


到最后因为还要首尾连接,所以要先读取第一行的数据。`

  List<Vector3> firstCell = allTireList.Skip(0).Take(horizontalNumber).ToList();   int index = tireVector3.Length - 1;   tireVector3[index] = new List<Vector3>();   tireVector3[index] = allTireList.Skip(0).Take(allTireList.Count).ToList();   for (i = 0; i < horizontalNumber; i++)   {       tireVector3[index].Add(firstCell[i]);   }   trianglesList[index] = new List<int>();    int remainderVertices = (horizontalNumber - 1) * allTireList.Count / horizontalNumber;   for (i = 0; i < remainderVertices; i++)   {       trianglesList[index].Add(i + i / (horizontalNumber - 1));       trianglesList[index].Add(i + horizontalNumber + i / (horizontalNumber - 1));       trianglesList[index].Add(i + horizontalNumber + 1 + i / (horizontalNumber - 1));       trianglesList[index].Add(i + i / (horizontalNumber - 1));       trianglesList[index].Add(i + horizontalNumber + 1 + i / (horizontalNumber - 1));       trianglesList[index].Add(i + 1 + i / (horizontalNumber - 1));    }

最后的效果图是这样的
这里写图片描述

这里写图片描述

原创粉丝点击