1. 程式人生 > >[演算法]3D三角面片與包圍盒相交交點求法

[演算法]3D三角面片與包圍盒相交交點求法

最近在研究複製包圍盒內相交網格的問題,有一個要解決的難題就是獲得一個任意三角面片與指定包圍盒的交點。現將問題簡化為2D空間,

假設現有三角形面片ABC(以下都簡稱ABC):, 包圍盒DEFG,

那麼三角面與包圍盒的位置關係有幾種:

ABC一個點在包圍盒內部:

ABC兩個點在包圍盒內部

ABC3個點都在包圍盒內部

ABC3個點都在包圍盒外部,但仍有相相交


對於以上各種姿勢,我們現在要用一個統一的演算法,求出相交的多邊形頂點。如下綠色多邊形的4個頂點:

對於程式演算法,求圖形相交的基本思想是:逐面篩選。對包圍盒6個面(這邊簡化為2D,只有上下左右4個),我們將它視為無限擴充套件的平面(因為程式和數學表現無限平面很簡單),並給它一個向外的法線方向,以判斷點相對於平面的位置。在此基礎上,我們開始演算法流程:

1:建立表達多邊形的資料結構Polygon類,存放多邊形每個頂點資訊。平面的類Unity自帶Plane類,並封裝了相關計算函式。

2:建立初始多邊形 = 三角面ABC

3:對每個面,我們計算輸入的多邊形被面切割後的新多邊形,如對於面GF,

, 

切割後,算出的新多邊形為HICB


這樣每個面都切割篩選一遍後,就能得到最終相交的多邊形HIJK

對其他任意姿勢,這個方法都能得到正確的相交多邊形。擴充套件到3D空間同樣適用。