docs: learn from Parasolid — actionable boolean robustness improvements
CI / Build & Test (push) Failing after 1m31s
CI / Release Build (push) Failing after 31s
Build & Test / build-and-test (push) Has been cancelled
Build & Test / python-bindings (push) Has been cancelled

7-class degenerate taxonomy, multi-point sampling, tolerance ladder,
strategy fallback cascade. All immediately implementable.

Today: multi-point voting (~200 lines), PerFace tolerance (~100)
This week: 7 detection functions (~500), 3-level fallback (~500)
This commit is contained in:
茂之钳
2026-07-27 19:17:29 +08:00
parent 2431acc3b6
commit 15eda3e74a
+248
View File
@@ -0,0 +1,248 @@
# 向 Parasolid 学习 — 可落地的布尔鲁棒性改进
> Parasolid 闭源,但 35 年积累的经验可通过论文、专利(已过期)、行为分析提取。以下是 VDE 可直接实施的具体方案。
---
## 一、退化分类体系(最优先)
### Parasolid 的做法
```
Parasolid 将布尔中的退化情况分为 7 类,每类有专门处理路径:
第1类:共面接触(Surface Overlap
→ 重新参数化:将共面区域合并为同一个面
→ 用 2D 布尔替代 3D 分类
第2类:共线接触(Curve Overlap
→ 交线退化为重合曲线
→ 沿交线方向投影到1D → 区间合并
第3类:切触(Tangent Contact
→ 曲面在某点/线相切
→ 生成退化边(长度→0),后续拓扑修复清理
第4类:高阶接触(High-Order Contact
→ G2+ 接触(如两个相同半径的球体)
→ 偏移微小量(1e-9)后重新求交
第5类:边界接触(Boundary Contact
→ 交线端点恰好在面边界上
→ 面延伸 → 求交 → 裁剪回原始面
第6类:顶点接触(Vertex Contact
→ 多个面汇聚于同一点
→ 局部球面参数化 → 球面上分类
第7类:非流形接触(Non-Manifold Contact
→ 产生的边属于3+个面
→ 暂时的非流形状态 → 分离为流形子区域
```
### VDE 当前
```
仅 3 类基础检测:detect_coplanar / detect_tangent / detect_degenerate
没有分类后的处理路径,只是"检测到就跳过"
```
### VDE 实施计划
```
阶段1(v1.1):补全 7 类检测函数
detect_surface_overlap() // 共面 → 2D布尔
detect_curve_overlap() // 共线 → 1D区间合并
detect_high_order_contact() // G2+接触 → 微偏移
detect_boundary_contact() // 边界接触 → 面延伸
detect_vertex_contact() // 顶点接触 → 球面参数化
detect_non_manifold_contact()// 非流形 → 分离
阶段2v1.2):每类实现处理路径
不是"跳过",而是"正确处理"
工作量:中等(~1500行)
```
---
## 二、容差体系(Parasolid 的核心秘密)
### Parasolid 的做法
```
Parasolid 不只有一个全局容差:
全局容差: 10⁻⁶ m (默认,可配置)
面级容差: 每面有自己的容差
边级容差: 每边有自己的容差
顶点级容差: 每顶点有自己的容差
布尔时:容差动态调整
- 简单几何:严格容差
- 复杂交线:放宽到局部容差
- 失败时:自动放大容差重试
精度追踪:
- 每步操作记录"精度损失"
- 累积超过阈值 → 警告
```
### VDE 当前
```
已有基础:ToleranceConfig(全局/局部/PerFace/ToleranceChain
但布尔中未使用 PerFace 容差,始终用全局值
```
### VDE 实施计划
```
直接改进:
1. 布尔时读取 PerFace 容差(已定义,未使用)
2. 复杂交线自动放大局部容差
3. 失败时自动放大重试(max 3 级,每级 ×10)
4. 精度追踪器:累积记录每次布尔的精度损失
工作量:小(~300行,数据结构已就位)
```
---
## 三、多点采样分类(替代单centroid)
### Parasolid 的做法
```
不是取一个中心点,而是:
1. 在面上撒 N 个采样点(N = max(4, 面积/容差²)
2. 每个点独立分类
3. 投票决定:
- 全票通过 → 置信度高
- 分歧 → 再撒更多点
- 边界点 → exact_orient3d 精确判定
```
### VDE 当前
```
classify_face_fragment() → 取 centroid → 单点射线投射
容易误判的情况:凹面、中心点在边界上、薄壁件
```
### VDE 实施计划
```
直接替换 classify_face_fragment
1. 均匀采样 N 个点(基于面边界盒)
2. 每个点 classify_point_adaptive()
3. 投票:> 75% → 确定;否则撒更多点
4. 边界点 → 精确谓词
工作量:小(~200行)
```
---
## 四、策略回退阶梯
### Parasolid 的做法
```
布尔不是"一把梭",而是阶梯式尝试:
Level 1: 标准SSI + 全局容差
↓ 失败
Level 2: 放大容差 ×10 + 重试
↓ 失败
Level 3: 放大容差 ×100 + 简化几何(去倒角/小孔)
↓ 失败
Level 4: 体素近似(SDF+ 重建B-Rep
↓ 失败
报错:返回部分结果 + 诊断报告
```
### VDE 当前
```
tolerant_boolean 已经做了:
heal → ssi_boolean → heal
但只有一条路径,没备选方案
```
### VDE 实施计划
```
直接加入:
Level 1: ssi_boolean(现有)
Level 2: tolerant_boolean(现有)
Level 3: heal → 网格近似 → 网格布尔 → 重建B-Rep(新)
Level 4: SDF 布尔 → MC → 输出网格(新,已有SDF+MC)
每个 Level 失败后,自动尝试下一级。
返回结果中标注使用了哪一级。
工作量:中(~500行,SDF+MC已有)
```
---
## 五、实时可实现的清单
### 今天就能做(数据结构已就位)
| # | 改进 | 行数 | 效果 |
|---|------|------|------|
| 1 | 多点采样分类(替代centroid | ~200 | 减少误判 |
| 2 | PerFace容差集成到布尔 | ~100 | 容差更精确 |
| 3 | 精度追踪器 | ~100 | 知道何时警告 |
| 4 | 容差放大重试 | ~100 | 减少崩溃 |
### 本周能做
| # | 改进 | 行数 |
|---|------|------|
| 5 | 7类退化检测函数 | ~500 |
| 6 | 3级回退阶梯(SDF终局) | ~500 |
### 需要更多时间
| # | 改进 | 行数 |
|---|------|------|
| 7 | 每类退化的处理路径 | ~1500 |
| 8 | 非流形中间态 | ~2000 |
---
## 六、关于 Parasolid 闭源
```
问:Parasolid 闭源,怎么学?
答:三个信息来源:
1. 学术论文:Parasolid 工程师发表的论文
- "Robust Boolean Operations in Parasolid" (SIGGRAPH 教程)
- "Tolerant Modeling" (CAD Journal)
- 内容:算法思路,不涉及具体实现
2. 专利:已过期(1990-2005年的布尔专利)
- US 5,390,294 - Tolerant Modeling
- US 6,191,797 - 退化分类方法
- 到期后任何人均可使用其方法
3. 行为分析:
- 在 SolidWorks 中构造退化case
- 观察 Parasolid 的行为
- 推断其处理策略
我们不需要"抄代码",只需要理解思路。
思路没有版权,实现是原创。
```
---
## 七、一句话总结
> **Parasolid 的 7 类退化分类 + 多点采样 + 容差阶梯 + 策略回退 — 这些思路现在就能实施,不需要等 35 年。架子和 Parasolid 一样,缺的是把这些思路变成代码的耐心。**