Как я могу обнаружить пересечение между точечным облаком и треугольной сеткой? - PullRequest
0 голосов
/ 19 мая 2019

У меня есть облако точек с некоторыми возражениями, и я создаю кубоид и хочу обнаружить пересечение / столкновение между кубоидом и объектами из облака точек.

В данный момент я использую Open3D и читаюоблако точек (xyzrgb, .ply) из камеры стереозрения и создайте трехмерную геометрию (замкнутая треугольная сетка).

Как я могу обнаружить пересечение между треугольной сеткой и любой точкой из облака точек?Я думаю, что самый простой способ - проверить каждую точку облака точек, лежит ли она внутри сетки, но как я могу это сделать?

from open3d import *

pcd = read_point_cloud("out.ply")
draw_geometries([pcd])

# print("Let\'s draw some primitives")
mesh_box = create_mesh_box(width=1.0, height=1.0, depth=1.0)
mesh_box.paint_uniform_color([0.9, 0.4, 0.1])
mesh_frame = create_mesh_coordinate_frame(size=0.6, origin=[0, 0, 0])
draw_geometries([pcd, mesh_box, mesh_frame])

TM = np.eye(4, dtype=int)
TM[0, 3] = 10
TM[1, 3] = 10
TM[2, 3] = 10

open3d.geometry.Geometry3D.transform(mesh_box, TM)
draw_geometries([pcd, mesh_box, mesh_frame])

1 Ответ

0 голосов
/ 20 мая 2019

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

1.Точка-сетка epsilon-intersection Здесь мы проверяем, лежат ли точки на поверхности сетки.

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

2.Обнаружение столкновения точка-сетка Здесь мы проверяем, столкнулись ли точки с сеткой.Это предполагает, что точки сместились, и, таким образом, у нас есть отрезок линии от последней позиции до текущей.

Для всех перемещений точек выполните пересечение линии-треугольника со всеми треугольниками сетки.

3.Содержимое Point-Mesh Здесь мы проверяем, находятся ли точки внутри сетки.Это предполагает, что сетка замкнута и ориентируема.Если это не так, у вас совершенно другая проблема.

Для всех точек выберите случайный луч, простирающийся до бесконечности (или достаточно далеко), и рассчитайте количество пересечений этого луча с сеткой.Если это ноль или четное число, точка находится за пределами сетки.В противном случае это внутри.Обратите внимание, что этот алгоритм может не работать в некоторых угловых случаях, например, если точка находится непосредственно на поверхности сетки или луч пересекает сетку на линии вместо точки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...