三角形と頂点を追加または削除し、それらの位置を変更して、メッシュを別のメッシュに変換する方法が必要です。
私の目標は、Unity 内でスムーズに「モンスター」(単一メッシュ) を人間 (これも単一メッシュ) に変換することです。このプロジェクトで見つけることができる「Crumple Mesh Modifier」のようなものはこちら
私の英語について申し訳ありません。私は英語を話す人ではありません。事前に感謝します。
メッシュの動的作成:
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()を 1 フレームおきまたは 300 ミリ秒ごとに制限できます。