繁体   English   中英

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

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

我有一个带有一些反对意见的点云,我生成了一个长方体,并希望检测长方体与点云中的对象之间的相交/碰撞。

目前我正在使用 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-Mesh epsilon-intersection在这里我们检查点是否位于网格的表面上。

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

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

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

3.点-网格包含在这里我们检查点是否在网格内。 这假设网格是封闭的且可定向的。 如果不是,您将面临完全不同的问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM