1. 程式人生 > 實用技巧 >PaperRead - Efficient Booleans algorithms for triangulated meshes of geometric modeling

PaperRead - Efficient Booleans algorithms for triangulated meshes of geometric modeling

PaperRead - Efficient Booleans algorithms for triangulated meshes of geometric modeling

目錄

https://www.researchgate.net/publication/290466350_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。

這篇文章的主要貢獻點如下:

  1. 利用八叉樹對兩個網格的公共空間進行劃分,以加快交叉點檢測的速度,減少記憶體佔用;
  2. 分析了浮點運算誤差和交叉口奇異性,提高了演算法的穩定性;
  3. 為了實現並、交、差運算,提出了基於相交三角形的穩定技術。該方法對封閉網格和開放網格都是快速的;
  4. 該演算法具有較強的魯棒性,可用於含有大量布林差分運算的銑削模擬系統中;

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}\)

具體虛擬碼類似如下:

計算過程示意圖如下: