docs: global boolean algorithm survey — 5 categories, 9 improvements
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:
@@ -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、早期 VDE(centroid分类)
|
||||
|
||||
```
|
||||
算法流程:
|
||||
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保证是近期最值得借鉴的创新。**
|
||||
Reference in New Issue
Block a user