第04章 边界表示法 B-Rep 基本原理

摘要:边界表示法(Boundary Representation,B-Rep)是现代三维几何内核的事实标准表示方案。本文从点集拓扑、代数拓扑与实体造型理论出发,系统阐述 B-Rep 的数学基础、拓扑实体层次、几何支撑机制、欧拉操作体系、合法性条件及其在主流内核中的实现差异。在此基础上,提出 B-Rep 的五元组形式化模型、拓扑—几何双层语义、欧拉操作代数、合法性验证金字塔、容差 B-Rep 扩展模型与复杂度度量方法。上述工具旨在为后续拓扑实体、布尔运算、容差建模、参数化重算与数据交换章节提供统一的理论语言。

关键词:边界表示;B-Rep;拓扑实体;欧拉操作;几何支撑;容差建模;实体造型;CAD 内核

文章目录

4.1 引言:为什么需要 B-Rep

在三维 CAD、CAE 与 CAM 系统中,几何内核承担实体表示、布尔运算、求交、网格划分、质量属性计算与数据交换等底层任务。几何内核的表示方案历经线框、曲面、CSG 与 B-Rep 等阶段,最终形成以 B-Rep 为核心、CSG 为高层语义补充的工业格局。

B-Rep 的基本命题可概括为:

一个正则三维实体由其边界唯一确定;因此,表示实体只需表示其边界。

这一命题的数学依据来自点集拓扑中的 Jordan–Brouwer 分离定理:在 R 3 \mathbb{R}^3 R3 中,一个闭合、紧致、嵌入的二维流形曲面将空间分为内部与外部两个连通分量,实体即内部区域连同其边界。由此,三维实体表示问题可降维为二维边界表示问题:记录哪些面、每条面由哪些边围成、每条边由哪些顶点界定,以及这些面、边、顶点之间的邻接关系。

B-Rep 的工程价值在于表达力与局部性:

  • 表达力:B-Rep 可直接表示解析曲面、NURBS 曲面、修剪曲面与自由曲面边界,适合复杂工业零件。
  • 局部性:修改一个面、添加一个孔或倒角,只影响局部拓扑邻域,适合交互式建模。
  • 可计算性:B-Rep 支持精确质量属性、隐藏线消除、网格划分与布尔运算。

但 B-Rep 也带来复杂性:数据结构层次深、合法性维护困难、浮点误差敏感、容差语义复杂。这些代价催生了欧拉操作、鲁棒谓词、容差建模与形状修复等研究。
本章的创新组织如下:

  1. 提出 B-Rep 五元组形式化模型;
  2. 提出拓扑—几何双层语义与信息分离原理;
  3. 提出欧拉操作代数视角;
  4. 提出 B-Rep 合法性验证金字塔;
  5. 提出容差 B-Rep 扩展模型;
  6. 提出 B-Rep 复杂度度量方法。

4.2 历史演进与学术脉络

B-Rep 的历史与实体造型理论同步发展。

1970 年代,剑桥大学 Ian Braid 在博士论文中系统化 B-Rep 的工程实现,开发了 BUILD-1 系统。其核心贡献是把顶点、边、面等拓扑实体组织为可计算数据结构,并用欧拉操作保证修改后的拓扑合法性。BUILD-1 后发展为 BUILD-2,其思想被 Charles Lang 带入 ShapeData 公司,演化为 Romulus,再进一步发展为 Parasolid。
同期,美国罗切斯特大学 Requicha 与 Voelcker 在 PADL 系统中发展 CSG,形成与 B-Rep 并行的另一流派。1970 年代末至 1980 年代,业界逐渐认识到 CSG 与 B-Rep 互补:CSG 适合表达构造语义,B-Rep 适合表达边界几何与局部操作。现代内核普遍同时支持二者,并在其间转换。
数据结构方面,B-Rep 经历多种变体:

  • 翼边结构:Baumgart 1975 年提出,每条边记录四个邻面邻边,查询灵活但更新复杂。
  • 半边结构:Weiler 1986 年提出,将每条边拆为两个有向半边,简化面内遍历。
  • 辐射边结构:ACIS 采用,支持非流形与任意维度。
  • 双向连通边表:计算几何经典结构,面向平面细分。

1990 年代,STEP 标准将 B-Rep 拓扑层次与几何表示标准化,使 B-Rep 成为跨系统交换的标准表示。此后,OpenCASCADE、Parasolid、CGM、Granite、ACIS 等内核均以 B-Rep 为底层,差异主要体现在数据结构细节、容差策略与算法打磨程度。

4.3 B-Rep 的形式化定义与核心概念

4.3.1 B-Rep 五元组模型

为统一描述不同内核的 B-Rep 实现,本文提出如下五元组模型:

B = ⟨ T , G , Φ , τ , C ⟩ \mathcal{B} = \langle \mathcal{T}, \mathcal{G}, \Phi, \tau, \mathcal{C} \rangle B=⟨T,G,Φ,τ,C⟩

其中:

  • T \mathcal{T} T:拓扑实体集合,包括体、壳、面、环、边、顶点;
  • G \mathcal{G} G:几何支撑集合,包括点、曲线、曲面;
  • Φ : T → G \Phi: \mathcal{T} \to \mathcal{G} Φ:T→G:拓扑到几何的关联映射;
  • τ : V ∪ E ∪ F → R ≥ 0 \tau: V \cup E \cup F \to \mathbb{R}_{\ge 0} τ:V∪E∪F→R≥0​:容差赋值函数;
  • C \mathcal{C} C:合法性约束集合,包括闭合性、流形性、方向一致性、欧拉不变量与几何一致性。

该模型把“连接关系”“几何度量”“关联映射”“容差语义”“合法性约束”分离,便于比较不同内核的设计取舍。

4.3.2 拓扑实体层次

B-Rep 将实体边界组织为六层拓扑实体:

层次实体维度含义
1体 Solid3D三维实体,由一个或多个壳围成
2壳 Shell2D 组合一组相连的面,闭合时围成区域
3面 Face2D曲面片,由外环与内环界定
4环 Wire/Loop1D 组合面上首尾相接的边序列
5边 Edge1D曲线段,由两个顶点界定
6顶点 Vertex0D三维点

包含关系为:

体 ⊃ 壳 ⊃ 面 ⊃ 环 ⊃ 边 ⊃ 顶点 \text{体} \supset \text{壳} \supset \text{面} \supset \text{环} \supset \text{边} \supset \text{顶点} 体⊃壳⊃面⊃环⊃边⊃顶点

每层实体都关联几何支撑:

  • 顶点 → \to → 点;
  • 边 → \to → 曲线;
  • 面 → \to → 曲面。

4.3.3 拓扑—几何双层语义

B-Rep 的核心设计原则是拓扑与几何分离:

  • 拓扑层回答“谁与谁相邻”“谁包含谁”“方向如何”;
  • 几何层回答“形状是什么”“位置在哪里”“曲率如何”。

形式化地,拓扑层提供邻接关系:

A ⊆ T × T \mathcal{A} \subseteq \mathcal{T} \times \mathcal{T} A⊆T×T

几何层提供度量映射:

Φ : T → G \Phi: \mathcal{T} \to \mathcal{G} Φ:T→G

这种分离带来三个优势:

  1. 同一拓扑可挂不同几何,便于几何替换与近似;
  2. 算法可分别处理连接与形状,降低耦合;
  3. 合法性检查可分层进行。

4.3.4 方向与朝向

B-Rep 需要明确面与边的方向。

  • 面的方向由曲面自然法向与 orientation 标志共同决定;
  • 边的方向由曲线参数方向与 orientation 决定;
  • 环中边的方向需与环走向一致。

相邻面共享边时,该边在两面中的方向应相反,以保证法向一致。内核通常用 orientation 标志、半边 mate 关系或 coedge 结构维护方向一致性。

4.3.5 修剪曲面与参数域

面的几何支撑通常是完整曲面 S ( u , v ) S(u,v) S(u,v),但面只占曲面的一部分,由环定义修剪区域。环在曲面参数域上表示为 p-curve,即三维曲线在参数空间的像。

面内点判定可降为参数域判定:

p ∈ F ⟺ ( u 0 , v 0 ) ∈ D F p \in F \Longleftrightarrow (u_0,v_0) \in D_F p∈F⟺(u0​,v0​)∈DF​

其中 D F D_F DF​ 是由外环与内环定义的参数域。

4.3.6 正则性、流形性与合法性

B-Rep 通常假设:

  • 正则性:无悬垂低维部分,实体为正则闭集;
  • 流形性:每点邻域同胚于圆盘或半圆盘;
  • 闭合性:每条边恰被两个面共享,或作为壳边界被一个面共享两次;
  • 方向一致性:相邻面法向不矛盾;
  • 欧拉不变量:满足欧拉—庞加莱公式;
  • 几何一致性:在容差范围内边落在面上、顶点落在边上。

非流形结构需要特殊数据结构支持,如 ACIS 的辐射边。

4.4 技术原理:边界如何确定整体

4.4.1 Jordan–Brouwer 分离定理

设 S ⊂ R 3 S \subset \mathbb{R}^3 S⊂R3 是闭合、紧致、嵌入的二维流形,则 R 3 ∖ S \mathbb{R}^3 \setminus S R3∖S 恰有两个连通分量:一个有界内部,一个无界外部,且 S S S 是二者公共边界。由此:

实体 = 内部 ∪ S \text{实体} = \text{内部} \cup S 实体=内部∪S

表示 S S S 即表示实体。这是 B-Rep 的根本数学依据。

4.4.2 欧拉操作与拓扑一致性

B-Rep 修改通过欧拉操作完成。欧拉操作是保持欧拉—庞加莱公式不变的拓扑修改原语。经典操作包括:

操作含义拓扑变化
MVFSMake Vertex Face Shell创建孤立顶点、面、壳
MEVMake Edge Vertex加边与顶点
MEFMake Edge Face加边分裂面
KEVKill Edge Vertex删边与顶点
KEFKill Edge Face删边合并面
KFMRGHKill Face Make Ring Genus Hole删面、加环、加亏格

任何合法 B-Rep 修改都可分解为欧拉操作序列。由此可提出欧拉操作代数视角:

  • 状态空间 S \mathcal{S} S:所有合法 B-Rep 状态;
  • 操作集 O \mathcal{O} O:欧拉操作生成元;
  • 不变量:

I ( V , E , F , L , S , G ) = V − E + F − L − 2 ( S − G ) = 0 I(V,E,F,L,S,G) = V - E + F - L - 2(S - G) = 0 I(V,E,F,L,S,G)=V−E+F−L−2(S−G)=0

欧拉操作是保持 I = 0 I=0 I=0 的变换生成元。该视角把 B-Rep 修改视为代数作用,便于形式化验证。

4.4.3 点的内外判定

点在体内判定通常用射线法。从点 p p p 出发沿方向 d d d 作射线:

r ( t ) = p + t d , t > 0 r(t) = p + t d, \quad t > 0 r(t)=p+td,t>0

统计射线与所有面的非退化交点数 n n n。若 n n n 为奇数,则 p p p 在体内;若为偶数,则 p p p 在体外。该方法将三维内外判定降为二维面—射线求交。

4.4.4 壳、空腔与多壳体

一个体可有多个壳:

  • 外壳定义外边界,法向朝外;
  • 内壳定义空腔,法向朝内。

点在体内判定需同时考虑所有壳:在外壳内且在所有内壳外。这使 B-Rep 能表达带空腔的复杂零件。

4.4.5 容差与近似

浮点运算下,“边恰好躺在面上”难以精确成立。B-Rep 引入容差:

d ( e , f ) ≤ τ ( e ) + τ ( f ) ⟹ e  视为在  f  上 d(e,f) \le \tau(e) + \tau(f) \Longrightarrow e \text{ 视为在 } f \text{ 上} d(e,f)≤τ(e)+τ(f)⟹e 视为在 f 上

本文提出容差 B-Rep 扩展模型:

B ϵ = ⟨ T , G , Φ , τ , C ϵ ⟩ \mathcal{B}_\epsilon = \langle \mathcal{T}, \mathcal{G}, \Phi, \tau, \mathcal{C}_\epsilon \rangle Bϵ​=⟨T,G,Φ,τ,Cϵ​⟩

其中 C ϵ \mathcal{C}_\epsilon Cϵ​ 为容差约束集。容差语义可分为:

  1. 表示容差:边、顶点、面的几何偏差;
  2. 运算容差:求交、分类、缝合阈值;
  3. 交换容差:STEP/IGES 导入导出语义;
  4. 修复容差:Shape Healing 与缝合容差。

4.5 数学理论与公式推导

4.5.1 欧拉—庞加莱公式

对闭合多面体:

V − E + F − L = 2 ( S − G ) V - E + F - L = 2(S - G) V−E+F−L=2(S−G)

其中:

  • V V V:顶点数;
  • E E E:边数;
  • F F F:面数;
  • L L L:环数;
  • S S S:壳数;
  • G G G:亏格。

简单闭合多面体退化为:

V − E + F = 2 V - E + F = 2 V−E+F=2

立方体 ( V = 8 , E = 12 , F = 6 ) (V=8, E=12, F=6) (V=8,E=12,F=6):

8 − 12 + 6 = 2 8 - 12 + 6 = 2 8−12+6=2

带一个通孔的环面体 ( G = 1 ) (G=1) (G=1):

V − E + F = 0 V - E + F = 0 V−E+F=0

4.5.2 正则集与正则布尔

B-Rep 表示正则集:

r ( A ) = cl ⁡ ( int ⁡ ( A ) ) r(A) = \operatorname{cl}(\operatorname{int}(A)) r(A)=cl(int(A))

正则布尔运算:

A ∪ ∗ B = r ( A ∪ B ) A \cup^* B = r(A \cup B) A∪∗B=r(A∪B)

A ∩ ∗ B = r ( A ∩ B ) A \cap^* B = r(A \cap B) A∩∗B=r(A∩B)

A ∖ ∗ B = r ( A ∖ B ) A \setminus^* B = r(A \setminus B) A∖∗B=r(A∖B)

所有 B-Rep 内核都返回正则集,但实现正则化方式不同。

4.5.3 参数域判定

设面 F F F 关联曲面 S ( u , v ) S(u,v) S(u,v),点 p p p 映射到参数 ( u 0 , v 0 ) (u_0,v_0) (u0​,v0​)。对每个外环 L i L_i Li​ 用射线计数法判断 ( u 0 , v 0 ) (u_0,v_0) (u0​,v0​) 是否在 L i L_i Li​ 内;对每个内环判断是否在外。则:

p ∈ F ⟺ ( u 0 , v 0 ) ∈ ⋂ i In ⁡ ( L i out ) ∩ ⋂ j Out ⁡ ( L j in ) p \in F \Longleftrightarrow (u_0,v_0) \in \bigcap_i \operatorname{In}(L_i^{\text{out}}) \cap \bigcap_j \operatorname{Out}(L_j^{\text{in}}) p∈F⟺(u0​,v0​)∈i⋂​In(Liout​)∩j⋂​Out(Ljin​)

4.5.4 质量属性与散度定理

体积:

V = ∭ Ω 1   d V = ∬ ∂ Ω x 3 n x   d S V = \iiint_\Omega 1 \, dV = \iint_{\partial \Omega} \frac{x}{3} n_x \, dS V=∭Ω​1dV=∬∂Ω​3x​nx​dS

由散度定理把体积分转为边界曲面积分。B-Rep 可逐面积分,精确计算体积、质心与惯性张量,无需体素化。

4.5.5 B-Rep 复杂度度量

本文提出 B-Rep 复杂度度量:

C BRep = α V + β E + γ F + δ L + η S + θ G C_{\text{BRep}} = \alpha V + \beta E + \gamma F + \delta L + \eta S + \theta G CBRep​=αV+βE+γF+δL+ηS+θG

若考虑曲线曲面控制点,可扩展为:

C BRep ∗ = C BRep + ∑ c ∈ C n c + ∑ s ∈ S n s C_{\text{BRep}}^* = C_{\text{BRep}} + \sum_{c \in \mathcal{C}} n_c + \sum_{s \in \mathcal{S}} n_s CBRep∗​=CBRep​+c∈C∑​nc​+s∈S∑​ns​

该度量可用于比较不同内核的数据规模与算法开销。

4.6 数据结构与算法

4.6.1 经典层次结构

class Solid:
    shells: List[Shell]

class Shell:
    faces: List[Face]
    orientation: Orientation  # 外壳朝外 / 内壳朝内

class Face:
    surface: Surface          # 几何支撑
    wires: List[Wire]         # 外环 + 内环
    orientation: bool         # 法向是否与曲面自然法向一致

class Wire:
    edges: List[OrientedEdge]  # 首尾相接

class OrientedEdge:
    edge: Edge
    direction: bool           # 正向/反向

class Edge:
    curve: Curve              # 几何支撑
    firstVertex: Vertex
    lastVertex: Vertex
    tolerance: float

class Vertex:
    point: Point
    tolerance: float

4.6.2 半边、翼边、辐射边与 DCEL

结构代表特点非流形
翼边Baumgart边记录四邻边邻面弱
半边Weiler边拆为两个有向半边部分
辐射边ACIS边关联任意多面强
DCEL计算几何面向平面细分弱

4.6.3 创建立方体伪代码

def make_box(width, height, depth):
    # 1. 创建 8 个顶点
    vertices = [Vertex((x, y, z)) for x in [0, width]
                for y in [0, height] for z in [0, depth]]

    # 2. 创建 12 条边
    edges = [
        Edge(vertices[0], vertices[1], Line),
        Edge(vertices[1], vertices[3], Line),
        # ... 其余边
    ]

    # 3. 创建 6 个面
    faces = [
        Face(Plane_z0, Wire([edges[0], edges[1], edges[2], edges[3]])),
        Face(Plane_zd, Wire([...])),
        # ... 其余面
    ]

    # 4. 创建壳与体
    shell = Shell(faces)
    solid = Solid([shell])

    # 5. 验证欧拉公式
    assert len(vertices) - len(edges) + len(faces) == 2
    return solid

4.6.4 点内判定伪代码

def point_in_solid(p, solid):
    ray = Ray(p, direction=(1, 0, 0))
    count = 0
    for face in solid.faces:
        for q in ray_face_intersect(ray, face):
            if not is_degenerate(q):
                count += 1
    return count % 2 == 1

4.6.5 合法性验证金字塔

本文提出 B-Rep 合法性验证金字塔:

  1. 实体存在性:拓扑实体非空、引用有效;
  2. 闭合性:边—面共享关系完整;
  3. 流形性:每点邻域满足流形条件;
  4. 方向一致性:相邻面法向不矛盾;
  5. 欧拉不变量: V − E + F − L = 2 ( S − G ) V-E+F-L=2(S-G) V−E+F−L=2(S−G);
  6. 几何一致性:边在容差内落在面上;
  7. 无自交与退化:无零长边、零面积面、自交。

该金字塔可作为内核检查与修复流程的理论框架。

4.7 主流内核中的 B-Rep 实现

内核拓扑结构几何-拓扑关联容差非流形典型 API
OCCTTopoDS_* 层次BRep_TFace/TEdge/TVertex 桥接全局 + 局部部分BRepAlgoAPI
Parasolid拓扑状态机实体带几何字段严格 + 局部部分PK API
CGM容差拓扑容差边/顶点一等原生容差部分内部 API
Granite特征历史嵌入特征带结果形状中等部分Creo 内部
ACIS辐射边边关联多面 use中等原生C++ API

各内核都遵循拓扑-几何分离与欧拉操作原则,差异在数据结构细节、容差语义与算法打磨程度。

4.8 操作步骤教程:在 FreeCAD/OCCT 中观察 B-Rep

步骤一:创建并查看 B-Rep

在 FreeCAD Part 工作台创建立方体,执行 Part → Check Geometry,查看顶点数 8、边数 12、面数 6、壳数 1。验证:

8 − 12 + 6 = 2 8 - 12 + 6 = 2 8−12+6=2

步骤二:打孔后观察拓扑变化

在立方体上打一个通孔,再次检查几何。此时亏格 G = 1 G=1 G=1,欧拉公式变为:

V − E + F = 0 V - E + F = 0 V−E+F=0

步骤三:Python 查看拓扑

import Part

box = Part.makeBox(10, 10, 10)
print("Vertices:", len(box.Vertexes))
print("Edges:", len(box.Edges))
print("Faces:", len(box.Faces))
print("Shells:", len(box.Shells))
print("Solids:", len(box.Solids))

f = box.Faces[0]
print("Surface type:", f.Surface)

for w in f.Wires:
    print("Wire edges:", len(w.Edges))

e = box.Edges[0]
print("Curve type:", e.Curve)

步骤四:体验拓扑—几何分离

尝试将一个面的几何支撑从平面替换为近似 B 样条曲面,观察拓扑不变、形状微变。这体现拓扑层与几何层的独立性。

步骤五:导出 STEP 查看 B-Rep 序列化

导出 STEP 文件,用文本编辑器打开,可见 ADVANCED_FACE、EDGE_CURVE、VERTEX_POINT 等实体。这些正是 B-Rep 拓扑层次的 STEP 标准化表示。

4.9 应用场景与案例

4.9.1 零件设计

每个零件在内核中是一个 B-Rep Solid。拉伸、打孔、倒角等特征操作均修改 B-Rep。打孔本质是布尔减圆柱,结果 B-Rep 增加孔的面、边、顶点。

以典型的机械零件——法兰盘为例,其建模过程完整展示了 B-Rep 的局部性优势:

  1. 基础拉伸:先绘制圆形草图,拉伸成圆柱体,得到由两个平面圆面与一个圆柱侧面构成的 B-Rep Solid;
  2. 中心打孔:执行布尔减圆柱,在 B-Rep 中新增一个内壳(内圆柱面)与两条环形边,拓扑层次由单壳变为双壳;
  3. 圆周阵列孔:在法兰盘圆周上阵列 6 个通孔,每个孔都独立增加一个内壳,此时 B-Rep 共含 1 个外壳与 7 个内壳;
  4. 倒角与圆角:对边缘执行倒角,本质是删除原尖锐边、插入一段过渡曲面,只影响该边邻域的拓扑,其余面、边、顶点保持不变。

这一过程体现了 B-Rep 的核心价值:每次特征操作只修改局部拓扑邻域,无需重建整个实体。相比之下,CSG 需要维护整棵构造树,每次修改都要重新求值。这也是现代 CAD 系统普遍以 B-Rep 为底层、CSG 为高层语义的原因。

在实现层面,特征操作最终都转化为欧拉操作序列。例如打孔可分解为:创建孔的内壳(MVFS)、在内壳上生成圆柱面(MEV/MEF)、将内壳与外壳缝合(MEF)等步骤,每一步都保持欧拉—庞加莱公式不变。

4.9.2 装配与干涉检查

装配不合并 B-Rep,而是记录变换矩阵。干涉检查对两个 B-Rep 求交,判断是否存在公共体积。

在装配体中,每个零件保持独立的 B-Rep,通过 4×4 齐次变换矩阵记录其在全局坐标系中的位置与姿态。这种「装配不合并」的设计带来两个关键优势:

  • 零件可复用:同一零件可在装配体中多次实例化,只需复制变换矩阵,无需复制几何数据;
  • 局部更新:修改某个零件的 B-Rep 时,装配体无需整体重建,只需更新该零件的变换矩阵。

干涉检查是装配验证的核心环节,其算法流程如下:

  1. 包围盒粗筛:先用 AABB(轴对齐包围盒)或 OBB(有向包围盒)快速排除明显不相交的零件对,降低求交计算量;
  2. B-Rep 求交:对可能相交的零件,将其 B-Rep 的面两两求交,得到交线或交点;
  3. 体积判定:判断交线是否围成封闭区域,若存在公共体积则判定为干涉;
  4. 间隙分析:对非干涉但距离较近的零件,计算最小间隙,用于公差分析与装配可行性验证。

在汽车、航空航天等复杂装配场景中,一个装配体可能包含数千个零件,干涉检查需要高效的空间索引(如 BVH 树)与并行求交算法。B-Rep 的拓扑结构使求交结果可精确追踪到具体面、边、顶点,便于定位干涉位置并给出修复建议。

4.9.3 质量属性计算

B-Rep 用散度定理逐面积分,精确计算体积、质心与惯性张量。齿轮、叶轮等零件质量属性可直接由 B-Rep 得到。

质量属性计算是 B-Rep 的重要工程应用,其数学基础是散度定理:将体积分转化为边界曲面积分。对任意标量场 f f f,有:

∫ Ω ∇ ⋅ F   d V = ∮ ∂ Ω F ⋅ n   d S \int_\Omega \nabla \cdot \mathbf{F} \, dV = \oint_{\partial \Omega} \mathbf{F} \cdot \mathbf{n} \, dS ∫Ω​∇⋅FdV=∮∂Ω​F⋅ndS

由此,体积、质心与惯性张量均可表示为边界曲面积分:

  • 体积: V = ∮ ∂ Ω x 3 n x   d S V = \oint_{\partial \Omega} \frac{x}{3} n_x \, dS V=∮∂Ω​3x​nx​dS;
  • 质心: x ˉ = 1 V ∮ ∂ Ω x 2 2 n x   d S \bar{x} = \frac{1}{V} \oint_{\partial \Omega} \frac{x^2}{2} n_x \, dS xˉ=V1​∮∂Ω​2x2​nx​dS;
  • 惯性张量: I x x = ∮ ∂ Ω x 2 ( y 2 + z 2 ) 3 n x   d S I_{xx} = \oint_{\partial \Omega} \frac{x^2(y^2 + z^2)}{3} n_x \, dS Ixx​=∮∂Ω​3x2(y2+z2)​nx​dS。

算法实现时,对 B-Rep 的每个面,将其参数域离散为若干三角形或四边形单元,在每个单元上计算曲面积分并累加。由于 B-Rep 精确记录了每个面的几何支撑(平面、圆柱面、NURBS 曲面等),积分精度远高于体素化方法。

典型应用包括:

  • 齿轮质量属性:齿轮的齿形由渐开线曲面构成,B-Rep 可精确计算其体积与转动惯量,用于动力学仿真;
  • 叶轮平衡:涡轮叶轮的质心位置直接影响旋转平衡,B-Rep 计算可精确到微米级;
  • 注塑件重量估算:通过 B-Rep 体积乘以材料密度,快速估算零件重量,用于成本核算。

相比体素化方法(将实体离散为立方体网格),B-Rep 积分方法无需离散化实体内部,计算精度高且内存开销小,是 CAD 系统质量属性计算的标准方案。

4.9.4 工程图投影

将 B-Rep 投影到平面生成工程图视图,需对每条边投影、对每面做隐藏线消除。B-Rep 拓扑使投影后线段连接关系可追踪。

工程图是制造业的标准交付物,其生成过程充分利用了 B-Rep 的拓扑结构。核心流程如下:

  1. 视图定义:确定投影方向(主视图、俯视图、侧视图等)与投影平面;
  2. 边投影:将 B-Rep 中每条边投影到视图平面。直线边投影为直线段,曲线边投影为曲线段;
  3. 隐藏线消除:判断每条投影线段是否被其他面遮挡,被遮挡的线段以虚线或隐藏线表示;
  4. 轮廓提取:识别实体的轮廓边(silhouette edge),即投影方向与曲面法向垂直的边,这些边构成视图的外轮廓;
  5. 标注生成:在投影视图上添加尺寸标注、公差标注与表面粗糙度标注。

B-Rep 拓扑在工程图生成中的关键作用体现在:

  • 线段连接追踪:投影后,共享边的线段在视图中保持连接关系,便于生成封闭轮廓与剖面线;
  • 隐藏线判定:利用面的法向与拓扑邻接关系,可快速判断面是否朝向观察者,从而决定其边是否可见;
  • 剖面视图:对 B-Rep 做平面切割,得到剖面轮廓,用于生成剖视图。

现代 CAD 系统(如 SolidWorks、Creo)的工程图模块均基于 B-Rep 实现,能够自动生成三视图、剖视图与局部放大图,并保持与 3D 模型的关联性——修改 3D 模型后,工程图自动更新。

4.9.5 网格划分

FEA 网格器读取 B-Rep,对每面离散成三角网格,沿边保证节点匹配。B-Rep 拓扑使网格在共享边处连续。

有限元分析(FEA)与计算流体力学(CFD)都需要将实体离散为网格。B-Rep 是网格划分的理想输入,其拓扑结构保证了网格的连续性与一致性。

网格划分的核心流程:

  1. 面网格化:对 B-Rep 的每个面,在其参数域上生成三角网格或四边形网格。平面面直接二维网格化,曲面面在参数域网格化后映射回三维空间;
  2. 边节点匹配:共享边的两个面在网格化时,必须在该边上生成一致的节点分布,保证网格在共享边处连续;
  3. 体网格化:对面网格进行四面体或六面体填充,生成体网格;
  4. 质量检查:检查网格单元的偏斜度、长宽比、雅可比等质量指标,不合格单元需局部细化或重划。

B-Rep 拓扑在网格划分中的关键作用:

  • 共享边一致性:B-Rep 明确记录了边与面的邻接关系,网格器可确保共享边上的节点完全匹配,避免网格裂缝;
  • 局部细化:B-Rep 的局部性使网格器可对特定面或边进行局部加密,而不影响其他区域;
  • 特征保留:B-Rep 精确记录倒角、圆角、孔等特征,网格器可保留这些特征,避免过度简化导致分析误差。

典型应用包括:

  • 结构强度分析:对零件 B-Rep 划分网格,施加边界条件,求解应力分布;
  • 流场仿真:对流体域 B-Rep 划分体网格,用于 CFD 求解;
  • 拓扑优化:在 B-Rep 基础上迭代修改形状,每次迭代重新划分网格,评估性能指标。

现代网格器(如 ANSYS Meshing、OpenFOAM)均以 B-Rep 为输入,利用其拓扑信息生成高质量网格。

4.9.6 数据交换

STEP 将 B-Rep 标准化,跨系统交换。导入后常需缝合、修复,形成合法 B-Rep。

4.10 常见问题与调优

问题一:B-Rep 不闭合

症状:Check Geometry 报告非闭合。
原因:导入缝隙、布尔后缝合失败。
调优:用 Sewing 设合适容差重新缝合;手动补面;用 ShapeFix 修复。

问题二:欧拉公式不满足

症状: V − E + F ≠ 2 V-E+F \neq 2 V−E+F=2(简单体)。
原因:拓扑破坏。
调优:用 CheckGeometry 定位;必要时重建 B-Rep。

问题三:面法向不一致

症状:渲染或布尔异常。
原因:个别面 orientation 错误。
调优:用 ShapeFix_Face 修复;或手动翻转。

问题四:退化边或退化面

症状:零长边、零面积面。
调优:用 ShapeUpgrade_RemoveInternalWires、ShapeFix 去退化。

问题五:自交

症状:面或边穿过自身。
调优:用 ShapeFix_RemoveSelfInter 修复;或重建。

问题六:修剪域错误

症状:面的环定义错误导致面域异常。
调优:用 ShapeFix_Wire 修复环。

问题七:浮点误差导致拓扑判错

症状:本应共享的边被判为两条。
调优:调整容差;使用容差边表示。

通用调优思路:

  1. 用 CheckGeometry 诊断;
  2. 用 ShapeHealing 系列修复;
  3. 必要时重建 B-Rep;
  4. 理解合法性条件是诊断前提。

4.11 发展趋势与展望

4.11.1 非流形 B-Rep

传统 B-Rep 假设流形。仿真一体化、多材质边界与增材制造推动非流形扩展,ACIS 辐射边与 OCCT 相关研究是代表。

4.11.2 容差 B-Rep 普及

CGM 容差拓扑思想被其他内核借鉴。未来 B-Rep 可能更统一支持容差边、容差顶点与容差面。

4.11.3 T 样条 B-Rep

T-splines 作为 NURBS 推广,支持局部细化,可能并入 B-Rep 几何支撑,推动表示演进。

4.11.4 轻量化与精确双表示

云端 CAD 要求 B-Rep 精确表示与三角网格轻量化表示高效转换。双表示一致性是研究热点。

4.11.5 并行 B-Rep

多核与 GPU 推动布尔、求交并行化,挑战 B-Rep 的强依赖结构。并行欧拉操作与并行合法性验证是方向。

4.11.6 AI 与 B-Rep

可微 B-Rep、自动特征识别、生成式设计对 B-Rep 接口提出新要求。AI 可能改变特征识别、修复与拓扑命名。

4.12 小结

边界表示法 B-Rep 是现代几何内核的核心表示方案。其基本命题是:实体由边界唯一确定,表示实体只需表示边界。B-Rep 将实体组织为体 → 壳 → 面 → 环 → 边 → 顶点的拓扑层次,每层关联几何支撑,拓扑记录连接、几何记录度量,二者分离。合法性由欧拉—庞加莱公式、闭合性、方向一致性与几何一致性保证,修改通过欧拉操作完成。

本文提出的五元组模型、拓扑—几何双层语义、欧拉操作代数、合法性验证金字塔、容差 B-Rep 扩展模型与复杂度度量,为 B-Rep 的比较、分析与实现提供了统一语言。B-Rep 的优势在表达力与局部性,代价在复杂性与浮点敏感。各主流内核均以 B-Rep 为底层,差异在数据结构细节与容差处理。

理解 B-Rep 是理解一切现代几何内核的必经之路。后续第 5—15 章将逐层展开各拓扑实体与数据结构。

4.13 参考文献与延伸阅读

  1. Braid, I. C. The Synthesis of Solids Bounded by Piecewise Surfaces. PhD thesis, Cambridge, 1978.
  2. Requicha, A. A. G. Representations for Rigid Solids: Theory, Methods, and Systems. ACM Computing Surveys, 1980.
  3. Mäntylä, M. An Introduction to Solid Modeling. Computer Science Press, 1988.
  4. Stroud, I. Boundary Representation Modelling Techniques. Springer, 2006.
  5. Weiler, K. Topological Structures for Geometric Modeling. PhD thesis, RPI, 1986.
  6. Baumgart, B. G. Winged Edge Polyhedron Representation. Stanford AI Memo, 1975.
  7. Piegl, L., Tiller, W. The NURBS Book. Springer, 1997.
  8. ISO 10303-42: Geometric and Topological Representation.
  9. OpenCASCADE TopoDS 文档:https://dev.opencascade.org/
  10. 本报告第 5—15 章:拓扑实体与数据结构深入。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐