3

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

我的目标是在 Unity 中将我的“怪物”(即单个网格)平滑地转换为人类(也就是单个网格)。看起来像“Crumple Mesh Modifier”的东西,你可以在这个项目中找到这里

对不起我的英语,我不是英语演讲者,在此先感谢。

4

1 回答 1

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 毫秒。

于 2013-01-21T04:40:33.300 回答