智能分区 — 算法参考与论文
配套设计文档:
docs/07-智能分区设计.md(方案 / REFUTE 结论 / 实现状态)。 本文档沉淀算法原理、论文出处、复杂度、端到端 pipeline,以及迭代 39 的性能根因复盘——把"为什么这么做"固化成可检索的项目资产。 范围:三种已落地算法(dihedral / ShapeDiameter / intrinsic CurvatureKMeans);MultiView 3→2→3 仅列设计要点(backlog,未实现)。
0. 总览
| 算法 | 特征 | 是否默认 | 速度量级 |
|---|---|---|---|
| Dihedral(二面角区域生长) | 相邻面二面角 < 阈值 → 同区 | 导入后自动分区默认 30° | 极快 O(F·A) |
| ShapeDiameter(SDF) | 沿内法线射线到对壁的距离 = 局部"厚度" | useSdf:true 时启用 |
慢 O(n·K·rays) |
| Intrinsic CurvatureKMeans | [平均曲率, |SDF|] 联合聚类 + 连通性保证 | 面板默认 curvatureKMeans |
慢(含 SDF) |
SegmentationAlgorithm 枚举 + run_segmentation 统一入口见 segment/mod.rs;前端经 invoke("auto_segment_v2", { algorithm }) 触发。
1. 算法与论文
1.1 Dihedral(二面角区域生长)
- 原理:对每对共享边的相邻面计算二面角;二面角 <
angle_threshold(默认 30°,约 cos 0.93)视为"共面/平滑",归入同一区域;以邻接图做区域生长(region growing),再用小区域合并(normal_consistency_merge/merge_small_regions_fast)消除碎片。label 0 合法。 - 出处:二面角驱动的区域生长是网格分割的工业标准做法,OrcaSlicer / Bambu Studio 的"按角度分割"即此思路;连通性合并框架与 CGAL
Surface_mesh_segmentation的 Variational Shape Approximation(VSA)同构。 - 复杂度:邻接 BFS + 小区域合并,约 O(F·A),F=面数,A=平均邻接度(≈6)。在真实网格上毫秒级。
1.2 Shape Diameter Function(SDF,形状直径函数)
- 原理:对每个面,沿其(定向一致的)内法线发射若干条射线,取射线与模型对侧表面的交点距离的中位数/均值,作为该面的"厚度"描述子;薄特征(肢体)SDF 小,厚特征(装甲板)SDF 大。再做 log 归一化 + K-means 聚类。
- 论文:
- Gal, R., Shamir, A., Cohen-Or, D. (2006). Salient Geometric Features for Partial Shape Matching and Retrieval. (SDF 的提出)
- Shapira, L., Shamir, A., Cohen-Or, D. (2008). Consistent Mesh Partitioning and Skeletonisation using the Shape Diameter Function. The Visual Computer, 24(4):249–259. (SDF 用于网格分割/骨架化)
- 本仓库实现(
segment/sdf.rs):每面经 kdtreenearest_n(K=512)取候选面,沿 12 条锥形射线做ray_triangle求交 → 约 6144 次射线-三角形求交/面,O(n·K·rays)。这是默认curvatureKMeans + useSdf:true路径的主瓶颈(迭代 39 卡死的根因)。 - 关键修正(REFUTE blocker #1):早期实现把 kdtree 查询半径设为整 bbox 对角线且放在射线循环内 → O(12·n²);改为
nearest_n(K)有界候选降到 O(n·K·rays)。另修consistent_normals副作用:改为oriented_normals(mesh)->Vec不写回mesh.normals,避免多算法串联污染。
1.3 Intrinsic Curvature K-Means(内在曲率 K 均值)
- 原理:逐面特征向量 =
[mean |dihedral curvature|, log-normalized |SDF|](剔除依赖全局朝向的 PCA 法线投影,避免主轴符号/简并导致"按朝向聚类")。确定性最远点播种(无rand依赖,保测试确定性)+ Lloyd K-means(默认 k=6,20 轮)+ 连通分量拆分(BFS overface_adjacency把每个簇拆成空间连通片)+ 特征距离合并小碎片到大邻居,最终每个 label 是连通"部件"。 - 论文:
- Lloyd, S. P. (1982). Least squares quantization in PCM. IEEE Trans. Information Theory. (K-means / Lloyd)
- Meyer, M., Desbrun, M., Schröder, P., Barr, A. H. (2003). Discrete Differential-Geometry Operators for Triangulated 2-Manifolds. VisMath. (离散 Laplace-Beltrami 曲率)
- Cohen-Steiner, D., Alliez, P., Desbrun, M. (2004). Variational Shape Approximation. SIGGRAPH. (VSA — 连通性/凹度合并的理论基础,CGAL Surface_mesh_segmentation 同源)
- 复杂度:特征提取 O(F)(含 SDF)、K-means O(F·k·iters)、连通 BFS O(F)。SDF 主导时整体退化到 1.2 的量级。
1.4 MultiView 3→2→3(backlog,未实现)
- 设计要点(详见
docs/07§11):多视角正交投影 → 仅最近深度面占栅格 → 每个视角 2D 连通区域 → 构建带权 match graph(≥T 视角同区才连边)→ 可切割算法(normalized cut / 自研 Louvain),非 union-find(单调不可切)。 - 启发来源:渲染→2D mask→回投→图社区检测范式(如 Segment Anything, Kirillov et al. 2023;SAMesh 类多视角回投分割)。本轮因 petgraph 0.6 无社区检测 + union-find 方向反(视角越多越合并)而推迟。
2. 复杂度对照
| 算法 | 主瓶颈 | 量级 | 备注 |
|---|---|---|---|
| Dihedral | 邻接 BFS + 小区域合并 | O(F·A) | 极快,毫秒级 |
| SDF | kdtree nearest_n + 12 射线×512 候选面 |
O(n·K·rays) ≈ 6144 次/面 | useSdf:true 时启用 |
| CurvatureKMeans | 特征(SDF) + K-means | O(n·6144) + O(F·k·iters) | 面板默认,最慢 |
K=512(
SDF_CANDIDATE_K)、rays=12 为工程取值;ragk 与 k 由用户配置。真实网格(数十万面)下 SDF/Curvature 路径可达数秒~数十秒——必须在 worker 线程跑(见 §4)。
3. 端到端 pipeline
前端 IntelligentSegmentPanel
└─ invoke("auto_segment_v2", { algorithm }) // 面板 setLoading(true)
│
后端 auto_segment_v2 (async fn → Tauri tokio worker 线程)
├─ mesh.take() 出 Mutex(释放锁,主线程不冻结)
├─ run_segmentation(&mut mesh, algo)
│ ├─ Dihedral | ShapeDiameter | CurvatureKMeans
│ └─ 每阶段 emit("segment-progress", {progress, stage})
├─ mesh.history.clear()
├─ mesh 写回 Mutex
└─ SegmentResult { segments, segment_labels, face_colors: Vec::new() }
│ (前端 setLoading(false))
前端 updateSegmentLabels(labels, segments) // 不再传 faceColors
- 进度链路:
segment-progress事件 →Toolbar.tsx浮层 +Viewport.tsx由isLoading门控。缺口(已修):面板run()原先未setLoading(true),浮层不显示。 - label-only 历史:auto 分区不改
face_colors(仅改 labels),故face_colors返回空,省多兆 IPC + 前端全量重绘(与MergeResult/SplitResult同例)。
4. 性能根因复盘(迭代 39,2026-08-09)
症状:点击"智能分区"后窗口"未响应"、无法操作。
根因(三层叠加):
- 同步命令跑主线程:Tauri v2 的 sync
#[tauri::command]在 webview/主线程执行;默认curvatureKMeans + useSdf:true走 SDF(O(n·6144)),重计算冻结 UI 消息泵 → 窗口假死。(Tauri v2 的async fn命令由内置多线程 tokio runtime 调度到 worker 线程,不阻塞主线程。) - Mutex 持锁冻结:即使改 async,若
lock()后持MutexGuard跑重计算,主线程的同步命令在lock()处被阻塞 → 仍卡。必须把 meshtake()出锁、算完再写回。 - 多兆
face_colors回传:auto 分区从不改色,却回传 4n 字节全量颜色 JSON(数 MB),挤占 IPC 与前端全量重绘。
修复(R1–R4):
- R1
commands/segment.rs:auto_segment_v2改async fn+State<AppState>;meshtake()出 Mutex 计算、释放锁、算完锁回(worker 线程跑重计算)。 - R2 同上:
face_colors返回Vec::new()(auto 分区可证不改色)。 - R3
sdf.rs/curvature.rs:compute_sdf加on_progress/base/span,每n/50面发一次进度(SDF 段占 curvature 管线 0.0..0.3)。 - R4
IntelligentSegmentPanel.tsx:run()开头setLoading(true),finally里setLoading(false)。
验证:cargo test --lib 103 passed / 0 failed / 1 ignored;tsc --noEmit exit 0;vite build 634 模块 exit 0。
显式 backlog(用户点 3:确认交互后再迭代):
- rayon 并行化
sdf.rsper-face 循环(墙钟时间不变,仅降 CPU 占用)。 load_model同病异步化(大模型加载也走主线程)。- 默认值:
useSdf:true+lastSegmentKind污染导入自动分区路径(用户可能不想要 SDF 的慢)。 - SDF 平滑法线复用(
oriented_normals两遍)。 - Plane 拆分视口"画切痕"交互(坐标系混用会静默切错)。
- 调色板
label % 15撞色(拆分两片约 1/15 同色)。
5. 参考文献(Bibliography)
- Gal, R., Shamir, A., Cohen-Or, D. (2006). Salient Geometric Features for Partial Shape Matching and Retrieval. Computer Graphics Forum / Eurographics.
- Shapira, L., Shamir, A., Cohen-Or, D. (2008). Consistent Mesh Partitioning and Skeletonisation using the Shape Diameter Function. The Visual Computer, 24(4):249–259.
- Cohen-Steiner, D., Alliez, P., Desbrun, M. (2004). Variational Shape Approximation. ACM SIGGRAPH 2004.
- Meyer, M., Desbrun, M., Schröder, P., Barr, A. H. (2003). Discrete Differential-Geometry Operators for Triangulated 2-Manifolds. VisMath / IEEE Visualization.
- Lloyd, S. P. (1982). Least squares quantization in PCM. IEEE Transactions on Information Theory, 28(2):129–137.
- Kirillov, A., et al. (2023). Segment Anything. ICCV 2023 (Meta AI). (MultiView 3→2→3 范式启发)
- CGAL. Surface Mesh Segmentation (package
Surface_mesh_segmentation), based on Shapira et al. 2008 + Cohen-Steiner et al. 2004. - OrcaSlicer / Bambu Studio. Mesh segmentation by dihedral angle (工业实现参考).