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

时间:2019-05-19 19:29:12

标签: python collision-detection intersection point-clouds

我有一个带有一些异议的点云,并且生成一个长方体,并且想要从点云中检测长方体与对象之间的交集/碰撞。

此刻,我正在使用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 个答案:

答案 0 :(得分:0)

我可以看到三种不同的情况在这里适用:

1。点网格epsilon交叉点 在这里,我们检查点是否位于网格的表面上。

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

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

对于所有点移动,请对网格的所有三角形执行线三角形相交。

3。点网遏制 在这里,我们检查点是否在网格内。这假定网格是封闭的且可定向的。如果不是,那么您将面临一个完全不同的问题。

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

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