PaperRead - Efficient Booleans algorithms for triangulated meshes of geometric modeling
PaperRead - Efficient Booleans algorithms for triangulated meshes of geometric modeling
目錄
Jiang X, Peng Q, Cheng X, et al. Efficient Booleans algorithms for triangulated meshes of geometric modeling[J]. Computer-aided Design and Applications, 2016, 13(4): 419-430.
更多introduction的介紹可以直接看原文,這裡主要介紹文中使用的具體實現。
2. Methods
更個過程分為兩個階段:兩個mesh之間的相交檢測和布林運算。如下圖Fig2。
這篇文章的主要貢獻點如下:
- 利用八叉樹對兩個網格的公共空間進行劃分,以加快交叉點檢測的速度,減少記憶體佔用;
- 分析了浮點運算誤差和交叉口奇異性,提高了演算法的穩定性;
- 為了實現並、交、差運算,提出了基於相交三角形的穩定技術。該方法對封閉網格和開放網格都是快速的;
- 該演算法具有較強的魯棒性,可用於含有大量布林差分運算的銑削模擬系統中;
2.1 相交檢測
相交檢測在布林運算中是很重要的一布。
2.1.1 Building Octree of the common space
對於兩個相交的mesh而言,相交部分的空間的大小是小的。octree能夠利用空間劃分加速相交測試。
給定兩個網格\(S_A\)和\(S_B\)。\(Box_A\)和\(Box_B\)分別為\(S_A\)和\(S_B\)的最小AABB。公式如下:
\[Box_A = \bigg ( \begin{array}{l} x_{Amax},y_{Amax},z_{Amax} \\ x_{Amin}, y_{Amin}, z_{Amin} \end{array} \bigg ) \]
\(Box_B\)可以用相同方式計算。兩個的交集如下:
\[Box_A \cap Box_B = \bigg ( \begin{array}{l} min(x_{Amax}, x_{Bmax}), min(y_{Amax}, y_{Bmax}), min(z_{Amax}, z_{Bmax}) \\ max(x_{Amin}, x_{Bmin}), max(y_{Amin}, y_{Bmin}), max(z_{Amin}, z_{Bmin}) \end{array} \bigg ) \]
為了保證能夠把相交三角形都包含在內部,對上面的式子進行了擴充套件,如下:
\[Box_A \cap Box_B = \bigg ( \begin{array}{l} min(x_{Amax}, x_{Bmax}) + l, min(y_{Amax}, y_{Bmax}) + l, min(z_{Amax}, z_{Bmax}) + l \\ max(x_{Amin}, x_{Bmin}) - l, max(y_{Amin}, y_{Bmin}) - l, max(z_{Amin}, z_{Bmin}) - l \end{array}\bigg ) \]
其中\(l\)為\(S_A\)和\(S_B\)中的最長邊。
2.1.2 Floating point arithmetic errors and singularity of intersections
這一節主要介紹了浮點型計算精度引發的一些問題。
2.1.3 計算相交線
相交線計算的時候需要考慮兩種情況,共面還是不共面,針對共面問題,可以轉換為2D 三角形相交問題。這裡主要介紹不共面時候相交線的計算。
通常情況下,有三種相交情況(如下圖所示):
- 交點為頂點,EndP;
- 在邊上有一個檢點,EdgeP;
- 面內有一個交點,FaceP;
三種交點的權重比為:EndP > EdgeP > FaceP
。
演算法的詳細虛擬碼如下:
Algorithm 1 Calculate intersection lines
for each pair of triangles (T1, T2) do
for each edge e \in T1 do
m = Intersection(e, T2);
if (exist_intersection(e, T2) && m* = Intersection(e, T2))
Properties(m) = Properties(m*) = Priority(m,m*)
Coordinate(m*) = Coordinate(m)
end for
for each edge e \in T2 do
m = Intersection(e, T1)
if (exist_intersection(e, T1) && m* = Intersection(e, T1))
Properties(m) = Properties(m*) = Priority(m,m*)
Coordinate(m*) = Coordinate(m)
end for
end for
2.1.4. 對相交三角形重新三角化
相交的三角形上,通常會有多個相交線段,這些相交線段將三角形劃分為多個多邊形面。(如何劃分??)接下來這些多邊形需要被三角化。
- Recursive ear cutting algorithm很簡單容易實現,但是效能比較差,不容易擴充套件處理空洞的情況;
- incremental randomized演算法,效能不錯,但不容易實現;
- sweep line演算法是當前使用最廣泛的實現,文中採用了Poly2Tri(Wu L.: Poly2Tri: Fast and Robust Simple Polygon Trian-gulation With/ Without Holes by Sweep Line Algorithm,http://sites-final.uclouvain.be/mema/Poly2Tri/, 2005.),相關程式碼實現:https://github.com/greenm01/poly2tri
2.2 布林運算
文中的方法分為兩部分:
- 區分一個點是mesh內部的還是外部的;
- 建立sub-meshes,然後進行merge;
本文中僅對屬於相交三角形的點進行了區分。
2.2.1. Point classify
假設mn為\(\Delta abc\)和\(\Delta def\)的交線。這兩個三角形分別屬於不同的mesh。\(n_{abc}\)和\(n_{def}\)分別是\(\Delta abc\)和\(\Delta def\)的法向量,具體為\((x_{n1}, y_{n1}, z_{n1})\), \((x_{n2}, y_{n2}, z_{n2})\)。\(p(x_1,y_1,z_1)\)和\(q(x_2,y_2,z_2)\)分別是\(\Delta abc\)和\(\Delta def\)的上面的一個點。那麼平面方程如下:
\[F_{abc}(x,y,z) = (x-x_1)x_{n1} + (y-y_1)y_{n1} + (z-z_1)z_{n1} = 0 \\ F_{def}(x,y,z) = (x-x_2)x_{n2} + (y-y_2)y_{n2} + (z-z_2)z_{n2} = 0 \]
上圖中,兩個三角形相交於m,n點,對a,c,e,d點的內外位置進行判斷。a位於包含\(\Delta def\)的mesh的內部,d位於包含\(\Delta abc\)的mesh的內部。c,e點位於外部。對於退化的相交場景,至少一個三角形的一個點在另一個三角形對應的mesh上。當相交三角形的所有頂點都進行了判斷,分別標記了“in”,“out”,“on”,下面就要進行sub-meshes的建立。
2.2.2. create sub-meshes and merging them
不同型別的mesh定義:
- \(M_A\), \(M_B\)待處理的兩個mesh;
- \(M_{AinB}\),來自\(M_A\)位於\(M_B\)內部的三角形集合;
- \(M_{AoutB}\),來自\(M_A\)位於\(M_B\)外部的三角形集合;
- 同理定義:\(M_{BinA}, M_{BoutA}\);
- \(M_{onAB}\):同時屬於\(M_A\), \(M_B\)的網格(共面相交的時候);
那麼不同布林操作的結果如下:
- \(M_A \cup M_B (union):\ M_{AoutB} + M_{BoutA} + M_{onAB}\)
- \(M_A \cap M_B (intersection): \ M_{AinB} + M_{BinA} + M_{onAB}\)
- \(M_A - M_B(difference):\ M_{AoutB} + M_{BinA}\)
具體虛擬碼類似如下:
計算過程示意圖如下: