
圖片是做的一些測試結果(相交面為紅色標記的三角面)
感謝CSDN社區的馮瑋提供的基礎技術支持。相關鏈接
對空間中三角面的相交檢測,基本思路是怎樣確定,兩個空間三角形,各個頂點間的關系。為了找到切入點,將問題轉述為三角形與包含另一個Triangle所在的平面之間的關系。
要判斷三角形與平面的關系,可以通過頂點與平面的關系來區分不同的情況,分別進行處理。
給定空間四個點:a(ax,ay,az),b=(bx,by,bz),c=(cx,cy,cz),d=(dx,dy,dz),定義行列式如下:

//線性變換
通過計算行列式的值來判斷點與面的關系,行列式的值>0是在平面法向正方向的一側,<0在平面的另一側,=0則表示在平面上。
如此通過計算三頂點與平面的位置關系可以將空間中三角形與平面的關系粗分為三種,在平面上(行列式的值全 > 0),在平面下(行列式的值全 < 0),與平面有關聯(行列式的值有異號)。

//思維導圖
這樣可以知道兩三角面相交,只在滿足“與平面有關聯”的條件下。
在“有關聯的條件下”,又存在“分居兩側”、“一點在面上”、“與平面重合(同一平面)”、“一邊在面上的情況”(這里我們暫且先把一邊在面上的情況歸並到分居兩側的情況)。
一、針對“一點在面上”的情況,進行點在三角形內的判斷(包含點在邊上,點與頂點重合的情況(對3D模型上三角面的處理,要對這兩種情況給出處理方法))
給出兩種方法處理判斷“點在三角形內”的情況
1.同向法(點與三邊的關系)
2.重心法(向量法)
具體參考:這里
二、針對“同一平面”的情況,進行線段相交的檢測,及完全重合情況的處理
空間中線段相交的處理,與平面上的線段相交處理沒有關系。
1、做三個坐標面的投影,利用叉積去進行判斷
2、可以進行坐標的仿射變換代替針對要做坐標面的投影,即平面的旋轉(沒有實現,有經驗的話,望聯系)
三、針對“分居兩側”的情況,上述參考博客的情況中,有些情況未能處理(未能檢測面片(精度的問題?)文件會附文末github地址中)
1、采用上述博文中提到的方法
2、采用直線與平面的交點,判斷交點是否在線段上、三角形內
上面簡述了,空間中任意兩個三角面的相交判定,針對3D模型並未涉及。因為3D模型中面與面間存在的大量相鄰關系。就要針對這些情況寫出處理方法。
首先針對“一點在面上”的情況,討論了點在邊上,點與其中的一個頂點重合的情況。這兩種情況應做return NONINTERSECT;其他的都是一些細節編碼。
相關參考文件地址
