用于确定点是否在3D网格内的算法

时间:2011-07-02 00:16:41

标签: algorithm intersection mesh point

用于确定点是否在3D网格内的快速算法是什么?为简单起见,您可以假设网格是所有三角形并且没有孔。

到目前为止我所知道的是,确定光线是否穿过网格的一种流行方法是计算光线/三角形交叉点的数量。它必须很快,因为我将它用于触觉医疗模拟。所以我无法测试光线交叉的所有三角形。我需要某种散列或树数据结构来存储三角形,以帮助确定哪个三角形是相关的。

另外,我知道如果我对顶点进行任意2D投影,则需要进行简单的点/三角交点测试。但是,我仍然需要知道哪些三角形是相关的,此外,哪些三角形位于该点的前面,只测试这些三角形。

3 个答案:

答案 0 :(得分:16)

我解决了自己的问题。基本上,我采用任意2D投影(抛出其中一个坐标),并将三角形的AABB(轴对齐边界框)散列为2D数组。 (由titus提到的一组3D立方体是矫枉过正的,因为它只会给你一个恒定的因子加速。)使用你正在测试的点的2D数组和2D投影来获得一小组三角形,你做了一个3D射线/三角形交叉点测试(参见Intersections of Rays, Segments, Planes and Triangles in 3D)并计算光线交叉点的三角形数量,其中z坐标(抛出的坐标)大于点的z坐标。偶数个交叉点意味着它在网格之外。奇数个交叉点意味着它位于网格内部。这种方法不仅速度快,而且易于实现(这正是我所寻找的)。

答案 1 :(得分:3)

只有当您有许多查询来证明构造数据结构的时间时,这种算法才有效。

将空间划分为相同大小的立方体(我们稍后会计算出尺寸)。对于每个立方体,知道哪些三角形中至少有一个点。丢弃不包含任何内容的多维数据集。执行维基百科上提供的光线投射算法,但是测试线是否与每个三角形相交,获得与线相交的所有立方体,然后仅使用这些立方体中的三角形进行光线投射。注意不要多次测试同一个三角形,因为它存在于两个立方体中 找到合适的立方体尺寸很棘手,它不应该既不大也不小。它只能通过反复试验找到。 假设number of cubescnumber of trianglest 立方体中三角形的平均数量为t/c
k是与光线相交的立方体的平均数量
线立方交点+这些立方体中的线 - 三角交点必须是最小的 c+k*t/c=minimal => c=sqrt(t*k)
c=sqrt(t*k)为真之前,您必须测试多维数据集大小的值 对于立方体大小的良好开始猜测是sqrt(mesh width)
要获得一些视角,对于1M三角形,您将按照1k交叉点的顺序进行测试

答案 2 :(得分:0)

Ray Triangle Intersection在准确性方面似乎是一个很好的算法。 Wiki有更多算法。我在这里链接它,但你可能已经看过了。

你可以通过维持点和它们构成顶点的平面之间的关系矩阵来表达吗?该主题似乎是学术界的一个调查主题。不确定如何访问与此相关的更多讨论。