Voxelize a Surface Mesh
Create a voxel model (like legos) of a closed surface or volumetric mesh.
This example also demonstrates how to compute an implicit distance from a
bounding pyvista.PolyData
surface.
from __future__ import annotations
import numpy as np
import pyvista as pv
from pyvista import examples
# Load a surface to voxelize
surface = examples . download_foot_bones ()
surface
Copy to clipboard
PolyData Information
N Cells 4204
N Points 2154
N Strips 0
X Bounds -5.633e+00, 5.633e+00
Y Bounds -1.860e+00, 1.860e+00
Z Bounds -2.125e+00, 2.126e+00
N Arrays 0
cpos = [
( 7.656346967151718 , - 9.802071079151158 , - 11.021236183314311 ),
( 0.2224512272564101 , - 0.4594554282112895 , 0.5549738359311297 ),
( - 0.6279216753504941 , - 0.7513057097368635 , 0.20311105371647392 ),
]
surface . plot ( cpos = cpos , opacity = 0.75 )
Copy to clipboard
Create a voxel model of the bounding surface
voxels = pv . voxelize ( surface , density = surface . length / 200 )
p = pv . Plotter ()
p . add_mesh ( voxels , color = True , show_edges = True , opacity = 0.5 )
p . add_mesh ( surface , color = 'lightblue' , opacity = 0.5 )
p . show ( cpos = cpos )
Copy to clipboard
We could even add a scalar field to that new voxel model in case we
wanted to create grids for modelling. In this case, let’s add a scalar field
for bone density noting:
voxels [ 'density' ] = np . full ( voxels . n_cells , 3.65 ) # g/cc
voxels
Copy to clipboard
Header Data Arrays
UnstructuredGrid Information
N Cells 92974
N Points 113125
X Bounds -5.633e+00, 5.584e+00
Y Bounds -1.860e+00, 1.858e+00
Z Bounds -2.125e+00, 2.097e+00
N Arrays 3
Name Field Type N Comp Min Max
vtkOriginalPointIds Points int64 1 4.002e+03 7.213e+05
vtkOriginalCellIds Cells int64 1 3.980e+03 6.947e+05
density Cells float64 1 3.650e+00 3.650e+00
voxels . plot ( scalars = 'density' , cpos = cpos )
Copy to clipboard
A constant scalar field is kind of boring, so let’s get a little fancier by
added a scalar field that varies by the distance from the bounding surface.
voxels . compute_implicit_distance ( surface , inplace = True )
voxels
Copy to clipboard
Header Data Arrays
UnstructuredGrid Information
N Cells 92974
N Points 113125
X Bounds -5.633e+00, 5.584e+00
Y Bounds -1.860e+00, 1.858e+00
Z Bounds -2.125e+00, 2.097e+00
N Arrays 4
Name Field Type N Comp Min Max
vtkOriginalPointIds Points int64 1 4.002e+03 7.213e+05
implicit_distance Points float64 1 -6.951e-01 4.148e-01
vtkOriginalCellIds Cells int64 1 3.980e+03 6.947e+05
density Cells float64 1 3.650e+00 3.650e+00
contours = voxels . contour ( 6 , scalars = 'implicit_distance' )
p = pv . Plotter ()
p . add_mesh ( voxels , opacity = 0.25 , scalars = 'implicit_distance' )
p . add_mesh ( contours , opacity = 0.5 , scalars = 'implicit_distance' )
p . show ( cpos = cpos )
Copy to clipboard
Tags: filter
Total running time of the script: (0 minutes 10.177 seconds)
Gallery generated by Sphinx-Gallery