网格到填充体素网格
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 中四处移动网格可以清楚地看到所有内部体素都在那里,它们只是被最外面的体素遮挡了。
我正在尝试使用体素。我有一个封闭的网格对象,但在这里我将使用提供的示例网格。我想做的是将网格转换为填充的体素网格。
下面的代码采用一个网格并使用 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 中四处移动网格可以清楚地看到所有内部体素都在那里,它们只是被最外面的体素遮挡了。