最近在研究复制包围盒内相交网格的问题,有一个要解决的难题就是获得一个任意三角面片与指定包围盒的交点。现将问题简化为2D空间,
假设现有三角形面片ABC(以下都简称ABC):, 包围盒DEFG,
那么三角面与包围盒的位置关系有几种:
ABC一个点在包围盒内部:
ABC两个点在包围盒内部
ABC3个点都在包围盒内部
ABC3个点都在包围盒外部,但仍有相相交
对于以上各种姿势,我们现在要用一个统一的算法,求出相交的多边形顶点。如下绿色多边形的4个顶点:
对于程序算法,求图形相交的基本思想是:逐面筛选。对包围盒6个面(这边简化为2D,只有上下左右4个),我们将它视为无限扩展的平面(因为程序和数学表现无限平面很简单),并给它一个向外的法线方向,以判断点相对于平面的位置。在此基础上,我们开始算法流程:
1:建立表达多边形的数据结构Polygon类,存放多边形每个顶点信息。平面的类Unity自带Plane类,并封装了相关计算函数。
2:创建初始多边形 = 三角面ABC
3:对每个面,我们计算输入的多边形被面切割后的新多边形,如对于面GF,
,
切割后,算出的新多边形为HICB
这样每个面都切割筛选一遍后,就能得到最终相交的多边形HIJK
对其他任意姿势,这个方法都能得到正确的相交多边形。扩展到3D空间同样适用。