现在大部分 3D 生成模型只能生成一个整体模型,零件粘在一起拆不开;OmniPart 先生成每个零件的位置框,再分别生成每个零件的样子,最后把零件拼成一个完整物体,这样零件既能单独编辑,拼起来又不会有缝。
OmniPart 输入一张图片和 mask,先规划出零件的 3D 位置,再生成每个零件的具体模型,最后拼成完整物体。
研究动机
问题难在哪:做游戏、VR、动画的人都希望 3D 模型是分零件的,但现在的生成模型大多只会吐出一个粘在一起的整体模型,没法拆。想做出能拆的零件,要同时做到两件事:零件之间互相独立(改一个不影响别的),但拼起来又要严丝合缝(不能有缝、不能位置不对)。这两件事天然矛盾。
现有方法的问题:先把图片用 2D 模型分割成几块、再各自重建成 3D(如 Part123、PartGen)——从多个角度拍的照片对不齐,重建出来的零件形状会破碎,看不到的背面/内部就直接没了。直接训练一个模型生成 3D 零件(如 PASTA)——很难精确控制"该拆成几块、怎么拆",而且需要大量按零件标注好的 3D 数据,这种数据很稀少。
核心 insight:把这件事拆成两步:先决定有哪些零件、每个零件大概占据 3D 空间里的哪个位置,再单独生成每个零件具体长什么样。两步分开做,比想一步到位同时搞定位置和细节简单得多。
核心方法
1. 整体流程:先画框,再填内容
OmniPart 分两个阶段。第一阶段叫结构规划:输入一张图片(可以配合 2D mask),模型用自回归的方式,一个一个地输出每个零件的 3D 边界框(标出这个零件大概占据哪块空间)。第二阶段叫零件合成:把这些边界框喂给一个改造过的 3D 生成模型,让它在每个框里生成对应零件的具体几何和纹理,所有零件一起生成,保证拼起来是整齐的。
OmniPart 整体流程。第一步用自回归模型预测零件的边界框,第二步在这些框的基础上微调一个 3D 生成模型,把每个零件具体生成出来。
2. 基础:TRELLIS 的体素表示
OmniPart 是在已有模型 TRELLIS 的基础上改的。TRELLIS 把一个 3D 物体切成很多小方块(体素),只记录物体表面经过的那些方块的位置,每个方块再配一个向量记录这里的形状和颜色细节。OmniPart 第一阶段生成的边界框,就是用来告诉 TRELLIS 的体素"这块属于哪个零件"。