如何检测点云和三角形网格之间的交点?

How can I detect a intersection between a pointcloud and a triangle mesh?

我有一个有一些异议的点云,我生成了一个长方体并想检测长方体和点云中的对象之间的 intersection/collision。

目前我正在使用 Open3D 并从立体视觉相机读取点云 (xyzrgb, .ply) 并生成 3D 几何体(闭合三角形网格)。

如何检测三角形网格与点云中任意点的交点? 我认为最简单的方法是检查点云的每个点是否位于网格内,但我该怎么做?

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. Point-Meshepsilon-intersection 这里我们检查点是否位于网格表面。

对于所有点,对网格的所有三角形执行 point-triangle 距离检查,并检查距离是否小于某个选定的 epsilon。

2。 Point-Mesh 碰撞检测 在这里,我们检查点是否与网格发生碰撞。这假设点已经移动,因此我们有一条从最后位置到当前位置的线段。

对于所有点移动,对网格的所有三角形执行 line-triangle 交集。

3。 Point-Mesh遏制 这里我们检查点是否在网格内。这假设网格是封闭的和可定向的。如果不是,那你的问题就完全不同了。

为所有点选择一条延伸到无穷远(或足够远)的随机射线,并计算该射线与网格的交点数。如果它是零或偶数,则该点位于网格外部。否则它在里面。请注意,此算法在某些极端情况下可能会失败,例如,如果点直接位于网格的表面上,或者光线恰好与网格相交于一条直线而不是一个点。

基本上所有场景都归结为执行 point-triangle 距离检查和 line-triangle 交叉检查。我可以 post 解决这两个问题,但我只是复制搜索查询的结果,所以...