python - 网格到填充体素网格

标签 python voxel pyvista

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

下面的代码获取一个网格并使用 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)

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

放大时会产生类似这样的效果: close-up of plotted cell centers, densely occupying the mesh outline

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


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

import pyvista as pv

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

plot of voxelized tetrahedron with tightly packed voxels

现在如果我们运行 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()

plot of voxelized tetrahedron with shrunk cells, internal cells visible

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

关于python - 网格到填充体素网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71877992/

相关文章:

python - 体素化 STL 文件?

java - 是否有用于使用体素引擎进行渲染的 Java 库?

python - 如何挤出不规则多边形?

python - 处理从文件读取的文件名中的反斜杠转义

python - 从 DataFrame 中的每个值中减去

java - vtk java体素渲染

python - 带有 timescaledb 扩展的 postgresql 的 SQLalchemy 设置

使用 IPython 时,python 推特模块在 __init__ 期间看不到 _file_cache 加载

python - 有没有办法将 Pyvista 与 tkinter 集成?