如何从网格中删除面及其顶点列表

How to remove list of faces and it's vertices from a mesh

本文关键字:顶点 列表 删除 网格      更新时间:2023-10-16

我正在尝试从网格中删除面列表及其各自的顶点(如果它们不再被引用(,但到目前为止,我只能成功删除面列表。这个想法是,对于删除的每个索引,所有大于删除的索引的索引都应减少 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
}

我最后想出的解决方案:

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...
}