12.容差

OCCT 容差 Tolerance(公差)完整讲解

容差是 OCCT 最折磨人的概念,绝大多数 STEP导入破面、布尔运算失败、缝合失败、非流形拓扑,根源全来自容差。 ⚠️区分两件东西,千万不要搞混:

  1. Shape容差(几何拓扑容差,现在讲的):用来判断两个几何元素“是不是同一个”,用于拓扑缝合、布尔、STEP导入修复。
  2. 网格化弦高偏差 LinearDeflection:前面讲的,只管曲面离散成三角面片的逼近误差,和拓扑容差完全无关。

1. 什么是容差?

浮点数是有误差的。计算机里面没有绝对等于。 现实CAD模型:理论上,一条边的两个端点,应当和相邻边的端点坐标完全一模一样。 但是STEP文件导出、导入、几何计算(布尔、倒角)浮点运算之后,两个点坐标可能变成:(10.0000001, 0, 0) 和 (9.9999998,0,0)。 数学上不相等,但工程上,这两个点应该理解为同一个点。

👉容差,就是一个允许的距离阈值。

如果两个几何元素之间的空间距离 ≤ 容差值,OCCT就认为:它们是重合的,是同一个。 距离 >容差,判定为两个独立元素。

OCCT中,每一个拓扑对象,都自带自己的容差: TopoDS_Vertex顶点、TopoDS_Edge边、TopoDS_Face面,各自都存储一个Tolerance数值。

  • Vertex::Tolerance():顶点容差,代表这个顶点是一个“小球”,球半径等于容差。只要别的点落到这个小球内部,就认为两点重合。

    顶点不是一个无限小的点,是一个半径=tolerance的球体。这是OCCT最核心的设计。

举例子:顶点A容差0.001,顶点B距离A是0.0005。距离小于0.001 → OCCT判定两点重合。 如果B距离A是0.002,大于0.001 →判定为两个独立顶点。

2. 各级容差的含义

  1. 顶点容差 Vertex Tolerance 顶点的等效球体半径。判断两个顶点是否重合的核心。STEP导入的时候,修复算法会扩大/缩小顶点容差,把距离很近的点合并。
  2. 边容差 Edge Tolerance 描述:边上顶点,相对于这条边曲线的允许最大偏离。 顶点应该落在边的曲线上;如果顶点偏离曲线超过边容差,代表这个边是坏的,拓扑和几何对不上。
  3. 面容差 Face Tolerance 边上的点允许偏离所属曲面的最大距离。边应该贴在面上,如果偏离超过面容差,拓扑破损。

一个合格有效的B‑Rep: 顶点必须落在边曲线内部(满足边容差);边必须落在面的曲面内部(满足面容差)。 一旦超出,就是拓扑无效,布尔运算直接报错。

3. STEP导入的时候容差是怎么来的?

STEP文件本身不带OCCT的顶点/边/面容差! STEP只有纯粹的几何坐标和拓扑连接描述。 👉OCCT读取STEP的时候,会自己计算、分配每一个顶点、边、面的容差。 这就是STEP导入精度问题的来源。

导入过程简化:

  1. 解析STEP,读出点坐标、曲线、曲面、拓扑连接关系。

  2. 计算每一对本该重合的顶点之间的实际距离。

  3. 将顶点容差放大,把距离很近的点包裹进顶点球体,让OCCT认为它们是同一个点。

    比如两个点相差0.002mm,就把顶点容差设置成0.002,把两个点包进同一个球,完成缝合。

❗工程坑: 如果原始STEP模型本身缝隙就很大,两个本该重合的点距离0.1mm。OCCT为了缝合,被迫把顶点容差拉到0.1。 容差不是越大越好!容差被强行拉很大,后续布尔运算就很容易出错。

两种典型坏情况

  1. 容差太小 本该重合的两个顶点,距离大于容差球体半径。OCCT判定是两个不同顶点。 结果:相邻边之间出现缝隙,产生非流形拓扑,壳无法闭合,实体变成开放壳。布尔运算直接失败。

  2. 容差被撑得过大 为了缝合缝隙,顶点容差被拉到0.1。后续做布尔运算的时候,距离0.05的两个完全无关的点,会被错误判定为同一个点,几何直接错乱。

    这就是经典现象:STEP导入看着模型完整,但是一做布尔运算就崩。 ✅视图渲染看网格是完好的,底层B‑Rep的容差已经被撑的很大,内核计算直接乱掉。

4. FixShape形状修复做了什么(对应你流程第3步)

BRepCheck_Analyzer检查 + ShapeUpgrade::FixShape修复,核心工作很大一部分就是调整各级容差:

  1. 遍历所有顶点,检测顶点之间距离;
  2. 要么扩大顶点容差球体,把近点包进去完成缝合;
  3. 或者移动顶点坐标,把点真正重合到同一个位置,缩小容差;
  4. 校验边、顶点和曲线曲面的偏离,修正超出容差阈值的元素。

⚠️修复不是万能。如果原始STEP缝隙巨大,修复只能选择二选一: ①把容差拉得非常大,勉强缝合模型,但是后续布尔容易出错。 ②拒绝缝合,保留缝隙,模型是开放壳体,不能做实体布尔。

5. 和网格化偏差做一个硬性区分(非常容易混淆)

项目 拓扑容差 Tolerance 网格化弦高偏差 LinearDeflection
作用对象 B‑Rep顶点/边/面,CPU几何内核 曲面离散,生成三角面片
干什么用 判断点、边是否重合,拓扑缝合,布尔运算 控制三角面片逼近曲面的误差
影响什么 能否做布尔、缝合、是否实体、修复成败 渲染画面光滑程度,三角数量多少
会不会影响显示画面 不会!容差再乱,网格渲染照样看着完整 不影响B‑Rep拓扑正确性

高频踩坑现象:STEP导入,界面看着模型完完整整,渲染没有破洞。但是布尔运算失败。 原因:网格化之后三角把缝隙“盖住了”,视觉看不出;但是底层B‑Rep顶点容差异常,拓扑本身是坏的。网格显示没问题 ≠ B‑Rep拓扑合格。

6.容差的工程现实规则

  1. 容差不是全局一个固定数字,每个顶点都有自己独立容差。一个模型里面,有的顶点容差0.0001,有的被修复撑到0.1,是允许的。
  2. OCCT有一个全局最小/最大允许容差阈值,默认范围大约 1e‑7 ~ 1e‑1。如果顶点容差超过上限,代表模型已经严重病态。
  3. 模型尺寸和容差要匹配:米级大零件,容差0.01合理;毫米级小零件,0.01的容差就太大了。
  4. 不要手动无脑把所有顶点容差全部强行改成0.001。如果原始点实际偏差0.005,强行把容差压到0.001,会直接拆开,重新出现缝隙。

7.串回你的完整STEP导入链路

1.读取STEP文件,解析几何坐标
2.OCCT自动分配各个顶点、边、面的容差
  ↓STEP本身不带容差,内核现场计算
3.【FixShape修复】
  检测缝隙,调整顶点容差球体,尝试缝合缝隙;修正边、面的几何偏离
  ↓输出修复后的B‑Rep(可能部分顶点容差被放大)
4. 清理旧网格缓存 BRepTools::Clean
5. BRepMesh_IncrementalMesh网格化,生成三角(只受弦高偏差控制,和容差无关)
6. AIS显示,屏幕看着完整
❗这里陷阱:视觉完好 ≠ B‑Rep容差合格,后续布尔运算依然可能失败
posted @ 2026-08-20 09:24  Drunker•L  阅读(41)  评论(2)    收藏  举报