论文:A Fast Triangle-Triangle Intersection Test
作者:Tomas Moller
时间:2012.04.06
1.简介
计算两个三角形是否相交的算法及优化。(碰撞检测算法)
2.介绍
碰撞检测算法:
OBBTree(文章“OBBTree: A Hierarchical Structure for Rapid Interference Detection” Cottschalk 96)
sphere hierarchies (文章“Approximat ing Polyhedra with Spheres for Time-Critical Collision Detection” Hubbard 96)
BV-tress(文章“"Efficient Collision Detection Using Bounding Volume Hierarchies of k-DOPs” Klosowski 97)
3.相测试方法
- 两个三角形表示:T1,T2;
- 三角形点:T1:V01,V11,V21; T2:V02,V12,V22
- 三角形所在的面:π1,π2
第一步:平面π2方程: N2⋅X+d2=0, X为平面任意一点
其中:N2=(V12−V02)×(V22−V02); d2=−N2⋅V02;
第二步:表示T1上点到π2的距离
dvi1=N2⋅Vi1+d2,i=0,1,2;
第三步:判断
①当dvi1=0,i=0,1,2成立,且符号相同,则T1位于π2一侧,则不会相交。同理T2,π1也可以排除相交情况。这两个拒绝检测可以较早的排除掉许多三角形对。
②当dvi1=0,i=0,1,2成立,两个三角形共平面,稍后讨论。
③排除上述两种情况,π1,π2相交与一条直线L=O+tD,其中D=N1×N2,为直线方向;O是线上一点。且可以确定T1,T2均与直线相交,当相交区间有重叠时,可判断两三角形相交。两种情况如图1所示。

针对这种情况将需要计算出T1在L上的相交标量区间,我们可以假设V01,V21在同侧,V11在π2另一侧(其他情况①②已排除)。
三角形顶点到直线的投影:pvi1=D⋅(Vi1−O);
几何关系如图2所示。

然后我们需要计算线段参数t1,有B=V01V11∩L=O+t1D
用Ki1表示Vi1在π2上的投影,我们可以找到相似三角形△V01BK01和△V11BK11。所以t1=pv01+(pv11−pv01)dv01−dv11dv01;
同理计算t2,同理T2。
如果两个区间重叠,则三角形相交。
回头看②中同面情况,将三角形投影在两三角形面积最大的轴平面,问题转换为二维的三角形重叠测试。首先测试T1中所有的边是否与T2中所有边相交,有相交则两三角形相交成立。否则需要排除包含情况。采用点在三角形中测试(文章"Point in Polygon Strategies"Haines 94),T1在T2中以及T2在T1中。
4.优化
①由于整体平移不改变相交测试结果,所以计算pvi1可以简化
pvi1=D⋅Vi1,i=0,1,2; O可以不用计算。
②我们可以将直线L投影到最一致的轴上(与直线L夹角最小的轴,即max(∣Dx∣,∣Dy∣,∣Dz∣)对应的轴),pvi1计算可以进一步简化
pvi1=⎩⎪⎨⎪⎧Vix1,if∣Dx∣=max(∣Dx∣,∣Dy∣,∣Dz∣)Viy1,if∣Dy∣=max(∣Dx∣,∣Dy∣,∣Dz∣)Viz1,if∣Dz∣=max(∣Dx∣,∣Dy∣,∣Dz∣),i=0,1,2;
其中V0x1表示V01的x方向分量,其它类似。
5.实现和性能
步骤:
①计算T2方程;
②若T1所有点在同侧,返回不相交;
③计算T1方程;
④若T2所有点在同侧,返回不相交;
⑤计算相交直线,并投影到最大轴
⑥计算每个三角形相交区间
⑦区间相交
同面情况很少见,可以放到后面处理。
注意事项:
①点在面上的判断,需要引入固定小值EPSILON(ϵ),当距离小于该值是认为,点在面上。
②根据情况判断是否需要考虑三角形退化为直线和点的情况,若需要,不得不优先考虑退化情况。
性能:
Oxygen VR-platform中内部碰撞检测包使用了这个方法。