我有一个点云,有一些反对,我产生一个长方体,并希望检测一个交/碰撞之间的长方体和对象之间的点云。
目前我正在使用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])发布于 2019-05-20 08:38:20
在这里,我可以看到三种可能适用的不同场景:
1.点网格epsilon-,这里我们检查点是否在网格的表面上。
对于所有点,对网格的所有三角形执行点三角距离检查,并检查距离是否小于所选的epsilon。
2.点网格碰撞检测这里我们检查点是否与网格碰撞.这假设点已经移动,因此我们有一个从最后一个位置到当前的线段。
对于所有的点运动,对网格的所有三角形执行直线-三角形相交.
3.点网格包容这里我们检查点是否在网格内.这假设网格是封闭的和可定向的。如果不是的话,你有一个完全不同的问题。
对于所有点,选择一条延伸到无穷远(或足够远的地方)的随机射线,并计算出该射线与网格的交点数。如果它是零或偶数,则点在网格的外部。否则它就在里面。请注意,该算法在某些角的情况下可能会失败,例如,如果点直接位于网格的表面,或者光线碰巧将网格相交在一条线上,而不是点上。
基本上,所有的场景都归结为执行点-三角形距离检查和直线-三角形交叉检查。我可以为这两个问题发布一些解决方案,但我只是在复制搜索查询的结果,所以.
https://stackoverflow.com/questions/56211310
复制相似问题