【问题标题】:"Transform" a mesh into another programmatically以编程方式将网格“转换”为另一个网格
【发布时间】:2016-07-26 14:39:04
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# unity3d mesh


    【解决方案1】:

    动态创建网格:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多