You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:33:19