在 OpenMesh

问题描述

我在 obj 文件中有一个重建场景的 3D 网格,其中包含封闭的孔(缺少几何图形的区域)。我在 MeshLab 中使用了 Close Holes 过滤器来恢复孔区域中的几何形状。

enter image description here

这个网格有 7728 个顶点和 2864 个面。为了使用网格几何体进行操作,我使用 OpenMesh 库。

我关注 OpenMesh Python 绑定的官方 tutorial。 我使用 mesh.vf() 和 mesh.vv() 方法获取每个顶点的相邻顶点和面。令人惊讶的是,我得到 6141 个没有邻居的顶点 - 方法 mesh.vf() 和 mesh.vv() 返回空列表。很奇怪,mesh.faces() 得到了 2864 个面。

此外,我使用以下代码获取网格中所有顶点的列表

unique_vertices = []
all_vertices = []
print('Total number of faces: ',len(mesh.faces()))
for fh in mesh.faces():
    # print('face ',fh.idx())
    for vh in mesh.fv(fh):
        # print('vertex ',vh.idx())
        all_vertices.append(vh)
    # print('')

unique_vertices = list(set(all_vertices))

代码返回 8592 个唯一顶点。

您知道 OpenMesh API 中出现这些奇怪行为的原因是什么吗?

解决方法

8592 是 2864*3。所以你的集合包含每个面的 3 个顶点。我假设引用同一个顶点的不同句柄对象在集合中不被认为是相等的。您是否尝试将 vh.idx() 插入 all_vertices

闭合三角形网格的顶点数大约是面的一半。因此,对于您的网格,可以预期大约 2864/2 = 1432 个顶点。因此,对于总共 7728 个顶点,我们预计有 6296 个孤立顶点。由于您的网格不是封闭的,因此 2864 个三角形需要更多的顶点,这使您只有 6141 个孤立的顶点。