如何使用 python 将 3D 云数据点转换为网格?
How to convert 3D cloud datapoints to mesh using python?
我有一组看起来类似于球体的 3D 数据点。我需要将这些数据点连接成水密网格,以便可以用于模拟。
我用 Meshlab 工作过,得到了一个合理的网格,但不是水密的。
在此之后,我尝试使用球枢轴算法使用 Open3D python 库。由此,我无法按预期获得防水网格。我尝试使用 hole_fixer 外部库 (Hole_fixer),但在使用 cmake 安装时发现错误。
我已经插入代码以及用于 open3D 的“xyz”数据点。
import numpy as np
import open3d as o3d
dataname = 'meshdata2.xyz'
point_cloud = np.loadtxt(dataname, skiprows=1)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(point_cloud[:,:3])
pcd.estimate_normals()
distances = pcd.compute_nearest_neighbor_distance()
avg_dist = np.mean(distances)
radius = 5*avg_dist
bpa_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd, o3d.utility.DoubleVector([radius, radius*2, radius*0.5]))
print(str(bpa_mesh.is_watertight()))
o3d.visualization.draw_geometries([bpa_mesh])
Link 对于“xyz 文件”:xyz_file_link
从 Open3D 获得的网格:Mesh_from_open3D
我想知道如何获得这些数据点的防水网格。
任何线索将不胜感激。
此致,
Sunag R A.
要实现防水网格,您可以使用o3d.geometry.TriangleMesh.create_from_point_cloud_poisson
。
然而,泊松重建需要一致的法线方向。在您的情况下,您可以将所有法线定向到点云的中心。为此:
import numpy as np
import open3d as o3d
pcd = o3d.io.read_point_cloud('./meshdata2.xyz')
pcd.estimate_normals()
# to obtain a consistent normal orientation
pcd.orient_normals_towards_camera_location(pcd.get_center())
# or you might want to flip the normals to make them point outward, not mandatory
pcd.normals = o3d.utility.Vector3dVector( - np.asarray(pcd.normals))
# surface reconstruction using Poisson reconstruction
mesh, _ = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=9)
# paint uniform color to better visualize, not mandatory
mesh.paint_uniform_color(np.array([0.7, 0.7, 0.7]))
o3d.io.write_triangle_mesh('a.ply', mesh)
使用上述代码片段得到的网格:
对于具有复杂拓扑的点云,获得一致的法线方向可能并不容易,请阅读了解更多信息。
我有一组看起来类似于球体的 3D 数据点。我需要将这些数据点连接成水密网格,以便可以用于模拟。
我用 Meshlab 工作过,得到了一个合理的网格,但不是水密的。
在此之后,我尝试使用球枢轴算法使用 Open3D python 库。由此,我无法按预期获得防水网格。我尝试使用 hole_fixer 外部库 (Hole_fixer),但在使用 cmake 安装时发现错误。
我已经插入代码以及用于 open3D 的“xyz”数据点。
import numpy as np
import open3d as o3d
dataname = 'meshdata2.xyz'
point_cloud = np.loadtxt(dataname, skiprows=1)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(point_cloud[:,:3])
pcd.estimate_normals()
distances = pcd.compute_nearest_neighbor_distance()
avg_dist = np.mean(distances)
radius = 5*avg_dist
bpa_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd, o3d.utility.DoubleVector([radius, radius*2, radius*0.5]))
print(str(bpa_mesh.is_watertight()))
o3d.visualization.draw_geometries([bpa_mesh])
Link 对于“xyz 文件”:xyz_file_link
从 Open3D 获得的网格:Mesh_from_open3D
我想知道如何获得这些数据点的防水网格。
任何线索将不胜感激。
此致,
Sunag R A.
要实现防水网格,您可以使用o3d.geometry.TriangleMesh.create_from_point_cloud_poisson
。
然而,泊松重建需要一致的法线方向。在您的情况下,您可以将所有法线定向到点云的中心。为此:
import numpy as np
import open3d as o3d
pcd = o3d.io.read_point_cloud('./meshdata2.xyz')
pcd.estimate_normals()
# to obtain a consistent normal orientation
pcd.orient_normals_towards_camera_location(pcd.get_center())
# or you might want to flip the normals to make them point outward, not mandatory
pcd.normals = o3d.utility.Vector3dVector( - np.asarray(pcd.normals))
# surface reconstruction using Poisson reconstruction
mesh, _ = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=9)
# paint uniform color to better visualize, not mandatory
mesh.paint_uniform_color(np.array([0.7, 0.7, 0.7]))
o3d.io.write_triangle_mesh('a.ply', mesh)
使用上述代码片段得到的网格:
对于具有复杂拓扑的点云,获得一致的法线方向可能并不容易,请阅读