docs: global boolean algorithm survey — 5 categories, 9 improvements
Build & Test / build-and-test (push) Waiting to run
Build & Test / python-bindings (push) Blocked by required conditions
CI / Build & Test (push) Failing after 29s
CI / Release Build (push) Failing after 33s

Covers: SSI (Parasolid), Classification (ACIS), Exact (CGAL/Cork),
BSP (Carve), Ray-cast (Manifold), SDF (OpenVDB), Octree

Key borrowings:
1. Parasolid 7-class degenerate taxonomy
2. ACIS multi-point voting
3. Manifold 2-manifold guarantee + sweep-line coplanar
4. OpenVDB adaptive voxel SDF preview

Immediate: integrate exact_predicates, multi-point voting
This commit is contained in:
茂之钳
2026-07-27 18:36:51 +08:00
parent 5dd102f284
commit 2431acc3b6
+253
View File
@@ -0,0 +1,253 @@
# 全球布尔算法调研与借鉴
> 布尔运算是几何引擎的核心。本文梳理全球主流算法,分析可借鉴之处。
---
## 一、布尔算法分类全景
```
布尔算法
┌─────────────────┼─────────────────┐
│ │ │
B-Rep 布尔 网格布尔 体素布尔
(精确/拓扑) (近似/三角面) (离散/体素)
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
SSI法 分类法 BSP树法 射线法 SDF法 八叉树法
│ │ │ │ │ │
Parasolid ACIS Cork Manifold VDE-SDF OpenVDB
CGM 早期VDE Carve 早期VDE
```
---
## 二、B-Rep 布尔(精确法)
### 2.1 SSI 法(Surface-Surface Intersection
**代表**: Parasolid、CGM
```
算法流程:
1. 对每对面 (Face_A, Face_B),计算曲面-曲面交线
2. 用交线分割两个面 → 生成裁剪曲面片段
3. 分类每个面片段(IN/OUT/ON
4. 缝合保留的面片段
5. 拓扑验证 → 修复
```
| 优点 | 缺点 |
|------|------|
| 结果精确,保持NURBS精度 | SSI本身极难(数值不稳定) |
| 布尔后仍是B-Rep,可继续编辑 | 退化情况多(共面/共线/切触) |
| 工业标准做法 | 计算量大 |
**借鉴点**:
- SSI的退化分类体系:Parasolid 将退化分为7类(tangent contact / curve overlap / surface overlap / 高阶接触 / 边界接触 / 顶点接触 / 非流形接触),每类有专门处理路径
- **VDE 当前**: SSI 只有基础退化检测,缺少分类体系 → **应借鉴**
---
### 2.2 分类法(Face Classification by Ray Casting
**代表**: ACIS、早期 VDEcentroid分类)
```
算法流程:
1. 取每个面的中心点(centroid
2. 对对方体做射线投射
3. 统计射线穿过面数 → 奇数=内部/偶数=外部
4. 根据布尔类型保留/丢弃面
5. 缝合
```
| 优点 | 缺点 |
|------|------|
| 实现简单 | 中心点在边界上时分类错误 |
| 速度快 | 凹面/薄壁件容易误判 |
| | 无交线信息,无法精确切割 |
**借鉴点**:
- ACIS 的改进:不是单点,而是**多点采样+投票**,降低误判率
- **VDE 当前**: 单中心点分类 → **应改为多点采样**
---
### 2.3 精确算术法(Exact Arithmetic Boolean
**代表**: CGAL Nef Polyhedra、Cork
```
算法流程:
1. 将所有几何转换为精确有理数(GMP/MPFR)
2. 用精确算术计算所有交点
3. 构造半边结构 → 分类 → 输出
```
| 优点 | 缺点 |
|------|------|
| 零浮点误差 | 极慢(100-1000x |
| 100%正确(数学意义上) | 仅支持多面体,不支持NURBS |
**借鉴点**:
- 不追求全精确,而是**自适应精度**:先用 double,检测到不确定时升到 GMP
- **VDE 当前**: exact_predicates 已实现但未集成到布尔 → **应集成**
---
## 三、网格布尔(近似法)
### 3.1 BSP 树法
**代表**: Cork(已停)、Carve(已停)
```
算法流程:
1. 对每个三角形构造半空间
2. 用BSP树对所有三角形分类
3. 根据布尔类型保留/丢弃
```
| 优点 | 缺点 |
|------|------|
| 实现优雅 | BSP树构建O(n²)最坏 |
| 精确(对多边形) | 数值不稳定(共面三角形) |
**借鉴点**:
- 已过时,不推荐借鉴
---
### 3.2 射线投射法
**代表**: Manifold、VDE mesh_boolean
```
算法流程:
1. 两个网格 → 求所有三角形交线
2. 分割三角形 → 生成子三角形
3. 每个子三角形中心点 → 射线投射分类
4. 保留/丢弃子三角形 → 输出网格
```
| 优点 | 缺点 |
|------|------|
| 实现直观 | 边界有锯齿 |
| 适合3D打印 | 面数膨胀 |
---
### 3.3 Manifold 法 — 当前最先进的网格布尔
**代表**: Manifold (Emmett Lalish, 2022)
```
核心创新: 符号距离 + 拓扑保证
1. 使用 rational arithmetic(有理数)计算所有交点
2. 使用 sweep-line 算法检测共面三角形
3. 保证输出为 2-manifold(无悬边/无自交)
4. 增量布尔(支持连续布尔操作)
5. GPU 加速
```
| 借鉴点 | VDE 现状 |
|--------|---------|
| **2-manifold 保证** | 无 → 应借鉴 |
| **增量布尔** | 无 → 可借鉴 |
| **共面三角形处理** | 无特殊处理 → 应借鉴 |
| **GPU加速** | 仅头部 → 可借鉴 |
**为什么 Manifold 重要**: 它是当前唯一在网格布尔的**稳健性**上达到工业级的开源库。
---
## 四、体素布尔(离散法)
### 4.1 SDF 法
**代表**: VDE-SDF、OpenVDB
```
算法流程:
1. 将B-Rep转换为SDF(符号距离场)
2. 对SDF值做 min/max 操作 = 布尔运算
3. Marching Cubes 提取等值面
```
| 优点 | 缺点 |
|------|------|
| 永不失败(数学保证) | 精度损失(离散化) |
| 支持复杂CSG | 无法保持B-Rep拓扑 |
| 天生并行 | 尖角/锐边被圆化 |
**借鉴点**:
- SDF 布尔可做**快速预览**,用户确认后再做精确布尔
- OpenVDB 的**自适应体素**(远处大格子,近处小格子)→ 可借鉴
---
### 4.2 八叉树法
**代表**: OpenVDB、MantaFlow
```
算法流程:
1. 用八叉树离散化空间
2. 标记每个体素为 IN/OUT/ON
3. 提取边界体素 → 生成网格
```
**借鉴点**:
- 自适应分辨率减少内存
- 适合**大规模场景**(千万面级别)
---
## 五、各算法的退化/容错策略对比
| 引擎 | 共面 | 切触 | 自交 | 薄壁 | 非流形 |
|------|------|------|------|------|--------|
| **Parasolid** | 容差分离 | 生成退化边 | auto-heal | 算法保证 | 不支持 |
| **ACIS** | 面重分类 | 容差融合 | 跳过 | 特殊处理 | 有限支持 |
| **Manifold** | 有理数精确 | sweep-line | 保证2-manifold | 薄壁=退化 | 不支持 |
| **CGAL Nef** | 精确 | 精确 | 精确 | 理论上支持 | 支持 |
| **VDE 当前** | 基础检测 | 基础检测 | heal尝试 | 未处理 | 不支持 |
---
## 六、VDE 布尔优化路线图
### 短期(立即可做)
| # | 借鉴来源 | 改进项 | 工作量 |
|---|---------|--------|--------|
| 1 | Parasolid | SSI退化7类分类 → 每类有专门处理路径 | 中 |
| 2 | ACIS | 多点采样投票 替代 单中心点分类 | 小 |
| 3 | Manifold | 共面三角形 sweep-line检测 | 中 |
| 4 | VDE自身 | 集成 exact_predicates 到布尔分类 | 小 |
### 中期
| # | 借鉴来源 | 改进项 | 工作量 |
|---|---------|--------|--------|
| 5 | Manifold | 2-manifold 输出保证 | 大 |
| 6 | Parasolid | 容差自适应:局部几何复杂度决定容差 | 中 |
| 7 | OpenVDB | 自适应体素的SDF布尔预览 | 中 |
### 长期
| # | 借鉴来源 | 改进项 | 工作量 |
|---|---------|--------|--------|
| 8 | Manifold | 增量布尔(连续操作不退化) | 大 |
| 9 | Parasolid | 布尔失败诊断+自动恢复流水线 | 大 |
---
## 七、一句话总结
> **布尔算法60年发展,工业级答案只有一个:SSI+自适应容差+退化分类。
> VDE已有SSI雏形,缺的是Parasolid 35年积累的退化分类体系和容错策略。
> Manifold 在网格布尔的2-manifold保证是近期最值得借鉴的创新。**