问题描述
我正在使用 MeshLab 平滑通过 marching_cubes 和 pymesh 从 3d numpy 数组获得的网格。我正在处理一些类似的网格,其中只有一个给我带来了这个问题。使用的过滤器是带参数的拉普拉斯平滑:
- 平滑步骤 = 1
- 一维边界平滑 = True
- 余切权重 = True
附上拉普拉斯平滑前后的网格图像。不幸的是,由于隐私问题,必须在感兴趣的区域裁剪图像。
任何跟踪问题的帮助或任何调试建议都会非常有帮助。
谢谢!
mesh before laplacian smooth in first region
mesh before laplacian smooth in second region
解决方法
你能提供一个网格样本吗? 由于 MarchingCubes 可能导致退化的零面积三角形,这可能是一个数值问题。原因是拉普拉斯平滑尝试沿曲面的切平面移动顶点,这导致零面积三角形未定义。最后,您还可以尝试通过运行 merge close vertices 过滤器来移除那些退化三角形。这个问题也可能出现,因为桌面 meshlab 在浮动上运行,而它的 python 对应 pymeshlab 在 double 上运行。 最终只是直接使用 pymeshlab 尝试从 numpy 数组中创建网格
import numpy as np
import pymeshlab as ml
import k3d
ms = ml.MeshSet()
ms.set_verbosity(True)
ms.apply_filter('implicit_surface',voxelsize=0.050000000001,expr="x*x+y*y+z*z-0.5")
#ms.apply_filter("merge_close_vertices")
ms.apply_filter("laplacian_smooth",stepsmoothnum=1)
ms.apply_filter("compact_vertices")
ms.apply_filter("compact_faces")
plot = k3d.plot()
plot += k3d.mesh(ms.current_mesh().vertex_matrix().astype(np.float32),ms.current_mesh().face_matrix().astype(np.uint32),color=0xf0f0c0)
plot.display()