完成部分网格并使其防水
Posted
技术标签:
【中文标题】完成部分网格并使其防水【英文标题】:Complete a partial mesh and make it watetight 【发布时间】:2021-03-11 22:10:25 【问题描述】:我正在从 RealSense 相机捕获点云,并使用 Trimesh 库将它们转换为网格。问题是我只能从中得到一个非防水网格。如何“完成”网格并使其防水?
我试过了
trimesh.repair.broken_faces(mesh, color=[255, 0, 0, 255])
但这似乎并没有完全帮助。我尝试创建一个凸包:
并试图在两者之间进行联合,但结果是:
ipdb> mesh.union(ch,engine='scad')
*** subprocess.CalledProcessError: Command '['/usr/bin/openscad', '/tmp/tmpqrdvbdd2', '-o', '/tmp/tmpvdzjmkgm.off']' returned non-zero exit status 1
ipdb> mesh.union(ch,engine='blender')
*** subprocess.CalledProcessError: Command '['/usr/bin/blender', '--background', '--python', '/tmp/tmp9_5phhhj']' returned non-zero exit status 127
而且我也会丢失源网格中的 RGB 信息。如何使用凸包完成网格,同时保留所有已知的 RGB 值?
编辑:我稍微移动了一点。我查看了凸包的面法线,并提取了所有指向侧面和向下的法线。我用旧网格顶点和由旧面定义的面+凸包中的新面创建了一个新网格。
这让我更接近我的目标,但现在我有一堆洞,trimesh.repair.fill_holes 和 meshlab 的过滤器都没有给我很好的结果。
【问题讨论】:
【参考方案1】:我会查看pyvista
示例页面,他们有一个很好的pyvista.wrap
函数可以让你从trimesh
到pyvista
,然后你可以使用pv_obj.points
设置顶点和@987654328 @ 回到trimesh
。一些操作会将您从PolyData
带到UnstructedGrid
类,但只要它们是三角形,这些线就可以工作。 Trimesh 速度非常快,他是回答 github 问题的摇滚明星,但 pyvista
的文档要好得多。为了我的项目,我必须经常在两者之间切换。
这是我正在考虑的相关示例:https://docs.pyvista.org/examples/01-filter/resample.html
您的漏洞填充可能会由他们在https://github.com/pyvista/pymeshfix 的侧回购处理,然后再拉回trimesh
。
trimesh
还将 Open3D 列为可选依赖项,它具有更好的点云重建算法,但我使用它的力度还不够,无法将您推向它的资源。
【讨论】:
【参考方案2】:trimesh.PointCloud
类具有“属性”convex_hull
。
引用the trimesh docs:
返回convex_hull - 点外壳的防水网格
这是你想要的吗?
【讨论】:
我确实尝试过(见我的帖子)。问题是我希望将来自源网格所有点的所有颜色信息转移到凸包网格。当我尝试使用源点和外壳面创建凸包时,我没有成功。 @trycatch22:好吧,在你的帖子中,听起来你尝试了一些外部的 trimesh 来进行后期处理。不用担心。以上是关于完成部分网格并使其防水的主要内容,如果未能解决你的问题,请参考以下文章