12.容差
OCCT 容差 Tolerance(公差)完整讲解
容差是 OCCT 最折磨人的概念,绝大多数 STEP导入破面、布尔运算失败、缝合失败、非流形拓扑,根源全来自容差。 ⚠️区分两件东西,千万不要搞混:
- Shape容差(几何拓扑容差,现在讲的):用来判断两个几何元素“是不是同一个”,用于拓扑缝合、布尔、STEP导入修复。
- 网格化弦高偏差 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. 各级容差的含义
- 顶点容差 Vertex Tolerance 顶点的等效球体半径。判断两个顶点是否重合的核心。STEP导入的时候,修复算法会扩大/缩小顶点容差,把距离很近的点合并。
- 边容差 Edge Tolerance 描述:边上顶点,相对于这条边曲线的允许最大偏离。 顶点应该落在边的曲线上;如果顶点偏离曲线超过边容差,代表这个边是坏的,拓扑和几何对不上。
- 面容差 Face Tolerance 边上的点允许偏离所属曲面的最大距离。边应该贴在面上,如果偏离超过面容差,拓扑破损。
一个合格有效的B‑Rep: 顶点必须落在边曲线内部(满足边容差);边必须落在面的曲面内部(满足面容差)。 一旦超出,就是拓扑无效,布尔运算直接报错。
3. STEP导入的时候容差是怎么来的?
STEP文件本身不带OCCT的顶点/边/面容差! STEP只有纯粹的几何坐标和拓扑连接描述。 👉OCCT读取STEP的时候,会自己计算、分配每一个顶点、边、面的容差。 这就是STEP导入精度问题的来源。
导入过程简化:
-
解析STEP,读出点坐标、曲线、曲面、拓扑连接关系。
-
计算每一对本该重合的顶点之间的实际距离。
-
将顶点容差放大,把距离很近的点包裹进顶点球体,让OCCT认为它们是同一个点。
比如两个点相差0.002mm,就把顶点容差设置成0.002,把两个点包进同一个球,完成缝合。
❗工程坑: 如果原始STEP模型本身缝隙就很大,两个本该重合的点距离0.1mm。OCCT为了缝合,被迫把顶点容差拉到0.1。 容差不是越大越好!容差被强行拉很大,后续布尔运算就很容易出错。
两种典型坏情况
-
容差太小 本该重合的两个顶点,距离大于容差球体半径。OCCT判定是两个不同顶点。 结果:相邻边之间出现缝隙,产生非流形拓扑,壳无法闭合,实体变成开放壳。布尔运算直接失败。
-
容差被撑得过大 为了缝合缝隙,顶点容差被拉到0.1。后续做布尔运算的时候,距离0.05的两个完全无关的点,会被错误判定为同一个点,几何直接错乱。
这就是经典现象:STEP导入看着模型完整,但是一做布尔运算就崩。 ✅视图渲染看网格是完好的,底层B‑Rep的容差已经被撑的很大,内核计算直接乱掉。
4. FixShape形状修复做了什么(对应你流程第3步)
BRepCheck_Analyzer检查 + ShapeUpgrade::FixShape修复,核心工作很大一部分就是调整各级容差:
- 遍历所有顶点,检测顶点之间距离;
- 要么扩大顶点容差球体,把近点包进去完成缝合;
- 或者移动顶点坐标,把点真正重合到同一个位置,缩小容差;
- 校验边、顶点和曲线曲面的偏离,修正超出容差阈值的元素。
⚠️修复不是万能。如果原始STEP缝隙巨大,修复只能选择二选一: ①把容差拉得非常大,勉强缝合模型,但是后续布尔容易出错。 ②拒绝缝合,保留缝隙,模型是开放壳体,不能做实体布尔。
5. 和网格化偏差做一个硬性区分(非常容易混淆)
| 项目 | 拓扑容差 Tolerance | 网格化弦高偏差 LinearDeflection |
|---|---|---|
| 作用对象 | B‑Rep顶点/边/面,CPU几何内核 | 曲面离散,生成三角面片 |
| 干什么用 | 判断点、边是否重合,拓扑缝合,布尔运算 | 控制三角面片逼近曲面的误差 |
| 影响什么 | 能否做布尔、缝合、是否实体、修复成败 | 渲染画面光滑程度,三角数量多少 |
| 会不会影响显示画面 | 不会!容差再乱,网格渲染照样看着完整 | 不影响B‑Rep拓扑正确性 |
高频踩坑现象:STEP导入,界面看着模型完完整整,渲染没有破洞。但是布尔运算失败。 原因:网格化之后三角把缝隙“盖住了”,视觉看不出;但是底层B‑Rep顶点容差异常,拓扑本身是坏的。网格显示没问题 ≠ B‑Rep拓扑合格。
6.容差的工程现实规则
- 容差不是全局一个固定数字,每个顶点都有自己独立容差。一个模型里面,有的顶点容差0.0001,有的被修复撑到0.1,是允许的。
- OCCT有一个全局最小/最大允许容差阈值,默认范围大约
1e‑7 ~ 1e‑1。如果顶点容差超过上限,代表模型已经严重病态。 - 模型尺寸和容差要匹配:米级大零件,容差0.01合理;毫米级小零件,0.01的容差就太大了。
- 不要手动无脑把所有顶点容差全部强行改成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容差合格,后续布尔运算依然可能失败

浙公网安备 33010602011771号