1

我正在使用 MeshLab 平滑通过 marching_cubes 和 pymesh 从 3d numpy 数组获得的网格。我正在处理一些类似的网格,其中只有一个给我这个问题。使用的滤波器是带有参数的拉普拉斯平滑滤波器:

  • 平滑步骤 = 1
  • 一维边界平滑 = True
  • 余切加权 = True

附上拉普拉斯平滑前后的网格图像。不幸的是,由于隐私问题,必须在感兴趣的区域裁剪图像。
追踪问题的任何帮助或任何调试建议都会非常有帮助。
谢谢!

第一区域拉普拉斯平滑之前的网格

第一个尖峰

第二区域拉普拉斯平滑之前的网格

第二个尖峰

4

1 回答 1

0

你能提供一个网格样本吗?由于 MarchingCubes 可能导致退化的零面积三角形,这可能是一个数值问题。原因是拉普拉斯平滑试图沿着曲面的切平面移动顶点,导致零面积三角形未定义。最终,您还可以尝试通过运行合并关闭顶点过滤器来删除那些退化的三角形。这个问题也可能出现,因为桌面 meshlab 在 float 上运行,而它的 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()
于 2021-04-06T15:44:43.993 回答