def taubin_filtering(): # Create noisy mesh. mesh_in = o3dex.get_knot_mesh() vertices = np.asarray(mesh_in.vertices) noise = 5 vertices += np.random.uniform(0, noise, size=vertices.shape) mesh_in.vertices = o3d.utility.Vector3dVector(vertices) mesh_in.compute_vertex_normals() print("Displaying input mesh ...") o3d.visualization.draw_geometries([mesh_in]) print("Displaying output of Taubin mesh filter after 10 iteration ...") mesh_out = mesh_in.filter_smooth_taubin(number_of_iterations=10) mesh_out.compute_vertex_normals() o3d.visualization.draw_geometries([mesh_out]) print("Displaying output of Taubin mesh filter after 100 iteration ...") mesh_out = mesh_in.filter_smooth_taubin(number_of_iterations=100) mesh_out.compute_vertex_normals() o3d.visualization.draw_geometries([mesh_out])
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. # ---------------------------------------------------------------------------- import open3d as o3d import numpy as np import os import sys dir_path = os.path.dirname(os.path.abspath(__file__)) sys.path.append(dir_path + "/..") import open3d_example as o3dex if __name__ == "__main__": mesh = o3dex.get_knot_mesh() print("Displaying mesh without normals ...") # Invalidate existing normals. mesh.triangle_normals = o3d.utility.Vector3dVector(np.zeros((1, 3))) print("normals: \n", np.asarray(mesh.triangle_normals)) o3d.visualization.draw_geometries([mesh]) print("Computing normals and rendering it ...") mesh.compute_vertex_normals() print("normals: \n", np.asarray(mesh.triangle_normals)) o3d.visualization.draw_geometries([mesh])
pcl = o3d.geometry.PointCloud(points=o3d.utility.Vector3dVector( np.asarray(mesh.vertices)[verts])) pcl.paint_uniform_color((0, 0, 1)) geoms.append(pcl) if self_intersecting: intersecting_triangles = np.asarray( mesh.get_self_intersecting_triangles()) intersecting_triangles = intersecting_triangles[0:1] intersecting_triangles = np.unique(intersecting_triangles) print(" # visualize self-intersecting triangles") triangles = np.asarray(mesh.triangles)[intersecting_triangles] edges = [ np.vstack((triangles[:, i], triangles[:, j])) for i, j in [(0, 1), (1, 2), (2, 0)] ] edges = np.hstack(edges).T edges = o3d.utility.Vector2iVector(edges) geoms.append(o3dex.edges_to_lineset(mesh, edges, (1, 0, 1))) o3d.visualization.draw_geometries(geoms, mesh_show_back_face=True) if __name__ == "__main__": check_properties('Knot', o3dex.get_knot_mesh()) check_properties('Moebius', o3d.geometry.TriangleMesh.create_moebius(twists=1)) check_properties("non-manifold edge", o3dex.get_non_manifold_edge_mesh()) check_properties("non-manifold vertex", o3dex.get_non_manifold_vertex_mesh()) check_properties("open box", o3dex.get_open_box_mesh()) check_properties("intersecting_boxes", o3dex.get_intersecting_boxes_mesh())