记两个三角形分别为 T 1 , T 2 T_1,T_2 T1,T2,所在平面为 π 1 , π 2 \pi_1,\pi_2 π1,π2, T 1 T_1 T1的顶点为 V 0 1 , V 1 1 , V 2 1 V_0^1,V_1^1,V_2^1 V01,V11,V21, T 2 T_2 T2的顶点为 V 0 2 , V 1 2 , V 2 2 V_0^2,V_1^2,V_2^2 V02,V12,V22.
π
2
\pi_2
π2的表达式为:
其中
T
1
T_1
T1的每个点到
π
2
\pi_2
π2的有向距离为:
1.二者所在平面无交
若有向距离 d V i 1 d_{V_i^1} dVi1均不为0,且有相同的符号,则三角形 T 1 T_1 T1位于平面 π 2 \pi_2 π2的一侧,故三角形 T 1 T_1 T1与平面 π 2 \pi_2 π2不相交,那么三角形 T 1 T_1 T1与三角形 T 2 T_2 T2不相交. 同理可通过检测三角形 T 2 T_2 T2是否位于平面 π 1 \pi_1 π1的一侧来判断两三角形是否相交.
2.二者在同一平面
若有向距离 d V i 1 d_{V_i^1} dVi1均为0,那么两三角形位于同一个平面上,将这两个三角形投影至与坐标轴平形的平面,使得面积最大化,由此减少了一个维度,问题转换为检测二维的两个三角形是否相交,首先检测 T 1 T_1 T1的每条边是否与 T 2 T_2 T2的边相交,其次检测 T 1 T_1 T1是否完全包含于 T 2 T_2 T2,即检测 T 1 T_1 T1的每个顶点是否包含于 T 2 T_2 T2,同理检测 T 2 T_2 T2是否完全包含于 T 1 T_1 T1.
2.其它
若不属于上述两种情况,那么平面
π
1
,
π
2
\pi_1,\pi_2
π1,π2交于直线
L
=
O
+
t
D
L=O+tD
L=O+tD,其中方向向量
D
=
N
1
×
N
2
D=N_1 \times N_2
D=N1×N2,
O
O
O是直线上一点,两个三角形分别与直线
L
L
L相交构成直线上的一段区间,若两段区间相交,那么两三角形相交,反之不相交,两种情况如下图所示:
考虑三角形
T
1
T_1
T1与直线
L
L
L相交构成的区间,不妨设
V
0
1
,
V
2
1
V_0^1,V_2^1
V01,V21位于
π
2
\pi_2
π2的一侧,
V
1
1
V_1^1
V11位于另外一侧,边
V
0
1
V
1
1
‾
\overline{V_0^1 V_1^1}
V01V11与边
V
2
1
V
1
1
‾
\overline{V_2^1 V_1^1}
V21V11分别与
L
L
L相交,交点构成的区间即为所求.
各顶点在直线
L
L
L上的投影为:
记
B
B
B为边
V
0
1
V
1
1
‾
\overline{V_0^1 V_1^1}
V01V11与
L
L
L的交点,
B
=
O
+
t
1
D
B=O+t_1 D
B=O+t1D,记
K
i
1
K_i^1
Ki1为各顶点在
π
2
\pi_2
π2的投影,由图中的两对相似三角形,得
注:
d
V
i
1
d_{V_i^1}
dVi1是有向距离,故
d
V
0
1
−
d
V
1
1
d_{V_0^1}-d_{V_1^1}
dV01−dV11代表
±
∣
d
V
0
1
+
d
V
1
1
∣
\pm |d_{V_0^1}+d_{V_1^1}|
±∣dV01+dV11∣
同理可以计算边
V
2
1
V
1
1
‾
\overline{V_2^1 V_1^1}
V21V11与
L
L
L的交点
O
+
t
2
D
O+t_2 D
O+t2D,由此记得三角形
T
1
T_1
T1与直线
L
L
L相交的区间,同理可得
T
2
T_2
T2与直线
L
L
L相交的区间, 最后判断两区间是否相交即可.
参考文献
Möller T. A fast triangle-triangle intersection test[J]. Journal of graphics tools, 1997, 2(2): 25-30.