2017-07-26 19 views
-4

我想從網格中刪除面的列表以及它們各自的頂點(如果它們不再被引用),但到目前爲止,我只能成功刪除面部列表。這個想法是,對於每個被刪除的索引,所有大於被刪除索引的索引應該減1。如何從網格中刪除面的列表和它的頂點

網格僅由頂點列表和索引列表(以及可選的列表三角形)。

目前的代碼只刪除三角形做到這一點:

private IMesh DeleteTriangles(IMesh input, IEnumerable<int> indices_to_delete) 
    { 
     var triangles_to_delete = new HashSet<int>(indices_to_delete); 

     _triangles_to_keep = _mesh.Triangles.Where((t, count) => 
      !triangles_to_delete.Contains(t.A) && 
      !triangles_to_delete.Contains(t.B) && 
      !triangles_to_delete.Contains(t.C)).ToList(); 

     // return new mesh 
    } 

回答

0

我想出了最終解決方案:

public IMesh DeleteVertices(IMesh mesh, IImmutableList<int> indices_to_remove) 
    { 
     var indices_to_remove_set = new HashSet<int>(indices_to_remove); 
     var new_vertices = new List<Vector>(); 
     var map = new int[mesh.Vertices.Count]; 

     for (var i = 0; i < mesh.Vertices.Count; i++) 
     { 
      if (indices_to_remove_set.Contains(i)) 
      { 
       map[i] = -1; 
      } 
      else 
      { 
       new_vertices.Add(mesh.Vertices[i]); 
       map[i] = new_vertices.Count - 1; 
      } 
     } 

     var new_triangle_list = from triangle in mesh.Triangles 
           where map[triangle.A] != -1 && 
             map[triangle.B] != -1 && 
             map[triangle.C] != -1 
           select new IndexTriangle(
            map[triangle.A], 
            map[triangle.B], 
            map[triangle.C]); 

     //build new mesh... 
    } 
相關問題