论文阅读笔记:A Fast Triangle-Triangle Intersection Test

论文: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.相测试方法

  • 两个三角形表示: T 1 T_1 T1, T 2 T_2 T2;
  • 三角形点: T 1 T_1 T1 V 0 1 V_0^1 V01 V 1 1 V_1^1 V11 V 2 1 V_2^1 V21 T 2 T_2 T2 V 0 2 V_0^2 V02 V 1 2 V_1^2 V12 V 2 2 V_2^2 V22
  • 三角形所在的面: π 1 \pi_1 π1, π 2 \pi_2 π2

第一步:平面 π 2 \pi_2 π2方程: N 2 ⋅ X + d 2 = 0 N_2·X + d_2 = 0 N2X+d2=0, X X X为平面任意一点
其中: N 2 = ( V 1 2 − V 0 2 ) × ( V 2 2 − V 0 2 ) ; N_2 = (V_1^2-V_0^2)×(V_2^2 -V_0^2); N2=(V12V02)×V22V02); d 2 = − N 2 ⋅ V 0 2 ; d_2=-N_2·V_0^2; d2=N2V02;
第二步:表示 T 1 T_1 T1上点到 π 2 \pi_2 π2的距离
d v i 1 = N 2 ⋅ V i 1 + d 2 , i = 0 , 1 , 2 ; d_{v_i^1}=N_2·V_i^1+d_2,i=0,1,2; dvi1=N2Vi1+d2,i=0,1,2;
第三步:判断
①当 d v i 1 ≠ 0 , i = 0 , 1 , 2 d_{v_i^1} ≠ 0,i=0,1,2 dvi1=0i=0,1,2成立,且符号相同,则 T 1 T_1 T1位于 π 2 \pi_2 π2一侧,则不会相交。同理 T 2 T_2 T2, π 1 \pi_1 π1也可以排除相交情况。这两个拒绝检测可以较早的排除掉许多三角形对。
②当 d v i 1 = 0 , i = 0 , 1 , 2 d_{v_i^1} = 0,i=0,1,2 dvi1=0i=0,1,2成立,两个三角形共平面,稍后讨论。
③排除上述两种情况, π 1 \pi_1 π1 π 2 \pi_2 π2相交与一条直线 L = O + t D L=O+tD L=O+tD,其中 D = N 1 × N 2 , 为 直 线 方 向 ; D=N_1×N_2,为直线方向; D=N1×N2,线; O O O是线上一点。且可以确定 T 1 T_1 T1, T 2 T_2 T2均与直线相交,当相交区间有重叠时,可判断两三角形相交。两种情况如图1所示。
论文阅读笔记:A Fast Triangle-Triangle Intersection Test_第1张图片

针对这种情况将需要计算出 T 1 T_1 T1 L L L上的相交标量区间,我们可以假设 V 0 1 V_0^1 V01 V 2 1 V_2^1 V21在同侧, V 1 1 V_1^1 V11 π 2 \pi_2 π2另一侧(其他情况①②已排除)。
三角形顶点到直线的投影: p v i 1 = D ⋅ ( V i 1 − O ) ; p_{v_i^1} =D·(V_i^1-O); pvi1=DVi1O;
几何关系如图2所示。
论文阅读笔记:A Fast Triangle-Triangle Intersection Test_第2张图片

然后我们需要计算线段参数 t 1 t_1 t1,有 B = V 0 1 V 1 1 ‾ ∩ L = O + t 1 D B=\overline{V_0^1V_1^1}∩L = O+t_1D B=V01V11L=O+t1D
K i 1 K_i^1 Ki1表示 V i 1 V_i^1 Vi1 π 2 \pi_2 π2上的投影,我们可以找到相似三角形 △ V 0 1 B K 0 1 △V_0^1BK_0^1 V01BK01 △ V 1 1 B K 1 1 △V_1^1BK_1^1 V11BK11。所以 t 1 = p v 0 1 + ( p v 1 1 − p v 0 1 ) d v 0 1 d v 0 1 − d v 1 1 ; t_1=p_{v_0^1}+(p_{v_1^1}-p_{v_0^1)}\frac{d_{v_0^1}}{d_{v_0^1}-d_{v_1^1}}; t1=pv01+(pv11pv01)dv01dv11dv01;
同理计算 t 2 t_2 t2,同理 T 2 T_2 T2
如果两个区间重叠,则三角形相交。
回头看②中同面情况,将三角形投影在两三角形面积最大的轴平面,问题转换为二维的三角形重叠测试。首先测试 T 1 T_1 T1中所有的边是否与 T 2 T_2 T2中所有边相交,有相交则两三角形相交成立。否则需要排除包含情况。采用点在三角形中测试(文章"Point in Polygon Strategies"Haines 94), T 1 T_1 T1 T 2 T_2 T2中以及 T 2 T_2 T2 T 1 T_1 T1中。

4.优化

①由于整体平移不改变相交测试结果,所以计算 p v i 1 p_{v_i^1} pvi1可以简化
p v i 1 = D ⋅ V i 1 , i = 0 , 1 , 2 ; p_{v_i^1} =D·V_i^1,i=0,1,2; pvi1=DVi1i=0,1,2; O O O可以不用计算。
②我们可以将直线 L L L投影到最一致的轴上(与直线 L L L夹角最小的轴,即 m a x ( ∣ D x ∣ , ∣ D y ∣ , ∣ D z ∣ ) max(|D_x|,|D_y|,|D_z|) max(Dx,Dy,Dz)对应的轴), p v i 1 p_{v_i^1} pvi1计算可以进一步简化
p v i 1 = { V i x 1 , i f ∣ D x ∣ = m a x ( ∣ D x ∣ , ∣ D y ∣ , ∣ D z ∣ ) V i y 1 , i f ∣ D y ∣ = m a x ( ∣ D x ∣ , ∣ D y ∣ , ∣ D z ∣ ) V i z 1 , i f ∣ D z ∣ = m a x ( ∣ D x ∣ , ∣ D y ∣ , ∣ D z ∣ ) , i = 0 , 1 , 2 ; p_{v_i^1}= \begin{cases}V_{ix}^1,if |D_x| = max(|D_x|,|D_y|,|D_z|) \\V_{iy}^1,if |D_y| = max(|D_x|,|D_y|,|D_z|) \\V_{iz}^1,if |D_z| = max(|D_x|,|D_y|,|D_z|) \end{cases},i=0,1,2; pvi1=Vix1,ifDx=max(Dx,Dy,Dz)Viy1,ifDy=max(Dx,Dy,Dz)Viz1,ifDz=max(Dx,Dy,Dz),i=0,1,2;
其中 V 0 x 1 V_{0x}^1 V0x1表示 V 0 1 V_0^1 V01 x x x方向分量,其它类似。

5.实现和性能

步骤:

①计算 T 2 T_2 T2方程;
②若 T 1 T_1 T1所有点在同侧,返回不相交;
③计算 T 1 T_1 T1方程;
④若 T 2 T_2 T2所有点在同侧,返回不相交;
⑤计算相交直线,并投影到最大轴
⑥计算每个三角形相交区间
⑦区间相交
同面情况很少见,可以放到后面处理。
注意事项:
①点在面上的判断,需要引入固定小值EPSILON( ϵ \epsilon ϵ),当距离小于该值是认为,点在面上。
②根据情况判断是否需要考虑三角形退化为直线和点的情况,若需要,不得不优先考虑退化情况。
性能:
Oxygen VR-platform中内部碰撞检测包使用了这个方法。

你可能感兴趣的:(论文学习笔记,算法,几何学)