空间中三角形与三角形相交

前言

  一种快速判断空间中三角形与三角形相交的方法,出自论文:Tomas Moller. A Fast Triangle-Triangle Intersection Test. Journal of Graphics Tools, 1997, 2(2):25-30. ,与「快速判断三角形与长方体相交」中那篇论文的作者是同一个人。

相交篇

  该论文的理论基础部分来自分离轴理论,论文中三角形与三角形的相交测试主要可分为 3 类:1、沿三角形所在平面法线方向的相交测试;2、沿三角形所在两平面交线方向的相交测试;3、共面时的相交测试。下面来逐步分析这些相交测试。

沿法线方向相交

  沿法线相交很简单,直接使用分离轴理论分别判断两三角形在对应两条法线上的投影是否相交,若存在一条法线使投影不相交,则可直接判定两三角形不相交,若投影都相交,则存在两种情况,一种是两三角形共面,一种是两三角形相互跨立,判断这两种情况的依据为计算两段投影之间的距离,具体计算方法为:计算三角形 B 上三个点到三角形 A 所在平面的距离,距离计算的方法可参考「计算几何基础—点到平面的距离」,此距离同时需要保留方向,若三个点的距离都为 0,则两三角形共面;若三个距离都同号,则说明投影不相交,即两三角形不相交;若三个距离存在异号现象,则 B 跨立 A。

沿交线方向相交

  若两三角形相互跨立,则需要判断两三角形是否在两三角形所在平面交线上存在相交。由于两三角形相互跨立,则两三角形必然都与交线相交,则需要分别计算两三角形与交线的交点,根据交点判断两交线段是否相交,若相交,则可直接判定两三角形相交,若不相交,则同样可直接判定两三角形不相交。

  问题的关键现在在于求取两交线段,比较粗暴的方式为:先求出两平面的交线,交线的方向向量为两三角形所在平面法向量的的叉积,交线上的一点通过联立两平面方程进行求取,由于是两个方程求 3 个未知数(x,y,z),所以理论上有无数个解,令交线方向向量绝对值最大的分量对应的未知数为 0,消除一个未知数,还剩两个,可得唯一解,即可求出交线上一点,亦可得到直线参数方程,求两交线段相当于求四个交点,根据直线与线段相交可得到交点,进而得到交线段。

论文中的方法为:求出交线的方向向量 D 后,设 O 为交线上任意一点(不需要求),则交线方程为 \(L= O+tD\),此时求交线段只需要求出 4 个 t。先求交线与三角形 A 的交线段,设三角形 A(V0,V1,V2)三个顶点到三角形 B 所在平面的距离分别为 \(d_0,d_1,d_2\),设 \(d_1\) 与其它两个距离异号,则交线分别与 V0V1 和 V2V1 相交,先求与 V0V1 相交时的 t1,设三角形 B 所在的平面为平面 B,V0 和 V1 在平面 B 上的投影分别为为 K0 和 K1,V0 和 V1 在交线上的投影分别为为 P0 和 P1,交线与 V0V1 的交点为 C1,设 \(P0=O+p_0D,P1=O+p_1D,C1=O+t_1D\),则 \(p_0=(V0-O)·D,p_1=(V1-O)·D\),由论文中图二可知,有两组三角形相似,分别为 V0C1K0和V1C1K1 相似,以及 V0C1P0和V1C1P1 相似,所以 \[ \frac{V0K0}{V1K1} = \frac{V0C1}{V1C1} = \frac{C1P0}{C1P1} \Rightarrow \frac{d_0}{d_1} = \frac{p_0-t_1}{p1-t_1} \Rightarrow t_1 = \frac{d_0p_1-d_1p_0}{d_0-d_1} \] 若点 O 为原点在交线上的投影,则 \((V0-O)·D=V0·D=p_0,  p_1=V1·D\),若将交线投影到交线方向向量绝对值最大的分量对应的坐标轴上,在该投影交线上进行相交测试与在原交线上进行相交测试是等效的,所以此时 \(p_0,p_1\) 即为 V0 和 V1 上对应坐标轴的分量。同理可求出 t2,t3 ,t4,两交线段为 t1t2 和 t3t4。

共面相交

  判断共面相交,相当于判断 2 维中两三角形是否相交,先将三角形投影到 XOY,XOZ,YOZ 平面中投影面积最大的平面(为避免计算面积,可直接令三角形顶点坐标中对应法向向量中绝对值最大的分量为 0,即若法向向量中绝对值最大的分量为 y,则将三角形投影到 XOZ 平面),判断投影后的两三角形是否相交即可,因为此时的两三角形相交,当且仅当其投影三角形相交。2 维中两三角形是否相交,论文中方法是先判断两三角形的边是否相交,即相当于判断 9 组线段是否相交,若存在一组相交,则两三角形相交,若都不相交,则需要判断其中一个三角形是否被另一个三角形包含,具体判断方式取三角形 A 中一顶点,若该顶点在三角形 B 内(判断 2 维中点在多边形内的方法同样可参考「计算几何基础」),则说明三角形 A 在 B 内,同样也需要判断 B 是否在 A 内,若都不在,则两三角形不相交,否则两三角形相交。当然,也可以直接通过分离轴理论来判断两三角形是否相交,毕竟,这就是在 2 维中,而且三角形算是天然的凸多边形。

后记

  三角形是图形学中组成面的基本单元,图形学中面与面的碰撞检测都可以很粗暴的用三角形相交来实现,只不过直接一个个判断效率有点低就是了,所以一般会借助一些基于的树和包围盒空间加速结构,或者针对某种形状的特殊方法,这又是新的方法系列了。