opencascade - 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 的交集
提前感谢您的帮助!
解决方案
据我了解,您目前的做法是:
- 在点云中创建一个
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 样条曲面。这可以在GeomPlate或SSP(Surface from Scattered Points)算法的帮助下完成。近似曲面更适合 B-Rep 几何定义,但可能会丢失原始曲面的一些细节并且可能难以应用(您可能需要将复杂曲面拆分为多个部分)。
- 使用OMF 产品(网格框架)对网格执行布尔运算。如果您只需要对网格进行布尔运算,OMF 可能会有所帮助。
推荐阅读
- sql - 在 BigQuery 中交叉应用历史日期范围
- powerbi - 加入 Power BI 数据模型中的主键是否会对性能或 DAX 产生影响?
- complexity-theory - 寻找算法时间复杂度的算法
- mysql - gorm 是否支持同一字段上的多个索引?
- javascript - JSON 数据错误,无法读取未定义的属性
- javascript - React with D3 - 只渲染新项目而不更新或删除旧项目
- selenium - 在登录和注销功能的 python selenium 测试中获取错误
- python-3.x - 使用 pandas 读取在线数据时出现 HTTP 错误 413
- java - 为什么在 Kotlin var initalizion 中使用大量可变参数会显着增加编译时间?
- excel - VB 代码粘贴为值和源格式