完成部分网格并使其防水

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 函数可以让你从trimeshpyvista,然后你可以使用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 来进行后期处理。不用担心。

以上是关于完成部分网格并使其防水的主要内容,如果未能解决你的问题,请参考以下文章

如何在 <li> 网格上调整图像和文本的大小并使其居中?

如何使用引导网格映射图像数组?

绑定网格的行数

Java - 跟踪抽象形状的轮廓并使外部像素透明

将 Aria-labels 添加到 Angular 分页网格以使其更易于访问

在Unity中为部分网格创建变换?