网格到填充体素网格

Mesh to filled voxel grid

我正在尝试使用体素。我有一个封闭的网格对象,但在这里我将使用提供的示例网格。我想做的是将网格转换为填充的体素网格。

下面的代码采用一个网格并使用 pyvista 将其转换为体素网格,但是在内部体素网格是空心的。

import numpy as np
import pyvista as pv
from pyvista import examples

# Load a surface to voxelize
surface = examples.download_foot_bones()
surface

voxels = pv.voxelize(surface, density=surface.length / 500)
voxels.plot(opacity=1.00)

有没有办法用细胞填充内部空洞?如果不是,我假设会有一种 numpy 方法来填充数组,然后将其转换为填充的体素网格?

我相信您被体素的表示误导了。由于体素在绘图中紧密排列,因此即使部分不透明也看不到内表面。换句话说,体素化已经很密集了。

我们可以提取体素化网格中每个单元格的中心,并注意到它在网格中很密集:

voxels.cell_centers().plot(render_points_as_spheres=True)

(您可能必须手动激活网格上的标量才能获得颜色图)。

放大时会产生类似这样的效果:

如果体素网格是空心的,我们只能看到网格表面的球体。相反,我们用密集的点填满了整个 space.


要获得更具体的证明,请考虑体素化四面体:

import pyvista as pv

tetra = pv.voxelize(pv.Tetrahedron(), density=0.1)
tetra.plot(scalars='vtkOriginalCellIds')

现在,如果我们 运行 this (slow and undocumented) internal helper called atomize 在它上面,它会缩小每个体素,让我们可以窥视它们:

from pyvista.demos.logo import atomize  # undocumented, don't rely on it

atomized = atomize(tetra, scale=0.5)
atomized.plot()

特别是在 3d 中四处移动网格可以清楚地看到所有内部体素都在那里,它们只是被最外面的体素遮挡了。