Geometry processing for Python — booleans, repair, remeshing, and more
CSG union, intersection, and difference via IGL/CGAL
import pymesh
import numpy as np
box_a = pymesh.generate_box_mesh(
np.array([0, 0, 0]),
np.array([1, 1, 1]))
box_b = pymesh.generate_box_mesh(
np.array([0.5, 0.5, 0.5]),
np.array([1.5, 1.5, 1.5]))
result = pymesh.boolean(
box_a, box_b, "union",
engine="igl")
0.00s — 16 → 20 verts, 24 → 36 faces
Input
Union
import pymesh
import numpy as np
box_a = pymesh.generate_box_mesh(
np.array([0, 0, 0]),
np.array([1, 1, 1]))
box_b = pymesh.generate_box_mesh(
np.array([0.5, 0.5, 0.5]),
np.array([1.5, 1.5, 1.5]))
result = pymesh.boolean(
box_a, box_b, "intersection",
engine="igl")
0.00s — 16 → 8 verts, 24 → 12 faces
Input
Intersection
import pymesh
import numpy as np
box_a = pymesh.generate_box_mesh(
np.array([0, 0, 0]),
np.array([1, 1, 1]))
box_b = pymesh.generate_box_mesh(
np.array([0.5, 0.5, 0.5]),
np.array([1.5, 1.5, 1.5]))
result = pymesh.boolean(
box_a, box_b, "difference",
engine="igl")
0.00s — 16 → 14 verts, 24 → 24 faces
Input
Difference
Remove isolated vertices, duplicated faces, degenerate triangles
import pymesh
# mesh has extra isolated vertices
clean, info = pymesh.remove_isolated_vertices(mesh)
print(f"Removed {info['num_vertex_removed']} vertices")
0.00s — 10 → 8 verts, 12 → 12 faces
Input
Cleaned
import pymesh
# mesh has duplicated faces
clean, info = pymesh.remove_duplicated_faces(mesh)
0.00s — 8 → 8 verts, 16 → 12 faces
Input
Cleaned
Edge splitting, collapse, and adaptive refinement
import pymesh
sphere = pymesh.generate_icosphere(
1.0, [0, 0, 0],
refinement_order=2)
refined, _ = pymesh.split_long_edges(
sphere, 0.2)
0.00s — 162 → 642 verts, 320 → 1,280 faces
Input
Refined
Compute the convex hull of a mesh
import pymesh
mesh = pymesh.generate_box_mesh(
np.array([0, 0, 0]),
np.array([1, 1, 1]))
hull = pymesh.convex_hull(mesh)
0.00s — 8 → 8 verts, 12 → 12 faces
Input
Convex Hull