将线条包覆到模型(wrap curve to shape,可阅读我写的高级算法模型包覆算法)或计算铣削等路径时,一般会先获取模型的网格数据,而网格精度和质量会影响计算结果。
不管是opengl、OpenCASCADE,还是vtk等等,显示原理都是将原始曲面离散成很多的三角面进行显示,三角网格越密越顺滑显示越逼真,但也对电脑硬件有更高的要求。
OpenCASCADE在对TopoDS_Shape显示时,就是先对其进行了离散,离散数据会保存在模型中,因此可以直接读取。代码如下。
for (TopExp_Explorer ex(shape, TopAbs_FACE); ex.More(); ex.Next()) { const TopoDS_Face& F = TopoDS::Face(ex.Current()); TopLoc_Location L; Handle(Poly_Triangulation) facing = BRep_Tool::Triangulation(F, L); if (!facing.IsNull()) { //顶点 gp_Trsf aTrsf = L.Transformation(); for (Standard_Integer i = 1; i <= (facing->NbNodes()); i++) { gp_Pnt pnt = facing->Nodes().Value(i).Transformed(aTrsf);//获取顶点坐标 } //三角 for (Standard_Integer i = 1; i <= (facing->NbTriangles()); i++) { const Poly_Triangle& trian = facing->Triangles().Value(i); Standard_Integer index1, index2, index3; trian.Get(index1, index2, index3);//获取三角顶点索引 } } }
默认情况下,为了显示效率,网格划分精度会比较低,如果想获取较高的精度,可以调用OpenCASCADE的网格划分函数。如下:
TopoDS_Shape shape=...;//模型 Double deflection = ...;//网格精度 BRepMesh_IncrementalMesh(shape, deflection);
更多精彩请关注公众号