6.布尔运算的大致原理
B‑rep布尔运算(Boolean)通俗讲解
布尔运算就是CAD里面:合并、相减(打孔)、求交集。
- 相加(Union):两个零件合并成一个
- 相减(Difference):A减去B,拿B在A上面挖掉一块,打孔就是它
- 求交(Intersection):只保留两个物体互相重叠的那一部分
注意:布尔运算操作的对象是两个完整B‑rep Solid实体,输出一个新的B‑rep Solid实体。 它不是修改三角网格,全程在曲面、拓扑层面做数学计算。 同时:布尔运算也是gap缝隙、非流形拓扑的最大产生来源。
布尔运算核心四步(通俗,不堆复杂公式)
假设场景:方块A,拿圆柱B,在方块A上面打一个圆孔。A−B。
第1步:求交,计算两组实体所有曲面之间的交线
方块有6个面,圆柱有圆柱侧面+上下两个圆面。 算法要遍历:方块每一个Face 和圆柱每一个Face,一对一对做曲面求交。 两个无限大曲面相交,计算它们相交出来的曲线(交边)。
例子:圆柱侧面 和方块顶面相交,会算出一个圆形交线。 这条圆形交线,就是圆孔在方块顶面上的轮廓。
这里是整个布尔运算最麻烦、最容易出误差的地方。 曲面求交是数值迭代求解,不是简单解析公式直接算出完美结果。 计算机浮点数迭代出来的交点,会带上微小的浮点残差,微米、纳米级的偏移。 这些微小偏差,就是后续缝隙gap的种子。
输出结果:得到一堆3D空间交线(未来的Edge)。
第2步:把交线裁剪,嵌入到两个实体原有的拓扑里面
刚刚算出来的交线是完整的大圆。但我们不需要完整圆,只需要落在实体内部的那一段。 算法会对交线做裁剪,把无效部分扔掉。 然后,把交线切割原来的Face:
- 方块的顶面,被圆形交线切割成两块:外面方块顶面、圆孔内部小圆面。
- 圆柱侧面也会被方块的面切割。
原来的一个Face,被交线切为多个Face。 旧的环被破坏,生成新的环Wire‑loop。 👉 这一步开始修改拓扑结构:Face、环、Edge全部发生变更。
第3步:判断哪些面保留,哪些面要丢弃
现在两个实体都被交线切开,碎成一堆小块面。 内核需要判断:每一小块面,是在另一个实体的内部,还是外部。
- A‑B(打孔):A物体上,跑到B内部的面片要删掉;B物体上,跑到A外面的面片全部丢弃。 留下属于最终结果的面片集合。
判断点在实体内部还是外部,叫点归属测试(point‑in‑solid)。 这个判断也会受浮点误差干扰:一个点刚好落在面上,差一点点,就可能判断错内外。一旦判断出错,布尔直接算崩,得到破碎壳体。
第4步:把筛选保留下来的所有面,组装成新的B‑rep实体
把筛选后的Face集合,重新组装:
- 组装环、边、顶点;
- 检查边的共享关系:一条边必须恰好两个面共享;
- 尝试闭合,生成新的Solid实体。
✅ 输出全新B‑rep。
为什么布尔运算特别容易产生gap缝隙、非流形?
来源1:曲面求交的浮点数值残差
两个曲面相交算交点,迭代求解得到的坐标不是数学理想值,带微小误差。 理论上应该完全重合的两个交点,计算完差了0.0001mm。 新生成的Edge顶点,没有严丝合缝对上,模型内部埋下微小缝隙gap。
来源2:容差的矛盾
布尔运算全程依赖内核全局容差。 两个交点距离小于容差,才会被合并成同一个顶点。
- 容差太小:微小偏差不合并 → 产生缝隙。布尔结束之后看着实体正常,但内部藏缝隙。后续倒角直接失败。
- 容差太大:强行把距离稍远的点合并,容易把多个面挤压到同一条边上,生成非流形拓扑。
来源3:几何几乎相切的高危情况
工业零件非常常见:两个面几乎贴在一起、接近相切。 比如圆柱几乎贴着方块表面,相交角度非常小。 曲面求交算法在接近相切的时候,数值求解极不稳定。 交线算出来断断续续、抖动,直接产出坏拓扑。 很多布尔失败案例都来自“面几乎相切”。
来源4:输入本身就是带病模型
如果参与布尔的A或者B本身就带有缝隙、坏拓扑。 布尔运算不会自动修复输入模型。带着病害做布尔,病害会被放大,输出直接碎成壳体。
重要:布尔运算不自带Heal修复。输入有毛病,输出只会更糟。
两种常见现象解释
- 布尔运算成功跑完,得到实体,肉眼看一切正常,但后续倒角报错 布尔跑完,拓扑闭合成功,输出Solid。但是内部藏了微米级gap缝隙。渲染三角化看不出来。等到倒角,内核再去查找相邻边,缝隙暴露,直接报错。
- 布尔直接失败,输出不是Solid,输出Shell壳体 求交算出来的交线有问题,组装阶段无法闭合实体,生成开放壳体。
现实工程小经验
- 尽量避免两个面几乎相切的几何,这是布尔运算头号杀手。
- 不要对已经导入、没有修复好的STEP壳体直接做布尔。带病输入,大概率翻车。
- 多次连续布尔,误差会不断累积。做很多次布尔之后,模型内部缝隙会慢慢变多。
区分两件事,不要搞混
- 布尔运算:正常建模,通过曲面求交,生成全新拓扑。目的是做零件,不是修复旧模型,还会产生新误差。
- Heal修复:针对已经存在的坏B‑rep,用容差缝合缝隙,清理非流形。
布尔是“造模型”;Heal是“修坏掉的模型”。
完整的一条因果链条,把前面所有知识点串起来
- 用户做布尔打孔 → 曲面求交,浮点计算带来微小坐标偏差;
- 布尔输出实体,肉眼看不出问题,内部埋下gap缝隙;
- 保存STEP,STEP只存坐标,不携带内核容差;
- 另一个软件读取STEP,本地容差配置不一样;
- 不开启Heal修复:缝隙保留,实体看着完好,但倒角、布尔报错;
- 开启Heal修复:容差调小缝不上缝隙;容差调大,缝上缝隙,但又制造出新的非流形;
- 无论底层B‑rep是gap还是非流形,三角化都可以生成三角形,GPU正常渲染,掩盖所有底层拓扑缺陷。

浙公网安备 33010602011771号