以编程方式将网格“转换”为另一个网格

时间:2013-01-21 02:40:16

标签: c# unity3d mesh

我需要一些方法通过添加或减去三角形和顶点并改变它们的位置来将我的网格转换为另一种网格。

我的目标是在Unity内部将我的“怪物”(即单个网格)转换为人类(也就是单个网格)。 您可以在此项目中找到类似“Crumple Mesh Modifier”的内容here

抱歉我的英语,我不是英语探员,并提前致谢。

1 个答案:

答案 0 :(得分:2)

动态创建网格:

MeshFilter meshFilter = GetComponent();
Mesh mesh = meshFilter.sharedMesh;

if (mesh == null){
    meshFilter.mesh = new Mesh();
    mesh = meshFilter.sharedMesh;
}

Vector3 p0 = new Vector3(0,0,0);
Vector3 p1 = new Vector3(1,0,0);
Vector3 p2 = new Vector3(0,1,0);
Vector3 p3 = new Vector3(0,0,1);

// clear mesh of current data
mesh.Clear();

// set vertices
mesh.vertices = new Vector3[]{p0,p1,p2,p3};

// set 
mesh.triangles = new int[]{
    0,1,2,
    0,2,3,
    2,1,3,
    0,3,1
};
mesh.RecalculateNormals();
mesh.RecalculateBounds();
mesh.Optimize();

修改现有顶点(对于面孔的工作方式类似):

// mesh.vertices returns a copy
Vector3[] vert_copy = mesh.vertices;
vert_copy[0] = new Vector3(10,11,12);
vert_copy[1] = new Vector3(13,14,15);

// reassign new vertices to mesh
mesh.vertices = vert_copy;

mesh.RecalculateNormals();
mesh.RecalculateBounds();
mesh.Optimize();

重新计算法线和边界时,这些调用会变得很昂贵。如果您的网格在“转换”时不会与其他网格进行物理交互,则可以推迟 RecalculateBounds(),直到“转换”完成。同样,如果您预计网格只进行少量的每帧转换,则可以将 RecalculateNormals()限制为每隔一帧或每300毫秒。