A Python C++ extension based on VoxSurf for voxelization of 3D meshes.
Project description
PyVoxSurf
A Python C++ extension based on VoxSurf for voxelization of 3D meshes.
Principle
- Rasterize triangles using three 2D axis aligned grids, using integer arithmetic (fixed floating point) for robust triangle interior checks
- [Optional] Fill interior of voxelized surface with either of two schemes: Inside - fastest method evaluates whether a voxel is inside from only one direction or Robust - evaluates whether a voxel is inside from all three directions and a voting determines final status
Usage
pyvoxsurf.voxelize_stl
Argument | Type | Default | Description |
---|---|---|---|
filename |
string | Filename of .stl file | |
resolution |
integer | Number of voxel slices in the z-axis | |
bounds |
[2x3] array | [Optional] Min and max bounds in (x, y, z) coordinates of desired voxel volume | |
voxel_fill |
string | "None" | [Optional] "None", "Inside", or "Robust" type of filling |
import pyvoxsurf
from mayavi import mlab
volume1 = pyvoxsurf.voxelize_stl("model.stl",200,[],"Robust")
print(volume1.shape)
# Visualize voxelized model
from tvtk.util.ctf import PiecewiseFunction
mlab.figure(size=(800,800))
vol = mlab.pipeline.volume(mlab.pipeline.scalar_field(volume1))
mlab.title('Voxelized model',height=0.9,size=0.5)
mlab.orientation_axes()
otf = PiecewiseFunction()
otf.add_point(0,0)
otf.add_point(0.001, 1)
otf.add_point(1,1)
vol._otf = otf
vol._volume_property.set_scalar_opacity(otf)
mlab.show()
pyvoxsurf.voxelize
Argument | Type | Default | Description |
---|---|---|---|
vertices |
[nx3] array | Vertex positions in (x, y, z) coordinates | |
triangle_indices |
[nx3] array | Indices of connected vertices forming triangles of mesh | |
bounds |
[2x3] array | Min and max bounds in (x, y, z) coordinates of desired voxel volume | |
resolution |
integer | Number of voxel slices in the z-axis | |
voxel_fill |
string | "None" | [Optional] "None", "Inside", or "Robust" type of filling |
import pyvoxsurf
import trimesh
import numpy as np
from mayavi import mlab
mesh = trimesh.load("model.stl") # Load stl file
# Find the max and min coordinates of the mesh to form a bounding box
mesh_min_corner = [np.min(mesh.vertices[:,0]), np.min(mesh.vertices[:,1]), np.min(mesh.vertices[:,2])]
mesh_max_corner = [np.max(mesh.vertices[:,0]), np.max(mesh.vertices[:,1]), np.max(mesh.vertices[:,2])]
bounds = np.stack((mesh_min_corner,mesh_max_corner))
volume2 = pyvoxsurf.voxelize(mesh.vertices,mesh.faces,bounds,100,"Inside")
print(volume2.shape)
# Visualize voxelized model
from tvtk.util.ctf import PiecewiseFunction
mlab.figure(size=(800,800))
vol = mlab.pipeline.volume(mlab.pipeline.scalar_field(volume2))
mlab.title('Voxelized model',height=0.9,size=0.5)
mlab.orientation_axes()
otf = PiecewiseFunction()
otf.add_point(0,0)
otf.add_point(0.001, 1)
otf.add_point(1,1)
vol._otf = otf
vol._volume_property.set_scalar_opacity(otf)
mlab.show()
Credits
- VoxSurf by sylefeb
- VoxSurf Pybind11 bindings by mjgalindo
- PyVoxSurf packaging and documentation by jttoombs
- STL model of 3D knot by chylld
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
pyvoxsurf-1.0.3.tar.gz
(3.5 kB
view hashes)
Built Distribution
Close
Hashes for pyvoxsurf-1.0.3-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 72a5786edc446e85ecc9e962143fcde8dd3a0df9a5bc39d695cd7e3bf90e775e |
|
MD5 | 6b67cff71d65aa1895152237260e2fe3 |
|
BLAKE2b-256 | 6c5ed18e6ddc55ff56fa21a84640c87c9d1efaf4524fb40fb63366dccda06edd |