Python module to read and write .binvox files.
Small Python module to read and write
.binvoxfiles. The voxel data is represented as dense 3-dimensional Numpy arrays in Python (a direct if somewhat wasteful representation for sparse models) or as an array of 3D coordinates (more memory-efficient for large and sparse models).
Binvox is a neat little program to convert 3D models into binary voxel format. The
.binvoxfile format is a simple run length encoding format described here.
Suppose you have a voxelized chair model,
chair.binvox(you can try it on the one in the repo). Here's how it looks in
viewvox:
Then
>>> import binvox_rw >>> with open('chair.binvox', 'rb') as f: ... model = binvox_rw.read_as_3d_array(f) ... >>> model.dims [32, 32, 32] >>> model.scale 41.133000000000003 >>> model.translate [0.0, 0.0, 0.0] >>> model.data array([[[ True, False, False, ..., False, False, False], [ True, False, False, ..., False, False, False], [ True, False, False, ..., False, False, False], ..., [[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]]], dtype=bool)
You get the idea.
model.datahas the boolean 3D array. You can then manipulate however you wish. For example, here we dilate it with
scipy.ndimageand write the dilated version to disk:
>>> import scipy.ndimage >>> scipy.ndimage.binary_dilation(model.data.copy(), output=model.data) >>> model.write('dilated.binvox')
Then we get a fat chair:
To get the data as an array of coordinates, look at
binvox_rw.read_coords.
This is a really simple, 200-line module. You should just stick into whatever project you're using. Or copy it to
/usr/share/lib/pythonX.Y/site-packagesif you really want a system-wide installation.
Daniel Maturana
[email protected]