Python中.stl文件的填充式体素化实现求助
解决STL网格的填充式体素化问题
你的核心问题是Open3D生成的体素仅包含表面网格,未填充内部空间。以下是两种无需自行实现填充算法的现成方案:
方案一:使用trimesh + scipy
trimesh的体素化工具默认基于射线追踪判断体素是否在模型内部,配合scipy的孔洞填充可确保体素完全实心:
import trimesh import numpy as np from scipy.ndimage import binary_fill_holes # 加载并归一化STL模型 mesh = trimesh.load("../Sample_Model/backpack_hook.stl") scale = 1 / np.max(mesh.bounds[1] - mesh.bounds[0]) mesh.apply_scale(scale) mesh.apply_translation(-mesh.centroid) # 生成实心体素矩阵 voxel_size = 0.05 voxels = mesh.voxelized(voxel_size).matrix # 补全可能的内部空缺 filled_voxels = binary_fill_holes(voxels).astype(np.int8) # 可视化切片 import matplotlib.pyplot as plt plt.imshow(filled_voxels[:, :, 3], interpolation='nearest') plt.show()
方案二:使用pyvista
pyvista的voxelize方法直接支持生成实心体素网格,无需额外处理:
import pyvista as pv import numpy as np # 加载并归一化STL模型 mesh = pv.read("../Sample_Model/backpack_hook.stl") scale = 1 / np.max(mesh.bounds[1::2] - mesh.bounds[::2]) mesh.scale(scale, center=mesh.center) # 生成实心体素网格 voxel_size = 0.05 voxel_grid = mesh.voxelize(voxel_size, check_surface=False) # 转换为二进制numpy数组 filled_voxels = voxel_grid.active_scalars.reshape(voxel_grid.dimensions).T.astype(np.int8) # 可视化切片 import matplotlib.pyplot as plt plt.imshow(filled_voxels[:, :, 3], interpolation='nearest') plt.show()
原代码问题说明
Open3D的VoxelGrid.create_from_triangle_mesh仅标记与三角网格表面相交的体素,不会检测模型内部空间,因此只能得到表面体素,无法满足体积表示需求。
内容的提问来源于stack exchange,提问作者ChopStick
相关产品推荐
相关产品推荐

