Pocolab · Text-prompted 3D part segmentation
SAM3-SEGVIGEN
用几个词,把 3D 模型拆成有名字的部件
输入一个带贴图的 GLB 和一组部件名称,输出一个新的 GLB:每个部件是独立命名的网格,原有的 UV 和贴图原样保留。不写部件名时,也能自动给出合适的命名。
fuselage, wing, tail fin, propeller, engine, float, seat
body, wheel, window, headlight, bumper
head, body, tail, fins, base
[01]
拆件结果
切换"原貌""部件""爆炸"查看拆件结果,拖动旋转,点右侧部件名单独查看某个部件。
提示词
fuselage, wing, tail fin, propeller, engine, float, seat
7 个部件
加载模型中…
再点一次部件名取消选中。
[02]
概览
把"这个模型由哪些部分组成"变成一次查询:给出部件名称,得到按名称切好的部件。
用词指定部件
部件名就是提示词,想拆成什么就写什么;不写时自动挑选合适的部件名。
保留原有贴图
部件直接从原模型上切下,UV 和贴图不经过重新烘焙,细节和原模型一致。
可选封闭补全
被切开的部件可以补成封闭的实体,便于单独打印、替换或继续编辑。
多种接入方式
命令行、Python 和 HTTP 服务共用同一套配置,结果一致。
[03]
核心方法
记输入模型为 \(\mathcal{M}\)(面的集合),部件名称为 \(t_1,\dots,t_K\)。目标是给每个面 \(f\) 一个部件标签 \(\ell(f)\),并按标签把模型切成 \(K\) 个部件。思路是借助二维上成熟的文本提示分割,再把多视角的结果一致地提升回三维。
01
多视角观察
从一组覆盖整个物体的视角 \(\mathcal{V}\) 渲染模型,\(R\) 表示渲染。
\[ \mathcal{I}=\big\{\,I_v=R(\mathcal{M},v)\ :\ v\in\mathcal{V}\,\big\} \]
02
文本提示分割
开放词汇的二维分割器 \(S\) 在每个视角上为每个部件名给出置信度图 \(M_v^k\)。
\[ M_v^{k}=S\big(I_v,\ t_k\big)\in[0,1]^{H\times W},\qquad k=1,\dots,K \]
03
多视角提升
每个面在各视角下的投影 \(\pi_v(f)\) 汇总证据,可见度 \(w_v(f)\) 作权重;再在面的邻接图 \(\mathcal{E}\) 上做一致性约束,得到连贯的标签。
\[ s_k(f)=\sum_{v\in\mathcal{V}} w_v(f)\,M_v^{k}\big(\pi_v(f)\big) \]
\[ \ell=\arg\min_{\ell}\ \sum_{f}-\log\frac{e^{s_{\ell(f)}(f)}}{\sum_{j}e^{s_j(f)}}+\beta\!\!\sum_{(f,g)\in\mathcal{E}}\!\![\ell(f)\neq\ell(g)] \]
04
部件导出
按标签直接从原模型切出部件,原有 UV 与贴图随面一起保留;需要时再用补全 \(C\) 把开口部件补成封闭实体。
\[ P_k=\{\,f\in\mathcal{M}:\ \ell(f)=k\,\},\qquad \mathcal{M}=\bigsqcup_{k=1}^{K}P_k \]
\[ \hat{P}_k=C(P_k),\qquad \partial\hat{P}_k=\varnothing \]