Boolean operations between triangle meshes
eryar@163.com
Abstract. Boolean operations is one of basic and well known on 3D models. The operations are widely used in computer graphics, game, CAD, EDA. The blog introduce the function in some open source program.
Key Words. Boolean Operations, Mesh, Triangle Mesh Boolean Operations,
1.Introduction
OpenCASCADE提供了基于BREP體的Boolean Operations,但是如果Topo體中只包含三角網(wǎng)格信息的話,是不支持布爾運算的。典型的例子就是由STL導(dǎo)入生成的模型在OpenCASCADE中是不能進行布爾運算。
有一些開源庫提供了基于三角網(wǎng)格的布爾運算的功能。如MeshLab、Cork等。本文主要就來介紹一下這兩個庫中的基于三角網(wǎng)格的布爾運算功能。

Figure 1. Boolean Operation cut between Cylinder and Torus mesh
基于網(wǎng)格有布爾運算主要應(yīng)用于沒有幾何信息的模型,如游戲、3D打印中的網(wǎng)格模型。
2.MeshLab CSG
MeshLab中提供了網(wǎng)格的布爾運算功能,源碼在filter_csg中。程序界面如下圖所示:

Figure 2. CSG Operation in MeshLab
下圖所示為兩個網(wǎng)格球的公共部分Intersection的結(jié)果:

Figure 3. Intersection between sphere meshes
由上圖可以看出,經(jīng)過布爾運算后,網(wǎng)格變密了。

Figure 4. Union between sphere meshes
上圖所示為兩個網(wǎng)格球的合并union結(jié)果。合并后的網(wǎng)格也變密了。

Figure 5. Difference between sphere meshes
3.Cork
Cork是一個小巧的用于網(wǎng)格布爾運算的開源庫(LGPL),可以從如下地址下載:
https://github.com/gilbo/cork
下面使用cork編譯出來的程序來測試下前面兩個球的網(wǎng)格。在Windows中可以編譯一個測試的應(yīng)用程序,可以輸入命令來測試效果:

Figure 6. Cork help info
將測試文件ballA.off和ballB.off復(fù)制到編譯出來的程序wincork相同的文件夾中,分別輸入以下命令來得到相應(yīng)的布爾運算結(jié)果:
F:\Mesh\cork\win\wincork\>wincork -union balla.off ballb.off union.off
F:\Mesh\cork\win\wincork\>wincork -diff balla.off ballb.off diff.off
F:\Mesh\cork\win\wincork\>wincork -isct balla.off ballb.off isct.off
然后將生成的union.off、diff.off和isct.off在MeshLab中打開如下圖所示:

Figure 7. Union between two sphere meshes

Figure 8. Difference between two sphere meshes

Figure 9. Intersection between two sphere meshes
從上面結(jié)果可以看出cork庫得到的結(jié)果網(wǎng)格效果好,沒有加密。
4. Conclusion
基于網(wǎng)格的布爾運算也是三維建模中一個基本功能,一些開源庫提供了對網(wǎng)格進行布爾運算的支持。如MeshLab, Cork, CGAL等。
本文通過在MeshLab和Cork中對兩個球的網(wǎng)格進行布爾運算,對比運算的結(jié)果,發(fā)現(xiàn)使用Cork得到的網(wǎng)格沒有加密,數(shù)據(jù)量會小一些。
由于OpenCASCADE目前的版本不支持基于網(wǎng)格的布爾運算,在其官網(wǎng)上提供了一個功能請求:https://tracker.dev.opencascade.org/view.php?id=29776

為了方便大家在移動端也能看到我的博文和討論交流,現(xiàn)已注冊微信公眾號,歡迎大家掃描下方二維碼關(guān)注。
