Algorithm 确定点是否位于三维网格内的算法

Algorithm 确定点是否位于三维网格内的算法,algorithm,intersection,mesh,point,Algorithm,Intersection,Mesh,Point,确定点是否位于三维网格内的快速算法是什么?为简单起见,可以假设网格都是三角形,没有孔 到目前为止,我所知道的是,确定光线是否穿过网格的一种流行方法是计算光线/三角形交点的数量。它必须很快,因为我正在使用它进行触觉医疗模拟。所以我无法测试所有三角形的光线相交。我需要某种散列或树数据结构来存储三角形,以帮助确定哪个三角形是相关的 另外,我知道如果我有任意的顶点2D投影,一个简单的点/三角形相交测试是非常必要的。但是,我仍然需要知道哪些三角形是相关的,另外,哪些三角形位于点的前面,并且只测试这些三角形

确定点是否位于三维网格内的快速算法是什么?为简单起见,可以假设网格都是三角形,没有孔

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


另外,我知道如果我有任意的顶点2D投影,一个简单的点/三角形相交测试是非常必要的。但是,我仍然需要知道哪些三角形是相关的,另外,哪些三角形位于点的前面,并且只测试这些三角形。

就精度而言,光线三角形相交似乎是一个很好的算法。还有一些算法。我在这里链接它,但你可能已经看到了


你能,也许是即兴创作,在点和它们构成顶点的平面之间维持一个关系矩阵吗?这个课题似乎是学术界的一个研究课题。不确定如何访问更多与此相关的讨论。

只有当您有许多查询来证明构建数据结构的时间时,此算法才是有效的

将空间分成大小相等的立方体(稍后我们将计算出大小)。对于每个立方体,知道哪些三角形至少有一个点。丢弃不包含任何内容的多维数据集。执行维基百科上介绍的光线投射算法,但不是测试直线是否与每个三角形相交,而是获取与直线相交的所有立方体,然后仅对这些立方体中的三角形进行光线投射。注意不要多次测试同一个三角形,因为它存在于两个立方体中。
找到合适的立方体大小是很困难的,它不应该太大或太小。它只能通过反复试验才能找到。 假设
立方体数
c
三角形数
t

立方体中三角形的平均数为
t/c

k
是与光线相交的立方体的平均数
线立方体交点+这些立方体中的线三角形交点必须最小
c+k*t/c=minimal
=>
c=sqrt(t*k)

您必须测试立方体大小的值,直到
c=sqrt(t*k)
为真
立方体大小的一个好的开始猜测是
sqrt(网格宽度)


从一些角度来看,对于1M三角形,您将在1k个交点的顺序上进行测试

我解决了自己的问题。基本上,我采用任意2D投影(抛出一个坐标),并将三角形的AABBs(轴对齐边界框)散列为2D数组。(titus提到的一组3D立方体太过分了,因为它只会给你一个恒定的加速因子。)使用2D数组和你正在测试的点的2D投影来获得一小组三角形,你可以对这些三角形进行3D光线/三角形相交测试(请参见),并计算z坐标所在的光线相交处的三角形数量(被抛出的坐标)大于点的z坐标。偶数个交点表示它在网格外。奇数个交点表示它在网格内。此方法不仅速度快,而且非常容易实现(这正是我所寻找的).

Jeff我看到了你检查点是否在网格内的方法。在获得每个三角形的AABB后,如何按照你说的进行散列步骤?每个三角形的AABB是(xmin,xmax,ymin,ymax,zmin,zmax),那么得到的散列结果如何?Chao“执行光线投射算法”,在哪个方向?@rwols:任何方向,只要光线穿过奇数个三角形,它就在网格中。如果我理解正确,光线测试的方向就是所选2D投影的方向?当光线与三角形的顶点或边相交时,你会怎么做?你没有得到错误的相交数吗ns?如果精确击中一条边或顶点,则必须检查所有参与三角形的曲面法线(实际上是其值在方向分量中的符号)。更常见的解决方案可能是选择另一个坐标方向(如果有相应的哈希表可用)或者在原始点上添加一些小的变形并进行多数表决。我实现了类似的东西。有三种不同光栅化器的参考实现。