第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::SetTolerance、SetMaxDegree、SetMaxSegments:精度与逼近控制;- 多截面支持
WithContact(截面贴合 spine)/WithCorrection(自动旋转对齐)。
5. 放样 BRepOffsetAPI_ThruSections 与 BRepFill_Generator
ThruSections 是 wire 列表 → 体;BRepFill_Generator 是 wire 列表 → 多张面(不封口),适合做带状曲面。
提示:放样时 wire 起点/方向必须一致,可用 BRepBuilderAPI_FindPlane 查找平面,或以共享起点重新构造 wire。
6. 直纹与平移 BRepFill
BRepFill_FaceAndEdges、BRepFill_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_NSections、GeomConvert_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_Sphere、Bnd_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::SplitBSplineCurve、ShapeFix_Face修复; - 过密节点:
Geom_BSplineSurface::RemoveUKnot/RemoveVKnot; - 退化点:
ShapeFix_Wireframe; - 重复控制点:
GeomLib_Tool::ComputeDeviation检测; - 不一致参数化:
BRepLib::SameParameter。
11. 高级特征
BRepFeat_SplitShape:用曲面/曲线分割壳/面,常用于面分区;BRepProj_Projection:把 wire 投影到 shape,作为后续操作的“描线”;BRepBlend_*:底层混合面构造(圆角/桥接的核心);BRepFill_OffsetAncestors:跟踪偏置后面的来源。
12. 二维图形与曲线
Geom2dGcc、GccAna、GccEnt:相切构造(直线-圆-圆相切等);Geom2dHatch:图案填充与 hatch;Geom2dAPI_InterCurveCurve:2D 求交;BRepBuilderAPI_MakeFace+ 2D wire 转 3D:用于剖面图。
13. 性能注意
- 高阶 NURBS 求交极慢,能 G2 就不要 G3;
- 控制点过密会让 BOP 失败概率上升;
- 优先使用解析曲面/曲线,必要时再降级到 BSpline;
RemoveKnot/InsertKnot调整节点能显著提升稳定性。
14. 实战:基于点云重建曲面
- 用
RWPly读入点云; - 网格化(不在 OCCT 内,使用外部工具)得到三角网;
- 用
GeomAPI_PointsToBSplineSurface拟合主控片; BRepFill_Filling填补孔洞;ShapeFix_Shape+ShapeUpgrade_UnifySameDomain整理。
15. 调试技巧
mksurface s f+dump s检查曲面控制点;unifysamedom命令清理同曲面面;valuesurface u v输出某点位置;splitshape验证分割是否成功;- 出现
ConstructionError时检查参数顺序与曲线方向。
自由曲面是 OCCT 应用的难点之一,但理解了 NURBS 体系与 fill/sweep/loft 三大利器后,便能解决绝大多数工程曲面问题。下一章我们关注性能与并发优化。