Spaces:
Running
on
Zero
Running
on
Zero
| import numpy as np | |
| import open3d as o3d | |
| import pymeshlab as pml | |
| def simplify_mesh(mesh, target_face_num: int = 100000): | |
| if mesh.faces.shape[0] <= target_face_num: | |
| return mesh | |
| vertices = mesh.vertices | |
| faces = mesh.faces | |
| ms = pml.MeshSet() | |
| ms.add_mesh(pml.Mesh(vertices, faces)) | |
| ms.meshing_decimation_quadric_edge_collapse( | |
| targetfacenum=int(target_face_num), preserveboundary=True | |
| ) | |
| new_mesh = ms.current_mesh() | |
| new_vertices = new_mesh.vertex_matrix() | |
| new_faces = new_mesh.face_matrix() | |
| o3d_mesh = o3d.geometry.TriangleMesh( | |
| o3d.utility.Vector3dVector(new_vertices), | |
| o3d.utility.Vector3iVector(new_faces), | |
| ) | |
| o3d_mesh = o3d_mesh.remove_duplicated_vertices() | |
| o3d_mesh = o3d_mesh.remove_degenerate_triangles() | |
| o3d_mesh = o3d_mesh.remove_non_manifold_edges() | |
| o3d_mesh = o3d_mesh.remove_unreferenced_vertices() | |
| return mesh.__class__( | |
| vertices=np.asarray(o3d_mesh.vertices), | |
| faces=np.asarray(o3d_mesh.triangles), | |
| vertex_normals=np.asarray(o3d_mesh.vertex_normals), | |
| process=False, | |
| ) | |