将一个网格通过编程转换为另一个网格

3
我需要一种方法来将我的网格通过添加或减少三角形和顶点并改变它们的位置转换成另一个网格。
我的目标是在Unity中平滑地将我的"Monster"(这是一个单独的网格)转换成人类(也是一个单独的网格)。有点像你可以在这个项目这里找到的 "Crumple Mesh Modifier"。
不好意思我的英语不太好,我不是母语为英语的人,提前谢谢您。
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() 限制为每隔一帧或每300ms执行一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接