Skip to content

A simple, easily hackable C++ surface voxelizer (STL=>voxels)

License

Notifications You must be signed in to change notification settings

cakepirate/VoxSurf

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

50 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PyVoxSurf

A Python C++ extension based on VoxSurf for voxelization of 3D meshes.

NOTE: PyPi distribution is only compatible with Microsoft Windows

Principle

  1. Rasterize triangles using three 2D axis aligned grids, using integer arithmetic (fixed floating point) for robust triangle interior checks
  2. [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()

volume1

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()

volume2

Credits

About

A simple, easily hackable C++ surface voxelizer (STL=>voxels)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 88.7%
  • Python 7.9%
  • CMake 2.5%
  • C 0.5%
  • Jupyter Notebook 0.2%
  • Batchfile 0.1%
  • Other 0.1%