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



我有一个带有某些异议的点云,我生成了一个立方体,并想检测cuboid和对象之间的相交/碰撞。

目前我正在使用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。点网状Epsilon Intersection 在这里,我们检查点是否位于网格的表面。

对于所有点,都针对网格的所有三角形进行点 - 三角形检查,并检查距离是否小于某些选择的epsilon。

2。点网状碰撞检测在这里,我们检查点是否与网格相撞。假设这些要点已经移动,因此我们有一个线段从最后一个位置到当前位置。

对于所有点移动

3。点网状遏制在这里,我们检查点是否在网格内部。假设网格是封闭和定向的。如果不是,您有一个完全不同的问题。

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

基本上所有方案都归结为执行点三角形距离检查和线路三角形交叉检查。我可以针对这两个问题发布一些解决方案,但是我只是复制搜索查询的结果,所以...

最新更新