![d1ae39d07a0094753e82f008ebe101b3.png](https://img-blog.csdnimg.cn/img_convert/d1ae39d07a0094753e82f008ebe101b3.png)
![e04be0c64bc342ee0c35a4ba061e5c4e.png](https://img-blog.csdnimg.cn/img_convert/e04be0c64bc342ee0c35a4ba061e5c4e.png)
Voorhies(1992)[1]提出一种判断三角形与长方体是否相交的算法,Green和Hatch(1995)[2]扩展了该算法的用途,使得该算法能判断任意多边形与长方体之间是否重叠。该算法通过3个重叠检测来判定:1)检测多边形的顶点是否在长方体内,若至少存在一个这样的顶点,说明它们重叠;2)检测多边形的边是否与长方体相交,若至少存在一条这样的边,说明它们重叠;3)检测长方体的四条对角线是否与多边形相交,若至少存在一条这样的对角线,说明它们重叠。相反,若一个多边形通过了3个检测步骤,说明它们是分离的。可以在网上找到该算法的C++实现代码[4]。
Akenine-Möller(2001)[3]提出了一种基于分离轴理论的算法,该算法具有更高的效率,本篇文章将对这种算法进行详细的介绍,最后介绍该算法的实现。
文章目录:
- 算法介绍
- 源码实现
- 参考
算法介绍
三角形
跟线段与包围盒的重叠检测类似,把三角形的三个端点,沿着有向包围盒的三条轴方向做投影:
其中
![eab15f3b00b13337cd332ede01d49bfb.png](https://img-blog.csdnimg.cn/img_convert/eab15f3b00b13337cd332ede01d49bfb.png)
如图1所示,基于分离轴理论,需要对下面的13条轴线进行检测:
- i. [3个检测]
,分别是轴对齐包围盒的3条轴线。
- ii. [1个检测]
的法线
;
- iii. [9个检测]
,其中
,
,
,
。
对于第i种情况,以轴
对于第ii种情况,判断
对于iii种情况,以
把
如果
对于其它8条轴的检测方法,也是类似的。但为了能顺利的完成算法的实现,这里描述两条重要的结论:
- i.
,
;
- ii. 对于
,
;对于
,
;对于