OCCT源码解析(六):TKG3d 模块——三维曲面体系

OCCT源码解析(六):TKG3d 模块------三维曲面体系

继 TKG2d 之后,我们正式进入 OCCT 的重头戏------TKG3d (Toolkit Geometry 3D) 模块。这是承载所有三维 CAD 模型表面的数学内核。如果没有这个包里的 Geom_Surface 及其衍生类,TopoDS_Face 将只是一个空洞的拓扑概念。

本文将按"全景架构 -> 核心接口 -> 数学原理"的逻辑,为您层层剖析 TKG3d 模块的设计脉络。


一、 TKG3d 两大核心继承体系全景

三维几何体系同样遵循 "数据绝对表达" (Geom)与 "算法统一接口"(Adaptor3d)分离的设计哲学。

1. 几何表达树:Geom_Geometry 体系

这是 3D 几何对象的"数据本尊",受智能指针(Handle)管理。与 2D 中的 Geom2d_Geometry 类似,但用于描述三维空间中的几何实体。

text 复制代码
Geom_Geometry (根类)
  ├── Geom_Point (点:定义三维空间中的单个位置)
  ├── Geom_Vector (向量:定义三维空间中的方向和大小)
  ├── Geom_Curve (空间曲线:定义三维空间中的一维流形)
  │   └── Geom_Line / Geom_Conic / Geom_BoundedCurve / Geom_OffsetCurve
  └── Geom_Surface (核心:双参数化曲面,定义三维空间中的二维流形)
      ├── Geom_ElementarySurface (基础曲面:Plane, Cylinder, Sphere, Torus, Cone)
      ├── Geom_SweptSurface (扫掠曲面:Revolution, Extrusion)
      ├── Geom_BoundedSurface (有界曲面:Bezier, BSpline, RectangularTrimmed)
      └── Geom_OffsetSurface (偏移曲面:基于基准曲面在法向偏移一定距离形成)

2. 算法接口树:Adaptor3d 系列

三维算法(如求交、布尔运算、渲染)统一对接 Adaptor3d 接口。注意,3D 适配器分布在多个 Toolkit 中(如 GeomAdaptorBRepAdaptor)。

text 复制代码
Adaptor3d_Surface (曲面算法接口根类:屏蔽不同类型曲面的底层差异)
  ├── GeomAdaptor_Surface (通用包装:包装任意 Geom_Surface 数据)
  │   ├── GeomAdaptor_SurfaceOfRevolution (针对旋转面的特化优化)
  │   └── GeomAdaptor_SurfaceOfLinearExtrusion (针对拉伸面的特化优化)
  └── BRepAdaptor_Surface (拓扑包装:将 TopoDS_Face 封装为算法可算的曲面)

Adaptor3d_Curve (3D 曲线算法接口根类)
  ├── GeomAdaptor_Curve (通用包装:包装任意 Geom_Curve 数据)
  ├── BRepAdaptor_Curve (拓扑包装:将 TopoDS_Edge 封装为算法可算的曲线)
  ├── Adaptor3d_CurveOnSurface (核心:计算面上的 2D 参数线在 3D 空间的位置)
  └── Adaptor3d_IsoCurve (核心:将曲面的等参数线提取为独立曲线)

二、 核心接口设计(相较于 2D 库的特有特点)

与 2D 几何库中仅涉及单参数 uuu 的曲线不同,三维曲面是二维流形,OCCT 在这里引入了双参数 (u,v)(u, v)(u,v) 系统。这使得其核心接口在求导、法向计算以及边界描述上具有独有特点。

1. Geom_Surface:双参数求值与法向量接口

在三维空间中,曲面的求值不仅仅是获取一个点的位置,更重要的是获取该点处的偏导数,从而计算出曲面的法向量。

cpp 复制代码
// 摘自 Geom_Surface.hxx (简化说明)
class Geom_Surface : public Geom_Geometry {
public:
  // 特点1:双参数输入。计算参数 (U,V) 处的 3D 坐标点 P (0阶导数)
  virtual void D0(const Standard_Real U, const Standard_Real V, gp_Pnt& P) const = 0;

  // 特点2:提供 U 和 V 两个方向的偏导数。
  // 注:D1U 叉乘 D1V 即为该点处曲面的法向量方向,这在光照渲染和干涉检查中极为重要。
  virtual void D1(const Standard_Real U, const Standard_Real V, 
                  gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V) const = 0;

  // 特点3:二阶偏导数包含混合偏导 D2UV (用于计算高斯曲率、平均曲率等三维微分几何特性)
  virtual void D2(const Standard_Real U, const Standard_Real V, 
                  gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V, 
                  gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV) const = 0;

  // 特点4:二维参数域范围。返回曲面在 U 和 V 两个维度的自然参数范围
  virtual void Bounds(Standard_Real& U1, Standard_Real& U2, 
                      Standard_Real& V1, Standard_Real& V2) const = 0;
};

2. 特殊的 3D 适配器:降维与切片逻辑

Adaptor3d 体系不仅要包装 3D 几何,还要处理 2D 参数空间到 3D 物理空间的映射转换,这是 TKG3d 相较于 TKG2d 最显著的架构扩展。

① Adaptor3d_CurveOnSurface:降维打击的求值逻辑

这是 BRep 边(Edge)的真实数学底色,是连接 2D 参数空间与 3D 物理空间的桥梁。一条边在 3D 空间看是一条曲线,但在数学上它是"某曲面(Surface)上的一条 2D 参数曲线(Curve2d)"。

cpp 复制代码
// 内部求值逻辑说明 (伪代码)
void Adaptor3d_CurveOnSurface::D0(const Standard_Real U, gp_Pnt& P) const {
  // 1. 调用 2D 适配器,算出该参数 U 对应在参数平面上的 (u, v) 坐标
  gp_Pnt2d uv = myCurve->Value(U);      
  // 2. 将 (u, v) 代入 3D 曲面适配器,算出对应的三维空间 XYZ 坐标
  mySurface->D0(uv.X(), uv.Y(), P);     
}
② Adaptor3d_IsoCurve:曲面的"切片机"

允许开发者通过固定曲面的 uuu 或 vvv 参数,将一个曲面"降维"提取为一条三维空间曲线(等参数线)。这对于生成渲染网格(网格化)或曲面分析尤为重要。


三、 各类几何类型的详细数学原理

三维几何对象的数学表达是整个 TKG3d 的基础。以下逐一介绍各类常见三维曲面的底层数学原理。

1. 基础曲面 (Geom_ElementarySurface)

所有的基础曲面都持有一个局部右手坐标系 gp_Ax3,记作 (O,X⃗,Y⃗,Z⃗)(O, \vec{X}, \vec{Y}, \vec{Z})(O,X ,Y ,Z ),其中 OOO 为原点,X⃗,Y⃗,Z⃗\vec{X}, \vec{Y}, \vec{Z}X ,Y ,Z 为正交基向量。

1.1 平面 (Geom_Plane)

平面是最简单的双参数线性流形。

  • 参数方程 :S(u,v)=O+u⋅X⃗+v⋅Y⃗S(u, v) = O + u \cdot \vec{X} + v \cdot \vec{Y}S(u,v)=O+u⋅X +v⋅Y
  • 参数范围 :u∈(−∞,+∞),v∈(−∞,+∞)u \in (-\infty, +\infty), v \in (-\infty, +\infty)u∈(−∞,+∞),v∈(−∞,+∞)
  • 法向量 :始终等于局部坐标系的 Z 轴方向 Z⃗\vec{Z}Z 。
1.2 圆柱面 (Geom_CylindricalSurface)

以 Z 轴为中心轴,半径为 RRR 的圆柱面。uuu 控制角度,vvv 控制高度。

  • 参数方程 :S(u,v)=O+Rcos⁡(u)X⃗+Rsin⁡(u)Y⃗+vZ⃗S(u, v) = O + R \cos(u)\vec{X} + R \sin(u)\vec{Y} + v\vec{Z}S(u,v)=O+Rcos(u)X +Rsin(u)Y +vZ
  • 参数范围 :u∈[0,2π],v∈(−∞,+∞)u \in [0, 2\pi], v \in (-\infty, +\infty)u∈[0,2π],v∈(−∞,+∞)
  • 周期性 :在 UUU 方向是周期的。
1.3 球面 (Geom_SphericalSurface)

以原点 OOO 为球心,半径为 RRR 的球面。uuu 为经度,vvv 为纬度。

  • 参数方程
    X(u,v)=Rcos⁡(v)cos⁡(u) X(u,v) = R \cos(v) \cos(u) X(u,v)=Rcos(v)cos(u)
    Y(u,v)=Rcos⁡(v)sin⁡(u) Y(u,v) = R \cos(v) \sin(u) Y(u,v)=Rcos(v)sin(u)
    Z(u,v)=Rsin⁡(v) Z(u,v) = R \sin(v) Z(u,v)=Rsin(v)
  • 参数范围 :u∈[0,2π],v∈[−π/2,π/2]u \in [0, 2\pi], v \in [-\pi/2, \pi/2]u∈[0,2π],v∈[−π/2,π/2]
  • 奇点说明 :在两极点 (v=±π/2v = \pm\pi/2v=±π/2) 处,uuu 方向的一阶偏导数退化为零向量。因此 BRep 拓扑算法在处理球体两极时,必须引入"退化边 (Degenerated Edge)"。
1.4 圆锥面 (Geom_ConicalSurface)

由半顶角 α\alphaα 和基圆半径 RRR 定义的圆锥。

  • 参数方程
    S(u,v)=O+(R+vsin⁡(α))(cos⁡(u)X⃗+sin⁡(u)Y⃗)+vcos⁡(α)Z⃗ S(u, v) = O + (R + v \sin(\alpha)) (\cos(u)\vec{X} + \sin(u)\vec{Y}) + v \cos(\alpha)\vec{Z} S(u,v)=O+(R+vsin(α))(cos(u)X +sin(u)Y )+vcos(α)Z
  • 参数范围 :u∈[0,2π],v∈(−∞,+∞)u \in [0, 2\pi], v \in (-\infty, +\infty)u∈[0,2π],v∈(−∞,+∞)
  • 奇点说明 :当半径收敛至锥顶时(对应特定的 vvv 值),同样会产生导数退化的奇点。
1.5 环面 (Geom_ToroidalSurface)

由主半径 RRR 和小圆半径 rrr 定义。

  • 参数方程
    X(u,v)=(R+rcos⁡(v))cos⁡(u) X(u,v) = (R + r \cos(v)) \cos(u) X(u,v)=(R+rcos(v))cos(u)
    Y(u,v)=(R+rcos⁡(v))sin⁡(u) Y(u,v) = (R + r \cos(v)) \sin(u) Y(u,v)=(R+rcos(v))sin(u)
    Z(u,v)=rsin⁡(v) Z(u,v) = r \sin(v) Z(u,v)=rsin(v)
  • 参数范围 :u∈[0,2π],v∈[0,2π]u \in [0, 2\pi], v \in [0, 2\pi]u∈[0,2π],v∈[0,2π],在 U 和 V 方向都是周期的。

2. 扫掠曲面 (Geom_SweptSurface)

扫掠曲面由一条基准曲线(Basis Curve)通过空间运动轨迹生成。

2.1 线性拉伸面 (Geom_SurfaceOfLinearExtrusion)

将基准曲线 C(u)C(u)C(u) 沿给定方向向量 D⃗\vec{D}D 拉伸生成。

  • 参数方程 :S(u,v)=C(u)+v⋅D⃗S(u, v) = C(u) + v \cdot \vec{D}S(u,v)=C(u)+v⋅D
  • 参数说明 :uuu 继承自基准曲线的参数,vvv 表示沿方向向量拉伸的距离参数。
2.2 旋转面 (Geom_SurfaceOfRevolution)

将基准曲线 C(v)C(v)C(v) 绕空间中指定的旋转轴转动形成。

  • 参数说明 :uuu 为旋转角度参数(000 到 2π2\pi2π),vvv 继承自基准曲线。通过 GeomAdaptor_SurfaceOfRevolution 适配器可提供极其高效的数学计算优化。

3. 自由曲面 (Geom_BSplineSurface 与 Geom_BezierSurface)

对于不规则的复杂形态,OCCT 使用 NURBS (Non-Uniform Rational B-Splines) 及其特例 Bezier 曲面来表达,这是现代 CAD 工业建模的绝对主力。

3.1 B样条曲面 (Geom_BSplineSurface)

通过二维控制点网格 Pi,jP_{i,j}Pi,j、对应的权重网格 wi,jw_{i,j}wi,j 以及 uuu 和 vvv 方向的节点向量(Knot Vector)定义。

  • 参数方程 (有理 B 样条):
    S(u,v)=∑i=0n∑j=0mNi,p(u)Mj,q(v)wi,jPi,j∑i=0n∑j=0mNi,p(u)Mj,q(v)wi,j S(u, v) = \frac{\sum_{i=0}^{n} \sum_{j=0}^{m} N_{i,p}(u) M_{j,q}(v) w_{i,j} P_{i,j}}{\sum_{i=0}^{n} \sum_{j=0}^{m} N_{i,p}(u) M_{j,q}(v) w_{i,j}} S(u,v)=∑i=0n∑j=0mNi,p(u)Mj,q(v)wi,j∑i=0n∑j=0mNi,p(u)Mj,q(v)wi,jPi,j
  • 解析 :Ni,p(u)N_{i,p}(u)Ni,p(u) 和 Mj,q(v)M_{j,q}(v)Mj,q(v) 分别是 uuu 方向 ppp 次、vvv 方向 qqq 次的 B 样条基函数。由于采用控制点网格,它提供了局部修改特性的能力,即改变一个控制点只影响曲面的局部形状。
3.2 Bezier 曲面 (Geom_BezierSurface)

可以看作是 B 样条曲面的特例(没有内节点,只有端节点)。

  • 参数方程:使用 Bernstein 多项式作为基函数。
  • 特点:不具有局部控制性,改变任一控制点会影响整个曲面,因此在复杂模型中通常作为被裁剪的小面片存在。

四、 高阶近似与拟合:AdvApprox 体系

在 CAD 的实际运算(如布尔求交、偏移操作、倒角等)中,经常会产生非常复杂的解析几何曲线与曲面。为了统一向下游输出数据,OCCT 需要将这些复杂的几何体"近似"拟合成标准的 NURBS(B 样条)形式。TKG3d 模块中以 AdvApprox_ 为前缀的类群,正是承担这一关键任务的数学引擎。

1. AdvApprox 的核心职责

AdvApprox (Advanced Approximation) 提供了一套高精度的逼近算法,其主要目标是在给定的公差(Tolerance)范围内,用相对简单的多项式(通常是 B 样条曲线/曲面)来拟合任意复杂的参数化几何函数。

  • 数据降维与统一:将求交或投影产生的高维度、高复杂度数据转换为紧凑的标准 B 样条控制点网络。
  • 误差严格控制:算法允许开发者严格设定最大允许偏差,确保拟合后的几何体与真实解析解的偏离度在工业制造标准之内。

2. 关键类与其数学手段

  • AdvApprox_ApproxAFunction :这是整个近似算法的核心执行类。它接受一个待拟合的数学函数(通常包装为特定的 Evaluator 接口),并在满足指定的连续性要求(如 C0,C1,C2C^0, C^1, C^2C0,C1,C2)和精度要求的前提下,计算出近似的 B 样条表达。
  • AdvApprox_PrefAndRec:用于管理参数域的细分规则(Cutting preferences)和精度权重控制的配置类。
  • 底层原理:该体系底层深切依赖于**切比雪夫多项式(Chebyshev Polynomials)**逼近和最小二乘法。通过将复杂函数投影到正交多项式基函数空间,系统能够在尽量减少控制点数量的同时有效抑制龙格现象(Runge's phenomenon),实现高平滑度的曲线曲面重构。

掌握 AdvApprox 的工作机制,是解决 OCCT 中"为什么布尔求交会产生控制点极多的 B 样条"或者"如何优化高级曲面操作产生的冗余几何数据"等高阶疑难问题的必经之路。


五、 跨越鸿沟:TKG3d 几何与 TopAbs 拓扑的羁绊

虽然本篇文档的核心是解析 TKG3d(纯数学几何层),但如果在实际建模中脱离了拓扑(Topology),这些几何曲面将只是无限延伸的数学函数。OCCT 严格遵循了 几何(Geometry)与拓扑(Topology)分离 的底层哲学。为了完整理解 3D 模型是如何被组装的,我们必须前瞻性地引入拓扑体系的核心抽象------TopAbs

1. TopAbs 包的"四大金刚"

TopAbs 包的设计极其克制,它的源码目录下只有这 4 个头文件。它们不包含任何三维坐标或曲面公式,纯粹定义了实体的状态与层级关系:

  • TopAbs_ShapeEnum.hxx (拓扑类型枚举) :定义了 BRep(边界表示法)模型的层级树。包含 VERTEX (顶点)、EDGE (边)、WIRE (线框)、FACE (面)、SHELL (壳)、SOLID (体)、COMPSOLID 以及 COMPOUND。必须明确:这里的 FACE 仅仅是一个枚举标记,它必须与 TKG3d 里的 Geom_Surface 结合,才是一个有形状的"面"。
  • TopAbs_Orientation.hxx (拓扑方向枚举) :定义了 FORWARD(正向)、REVERSED(反向)、INTERNAL(内部)和 EXTERNAL(外部)。
    • 重要意义 :几何曲面的法向量是由其参数方程(D1U×D1VD_1U \times D_1VD1U×D1V)绝对决定的。但同一个圆柱面可以既用来表示外圆柱面(法向朝外),也能表示内孔洞(法向朝内)。TopAbs_Orientation 就是这把翻转法向的"开关",让不同拓扑面可以共享同一个底层几何,极大节省内存。
  • TopAbs_State.hxx (拓扑状态枚举) :定义了 IN(内部)、OUT(外部)、ON(边界上)和 UNKNOWN(未知)。它是 OCCT 高级算法的核心状态量,例如在布尔运算或射线相交(Ray-Tracing)算法中,用于判定一个点或另一条实体相对于当前几何面的位置状态。
  • TopAbs.hxx (包级别工具类) :作为基础工具类,主要提供针对上述枚举的辅助静态函数。例如快速反转一个 Orientation,或者将枚举值进行字符串的互相转换打印等。

2. 拓扑(TopAbs)与几何(TKG3d)的绑定法则

理解了这两者,也就理解了 OCCT 架构的核心机密:
BRep 实体对象 (如 TopoDS_Face)=TopAbs 拓扑外壳 (边界与方向)+TKG3d 数学几何 (底层流形方程) \text{BRep 实体对象 (如 TopoDS\_Face)} = \text{TopAbs 拓扑外壳 (边界与方向)} + \text{TKG3d 数学几何 (底层流形方程)} BRep 实体对象 (如 TopoDS_Face)=TopAbs 拓扑外壳 (边界与方向)+TKG3d 数学几何 (底层流形方程)
TKG3d 提供了无限延伸的画布,而 TopAbs 提供了剪刀。当我们对一个 TopoDS_Face 进行面积计算或网格化时,OCCT 会使用第一小节中提到的 BRepAdaptor_Surface,剥开它的 TopAbs 拓扑外壳,读取其边界,并最终将求值运算委托给 TKG3d 的底层数学接口。


总结

TKG3d 模块通过严密的双参数 (u,v)(u,v)(u,v) 求导体系,统一了从基础解析几何到高阶复杂 NURBS 曲面的底层计算模型。同时,通过引入 CurveOnSurfaceIsoCurve 等适配器(Adaptor3d),完美解决了 2D 参数空间向 3D 物理空间的映射问题;AdvApprox 体系为复杂几何的标准化表达提供了坚实的后盾;而最后引入的 TopAbs 概念,则彻底打通了纯数学几何与 CAD 拓扑实体之间的桥梁。掌握了这五大章节的核心原理,便能深度理解 OCCT 布尔运算、求交以及网格化背后的数学运转逻辑。

相关推荐
:mnong2 小时前
PlayCanvas 开源 WebGL/WebGPU 3D 创作平台分析
3d·开源·webgl
会开花的二叉树2 小时前
Qt初体验-第一个窗口程序踩的坑
开发语言·c++·qt
思麟呀2 小时前
在C++基础上理解CSharp-3
开发语言·c++·c#
Geometry Fu2 小时前
《设计模式》2026编程作业汇总
java·c++·设计模式
十五年专注C++开发2 小时前
QtFluentWidgets: 一套基于C++ Qt Widgets的Fluent Design风格控件库
开发语言·c++·qt·qtfluentwidgets
江屿风2 小时前
【c++笔记】类和对象流食般投喂(下)
开发语言·c++·笔记
熬夜敲代码的猫3 小时前
教你如何使用set和map
c++·算法
Irissgwe11 小时前
类与对象(三)
开发语言·c++·类和对象·友元
️是7812 小时前
信息奥赛一本通—编程启蒙(3395:练68.3 车牌问题)
数据结构·c++·算法