首页 > 解决方案 > opencascade BRepOffsetAPI_Sewing 很慢

问题描述

我有相当大的文件,带有 3D 扫描点(200.000 ish),并尝试使用 BRepOffsetAPI_Sewing 制作 TopoDS_Shape

gp_Pnt p1(0,0,100);
...
TopoDS_Edge e1 = BRepBuilderAPI_MakeEdge( p4, p1);
...
TopoDS_Wire w1 = BRepBuilderAPI_MakeWire(e1, e2, e3, e4);
...
TopoDS_Face f1 = BRepBuilderAPI_MakeFace(w1);
...
BRepOffsetAPI_Sewing sew(0.1);
sew.Add(f1);sew.Perform();TopoDS_Shape sewedShape = sew.SewedShape();

上面代码中的所有点都包含在循环中,这只是我尝试创建事物的一个示例。

使用 200.000 点生成面部需要 20-30 秒。

我的下一个方法是在生成后保存生成的形状并稍后加载它作为一种解决方法。

BRepTools::Write(sewedShape, sFile);

但即使这样也很慢。我在 Java3D 中做过类似的事情,而且速度更快。所以我做错了。

只显示点

Handle_Graphic3d_ArrayOfPoints points3d = new Graphic3d_ArrayOfPoints(totPoints, true, false);
gp_Pnt pnt(x, y, z);
points3d->AddVertex(pnt, aColor); // adding 200.000 points
Handle(AIS_PointCloud) m_points = new AIS_PointCloud();
m_points->SetPoints(points3d);
m_occView->getContext()->Display(m_points, true);

几乎是瞬间(不到一秒)

我的目标是构建其中 2 个面孔并找到与 OCBRepAlgoAPI_Section 的交集

提前感谢您的帮助!

标签: opencascade

解决方案


据我了解,您目前的做法是:

  • 在点云中创建一个TopoDS_Face四边形。

为避免不必要的缝纫操作开销,您需要重新考虑工作流程并从头开始创建共享形状。例如,TopoDS_Vertex与其在点云中多次创建同一点,不如创建一个并在连接边/四边形的构造中重用它;这同样适用于TopoDS_Edge建筑。缝纫操作为您做的是查找和修复几何连接面之间的共享信息——这是一项可以完全避免的大量工作。

但是正如您已经指出的那样(通过尝试将生成的形状转储到文件中),将曲面细分映射到 B-Rep 通常是反有效的方法。看看所有这些TopoDS_Vertex, TopoDS_Edge, TopoDS_Wire,TopoDS_Face就可以知道 B-Rep 中需要多少数据结构来映射一个非常单一的三角形或四边形。这种结构不仅从内存利用率的角度来看很重,而且对于您可能想要使用它的算法(如布尔运算)也是如此。

可能的替代方案:

  • Poly_Triangulation从您的点云创建一个并从中创建一个TopoDS_Face。您将能够在 3D 查看器中有效地对其进行可视化并执行一些操作,例如计算表面积。不幸的是,所有 OCCT 算法尚不支持此类几何定义,因此您将无法执行布尔运算。
  • 从点云创建一个近似的 B 样条曲面。这可以在GeomPlateSSP(Surface from Scattered Points)算法的帮助下完成。近似曲面更适合 B-Rep 几何定义,但可能会丢失原始曲面的一些细节并且可能难以应用(您可能需要将复杂曲面拆分为多个部分)。
  • 使用OMF 产品(网格框架)对网格执行布尔运算。如果您只需要对网格进行布尔运算,OMF 可能会有所帮助。

推荐阅读