Search code examples
python3dmeshvoxel3d-modelling

Voxelization of STL-file; writing into np.array


I would like to voxelise a .stl file and write it into an np.array. The resolution of the voxels should be adjustable. Here is my code for this:

component_path = r"C:\Users\User\documents\components\Test_1.stl"
mesh = o3d.io.read_triangle_mesh(component_path)

voxel_grid = o3d.geometry.VoxelGrid.create_from_triangle_mesh(mesh, voxel_size = 3)
ply_path = "voxel.ply"
o3d.io.write_voxel_grid(ply_path, voxel_grid, True,True,True)

pcd = o3d.io.read_point_cloud(ply_path)
list_path = "list.xyz"

o3d.io.write_point_cloud(list_path, pcd)

Then I read the coordinate points from the list, write them into a 3D array and plot them. When plotting, the border is not displayed for certain voxel sizes, as can be seen in the image (although it is present in the original). Is there a solution for this so that it doesn't happen no matter what voxel size?

voxelized picture with missing border

In addition, the voxel size changes the maximum dimension. So the component originally has three times the length as it is shown here. How can this be adjusted? (If I just multiply a factor, the voxels stay small but pull the distances apart).

Is there perhaps a more reasonable way to write a voxelisation of a .stl file and put the centers of voxels into an np.array?


Solution

  • If anyone ever has the same problem and is looking for a solution: This project worked for me: GitHub: stl-to-voxel

    The model is then also filled. If the maximum dimension is known, you can determine the exact voxel size via the resolution.

    Here is some code:

    import stl_reader
    import stltovoxel
    import numpy as np
    import copy
    import os
    import sys
    
    input=r"C:\Users\user\Example.stl"
    output=r"C:\Users\user\Test.xyz"
    resolution = 50 #Resolution, into how many layers the model should be divided
    stltovoxel.doExport(input, output, resolution)
    

    Afterwards, you can read the coordinates from the list, write them into an array and process them further (quite normally).