Как преобразовать точки данных 3D-облака в сетку с помощью Python?

У меня есть набор трехмерных точек данных, похожих на сферу. Мне нужно, чтобы эти точки данных были соединены как водонепроницаемая сетка, чтобы ее можно было использовать для моделирования.

Я работал с Meshlab и получил приемлемую сетку, но не водонепроницаемую.

После этого я попробовал использовать библиотеку Python Open3D, используя алгоритм поворота шара. Из-за этого я не могу получить водонепроницаемую сетку, как ожидалось. Я пытался работать с внешней библиотекой hole_fixer (Hole_fixer), но обнаружил ошибку при установке с помощью cmake.

Я вставил код, а также точки данных xyz, используемые для open3D.

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])

Ссылка для файла xyz: xyz_file_link

Сетка, полученная из Open3D: Mesh_from_open3D

Я хотел бы знать, как получить водонепроницаемую сетку для этих точек данных.

Будем признательны за любые запросы.

С уважением,

Сунаг Р. А.


person rasunag27    schedule 12.03.2021    source источник


Ответы (1)


Чтобы получить водонепроницаемую сетку, вы можете использовать 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)

Сетка, полученная с использованием приведенного выше фрагмента кода:  введите описание изображения здесь


Для облаков точек со сложной топологией может быть непросто получить последовательную нормальную ориентацию, подробнее см. мой другой ответ. .

person Jing Zhao    schedule 13.03.2021
comment
Спасибо, @Jing Zhao, теперь это выглядит так красиво .. !! - person rasunag27; 14.03.2021