如何用代码变换网格

我需要通过一些方式把网格变换到另一个里,通过添加或者减去三角形或者顶点,并改变它们的位置。
我的目标是顺利的把我的"Monster"(一个单个的网格)变换到一个人(也是一个单个的网格)。有点像"Crumple Mesh Modifier",点击here可以看到。

原问题:“Tranform” a mesh into another programaticaly

阅读 3.6k
1 个回答

答案:erdak
动态创建一个网格:

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()直到转变结束。相似的,如果你预计只有很小的每帧的转变,可以以每隔一帧或者每300毫秒限制ecalculateNormals()。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进