最好在Math.SE上问这个问题,但我先在这里尝试:
如果我在3D空间中有两个任意三角形,如何确定它们之间的最小距离?请参阅以下内容: 在图像中很难看到,但是三角形BAC完全在正Z平面中,而三角形DFE完全在负Z平面中。两个三角形的法线都平行于X-Y平面。它们之间的最小距离可能是我绘制的两个点(H和G)之间的距离。
假设三角形不是共面的,我知道代表两个三角形之间最小距离的点之一必须位于一个三角形的顶点或边上。对于另一个三角形,它可以位于平面上的任何位置,包括沿边或顶点。
我实际上并不需要最小距离-最终,我需要找到的只是这些三角形是否在彼此的ε范围内。
我尝试过的一件事就是简单地采样表面并进行快速的epsilon测试,以查看一个三角形中的任何点是否在另一个三角形的任何点的epsilon内,但这对于我的应用来说太慢了。在我看来,这应该有一个直接的分析解决方案,但是我根本找不到任何有关此问题的信息。
答案 0 :(得分:2)
如Axel的评论中所述,可以在PQP - Proximity Query Pack(尤其是TriDist.cpp文件)中找到实现。但是,该算法没有随附的引文,我也无法在显然写过它的埃里克·拉尔森(Eric Larsen)上找到任何东西(事实上,this 2014 paper还提到他们除了PQP之外找不到任何该算法的出版物。源代码)。
算法要点很简单:
首先,找到每对边缘之间的最小距离(总共9种组合)。在此,PQP使用以下算法:
左侧为三角形ABC,右侧为三角形DEF。假设我们正在查看边AB和EF-我们会发现顶点B和F定义了两个线段之间的最接近点。然后,我们在与连接矢量垂直的最近点绘制两个平面(见下文):
请注意,我已经将要比较的两个边缘的顶点着色为蓝色,而离边的顶点现在为绿色。现在,我们查看边缘顶点,并检查两个顶点之间是否存在于平板中。因为顶点D在两个平面之间,所以我们知道还没有找到两个三角形之间的真正最小距离。
由于两个边缘顶点都在两个平面之外,所以我们可以保证我们找到了两个三角形之间的最小距离。
在2-D中,可以确保最小距离沿着两个三角形的边缘,但是在3-D中不是这种情况。如果上述检查未找到最小距离(即,没有一对边通过平面测试),则以下情况之一必须为真:
首先,您必须检查情况1:
将第一个三角形中的点投影到第二个三角形上,并获取投影点与第一个三角形法线的点积。所有的点积都应具有相同的符号(如果不是,请交换您操作的三角形)。然后,找到投影最短的顶点,并检查其投影是否确实位于另一个三角形的表面上。如果是这样,那么您已经找到了两个点(您正在查看的顶点以及它在另一个三角形上的投影)。
否则,它必须属于情况2-4。
如果在先前的检查中两个三角形不相交,则为3或4。无论如何,只需使用在第一个测试中找到的最小点即可。否则,必须为情况2,在这种情况下,最小距离为零。