BRep Shapes Based on Tessellated Geometry
eryar@163.com
Key Words. BRep Shape, Tessellated Geometry, Mesh, STL
1. Introduction
OCCT的TopoDS允許定義只包含顯示數據的BRep體,如只包含邊的顯示數據:多段線;面的顯示數據:網格,而不包含幾何曲線和曲面。只包含顯示數據的BRep體有時候很有用,如只需要顯示一下而不對其做任何修改。但是OCC7.3.0版本之前是不支持這些顯示數據的。這里說的不支持的意思是不支持顯示數據的功能,如不能顯示只包含顯示數據的BRep體等等。
OCC7.3.0版本之后陸續想添加對只包含顯示數據的BRep的支持,包括如下功能:
l 計算包圍盒;
l 計算網格面積;
l 計算兩個BRep之間的距離;
l 計算HLR(隱藏線消除);
相關的內容在其官網上,網址: https://tracker.dev.opencascade.org/view.php?id=28125
2. Display Mesh
OCC中支持的網格文件只有STL文件,在Draw Test Harness中提供了讀取STL文件的命令readstl,命令參數如下圖所示:
Figure 1. Draw readstl command
第一個參數shape是讀取STL生成的BRep名稱;
第二個參數file是STL文件名;
第三個參數triangulation是可選參數,如果輸入triangulation,則采用新的方式即直接生成網格;否則采用原來的方式,即將網格的每個三角形生成一個TopoDS_Face;
下面將這些命令寫在一個Tcl腳本文件中,把OCC數據data文件夾中的STL文件進行顯示,
pload ALL
readstl s [pwd]/data/stl/bearing.stl triangulation
vdisplay s
下面對上述腳本進行解釋。
第一行pload ALL是加載OCC所有的腳本命令;
第二行使用readstl命令,且設置成triangulation讀取模式;
第三行是在三維視圖窗口中顯示讀取的STL模型;
直接在Draw Test Harness中輸入上述命令也可以,反正只有幾行。或者把這幾行命令保存成一個文件,再使用source命令來加載也可以。下面是在3D Viewer中顯示讀取的STL模型:
Figure 2. Shaded STL model in 3D Viewer
使用快捷鍵S/W來切換顯示模式,S表示Shaded,是著色渲染模式;W表示Wireframe,是線框顯示模式。下圖為切換到線框顯示模式的效果:
Figure 3. Wireframe STL model in 3D Viewer
從上圖可知,采用直接顯示網格的方式顯示的STL模型在線框模式的時候,效果不是很理想。一般的三維軟件對于這種網格的線框模式就是直接顯示每個三角形。如下圖所示:
Figure 4. Wireframe of the STL model
所以,如果有需要在OCC中顯示STL模型的線框,則需要自己再作處理,可以選擇一些邊加到BRep體中,不一定像上圖所示那樣顯示每一個網格三角形。
3. Source Code
根據原來介紹的通過Draw的命令查找其源實現的方法,找到readstl命令的源碼在文件XSDRAWSTLVRML.cxx中,源碼如下所示:
//=============================================================================
//function : readstl
//purpose : Reads stl file
//=============================================================================
static Standard_Integer readstl(Draw_Interpretor& theDI,
Standard_Integer theArgc,
const char** theArgv)
{
if (theArgc < 3)
{
theDI << "wrong number of parameters" << "\n";
return 1;
}
else
{
if (theArgc == 4 &&
strcmp("triangulation", theArgv[3]) == 0)
{
// Read STL file to the triangulation.
Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (theDI, 1);
Handle(Poly_Triangulation) aTriangulation = RWStl::ReadFile (theArgv[2], aProgress);
TopoDS_Face aFace;
BRep_Builder aB;
aB.MakeFace(aFace);
aB.UpdateFace(aFace, aTriangulation);
DBRep::Set(theArgv[1], aFace);
}
else
{
TopoDS_Shape aShape;
Standard_DISABLE_DEPRECATION_WARNINGS
StlAPI::Read(aShape, theArgv[2]);
Standard_ENABLE_DEPRECATION_WARNINGS
DBRep::Set(theArgv[1], aShape);
}
}
return 0;
}
當使用選項triangulation時,采用新的讀取STL函數得到網格數據,再用BRep體的底層函數生成一個TopoDS_Face,直接將網格數據aTriangulation設置在Face中。
當不使用選項triangulation時,還是采用老的方式來讀取STL模型。老的方式讀取速度慢,且將網格中每個三角形生成一個TopoDS_Face,占用大量內存,是效率不高的方式,所以標記為作廢狀態。開發者應盡量采用新的方式。
4. Conclusion
從OCC7.3版本開始支持只包含顯示數據的BRep體,這樣只包含顯示數據的BRep體可以直接顯示,與原來的將網格數據中的每個三角形都生成TopoDS_Face的方式相比,將會大大提高顯示效率。
因為網格數據中沒有包含線框的信息,所以直接顯示的網格模型切換到線框模式的效果不好,有時甚至不顯示線框。
Figure 5 Propeller STL model
上圖所示的STL螺旋槳模型切換到線線框模式后,就沒有了。這時OCC的選擇功能也不能使用,即選不中這個模型了。
如果要顯示網格模型的線框,需要自己根據實際情況添加一些Edge以達到理想效果。
5. References
1. https://tracker.dev.opencascade.org/view.php?id=28125
為了方便大家在移動端也能看到我的博文和討論交流,現已注冊微信公眾號,歡迎大家掃描下方二維碼關注。