znlgis 博客

GIS开发与技术分享

第15章:曲面建模与自由形状

实体建模(Solid Modeling)解决的是“规整零件”,而真正区分一个 CAD 内核能力的,往往是它对自由曲面(Freeform Surface)的支持。OCCT 在 NURBS、Bezier、扫掠、放样、填充、过渡曲面、形状逼近上有完整体系。本章梳理这些能力。

1. 曲线/曲面的 NURBS 体系

OCCT 用 Geom_BSplineCurve/Geom_BSplineSurface 作为自由形状的“通用语言”:

  • 控制点 Poles(带可选权重 Weights);
  • 节点 Knots 与多重度 Multiplicities
  • 阶数 Degree
  • 周期性、连续性。

GeomConvert::CurveToBSplineCurve(curve, mode) 可把任意 Geom_Curve 转换为 BSpline,便于统一算法处理。GeomConvert::SurfaceToBSplineSurface 同理。

2. 拟合与插值

  • GeomAPI_PointsToBSpline:通过点列拟合,提供阶数范围、连续性、容差;
  • GeomAPI_Interpolate:插值带切矢;
  • GeomAPI_PointsToBSplineSurface:曲面拟合;
  • GeomAPI_ProjectPointOnCurve/Surface:点投影;
  • Approx_Curve3d/Approx_Surf/Approx_BSplCurve/AppDef_*:底层近似引擎。
TColgp_Array1OfPnt pts(1, n);
GeomAPI_PointsToBSpline fit(pts, 3, 8, GeomAbs_C2, 1.e-3);
Handle(Geom_BSplineCurve) c = fit.Curve();

3. 填充曲面 GeomFill / BRepFill

GeomFill_BSplineCurves 用 2/3/4 条边界曲线填充 N 边面(“Coons / Stretch / Curved”):

GeomFill_BSplineCurves f(c1, c2, c3, c4, GeomFill_StretchStyle);
Handle(Geom_BSplineSurface) s = f.Surface();

BRepFill_Filling:以拓扑 face/edge/point 作为约束(边界、内部点、内部曲线)填充任意 N 边洞;

BRepFill_Filling fill;
fill.Add(edge1, GeomAbs_C0);
fill.Add(edge2, GeomAbs_C0);
fill.Add(p1);
fill.Build();

4. 扫掠 BRepFill_Pipe / MakePipeShell

第 9 章已介绍。补充:

  • BRepFill_PipeShell::SetMode(Frenet/CorrectedFrenet/SetMode(Ax2)/SetMode(WireSpine)):截面跟随轨迹的方式;
  • BRepFill_PipeShell::SetToleranceSetMaxDegreeSetMaxSegments:精度与逼近控制;
  • 多截面支持 WithContact(截面贴合 spine)/WithCorrection(自动旋转对齐)。

5. 放样 BRepOffsetAPI_ThruSectionsBRepFill_Generator

ThruSections 是 wire 列表 → 体;BRepFill_Generator 是 wire 列表 → 多张面(不封口),适合做带状曲面。

提示:放样时 wire 起点/方向必须一致,可用 BRepBuilderAPI_FindPlane 查找平面,或以共享起点重新构造 wire。

6. 直纹与平移 BRepFill

  • BRepFill_FaceAndEdgesBRepFill_RuledFace:从两条曲线生成直纹面;
  • BRepFill_Edge3DLaw:让扫掠时半径随 spine 变化;
  • BRepFill_Sweep:通用扫掠引擎;
  • BRepFill_OffsetWire:wire 偏置。

7. 偏置曲面 BRepOffset / Geom_OffsetSurface

整体偏置:第 9 章已述。还可:

  • Geom_OffsetSurface(base, offset):定义性偏置(参数化);
  • BRepOffsetAPI_DraftAngle:拔模;
  • BRepOffsetAPI_NormalProjection:把 wire 投影到面,作为后续切割路径。

8. 过渡曲面与 G-连续性

OCCT 的圆角、GeomFill_NSectionsGeomConvert_ApproxSurface 支持 G1/G2 连续过渡。复杂的 A 级(A-class)曲面通常需要外部专业内核(如 Class A in Alias),OCCT 适合工程级 G2 过渡。

9. 自由曲面分析

  • GeomLProp_SLProps:曲面任意点的法向、主曲率、Gauss/Mean 曲率;
  • GeomAnalysis_Surface/ShapeAnalysis_Surface:参数定位、UV 范围;
  • BRepLProp_SLProps:拓扑面上同上;
  • Bnd_SphereBnd_Box + BRepBndLib:包围体。
GeomLProp_SLProps p(surf, u, v, 2, 1.e-6);
Standard_Real H = p.MeanCurvature();
gp_Vec n = p.Normal();

10. 修复自由曲面

工业数据中常见 NURBS 曲面问题:

  • 自交:GeomConvert::SplitBSplineCurveShapeFix_Face 修复;
  • 过密节点:Geom_BSplineSurface::RemoveUKnot/RemoveVKnot
  • 退化点:ShapeFix_Wireframe
  • 重复控制点:GeomLib_Tool::ComputeDeviation 检测;
  • 不一致参数化:BRepLib::SameParameter

11. 高级特征

  • BRepFeat_SplitShape:用曲面/曲线分割壳/面,常用于面分区;
  • BRepProj_Projection:把 wire 投影到 shape,作为后续操作的“描线”;
  • BRepBlend_*:底层混合面构造(圆角/桥接的核心);
  • BRepFill_OffsetAncestors:跟踪偏置后面的来源。

12. 二维图形与曲线

  • Geom2dGccGccAnaGccEnt:相切构造(直线-圆-圆相切等);
  • Geom2dHatch:图案填充与 hatch;
  • Geom2dAPI_InterCurveCurve:2D 求交;
  • BRepBuilderAPI_MakeFace + 2D wire 转 3D:用于剖面图。

13. 性能注意

  • 高阶 NURBS 求交极慢,能 G2 就不要 G3;
  • 控制点过密会让 BOP 失败概率上升;
  • 优先使用解析曲面/曲线,必要时再降级到 BSpline;
  • RemoveKnot/InsertKnot 调整节点能显著提升稳定性。

14. 实战:基于点云重建曲面

  1. RWPly 读入点云;
  2. 网格化(不在 OCCT 内,使用外部工具)得到三角网;
  3. GeomAPI_PointsToBSplineSurface 拟合主控片;
  4. BRepFill_Filling 填补孔洞;
  5. ShapeFix_Shape + ShapeUpgrade_UnifySameDomain 整理。

15. 调试技巧

  • mksurface s f + dump s 检查曲面控制点;
  • unifysamedom 命令清理同曲面面;
  • valuesurface u v 输出某点位置;
  • splitshape 验证分割是否成功;
  • 出现 ConstructionError 时检查参数顺序与曲线方向。

自由曲面是 OCCT 应用的难点之一,但理解了 NURBS 体系与 fill/sweep/loft 三大利器后,便能解决绝大多数工程曲面问题。下一章我们关注性能与并发优化。