Articulate AnyMesh:让静态三维模型拥有可动部件
Articulate AnyMesh:让静态三维模型拥有可动部件
一句话理解:先把物体拆成有意义的活动部件,再用几何生成关节候选,让视觉语言模型根据外观与常识选出合理的运动方式。
这篇论文是 Articulate AnyMesh: Open-Vocabulary 3D Articulated Objects Modeling。下面基于 arXiv v2 讲解方法;所有标为“教学示例”的坐标、数量和角度都是为理解而构造的数值。
1. 它到底解决什么问题?
假设你下载了一个漂亮的小柜子模型。它有柜门、抽屉和旋钮,但在模拟器里,你只能把整个柜子搬来搬去:门无法绕铰链转动,抽屉也不能拉出来。
原因是,普通三维网格主要记录“表面在哪里”,缺少“哪些表面属于同一个活动部件、部件之间怎么运动”。
Articulate AnyMesh 要补上这层结构。
| 项目 | 具体含义 |
|---|---|
| 输入 | 一个静态三维网格,可以来自人工建模、三维生成或真实物体重建 |
| 部件输出 | 柜体、柜门、抽屉等独立的刚体部件,以及它们的语义 |
| 结构输出 | 谁连接谁、谁是父部件、连接属于旋转还是平移 |
| 几何输出 | 旋转轴的位置和方向,或平移方向 |
| 可选输出 | 对分割后缺损的部件补全几何、重新生成纹理 |
它的核心洞见是:关节通常与两个部件连接处的几何有关,而具体怎么运动又与物体用途有关。 几何适合给出空间候选;视觉语言模型(VLM)适合判断哪个候选符合“门怎么开、旋钮怎么转”这样的常识。
“开放词汇”指部件和物体类别不局限于一个预先固定的小型关节数据集。它仍受输入几何、分割质量和 VLM 能力限制,名称中的 AnyMesh 不能理解成对所有网格都保证成功。
2. 一张图看懂完整流程
整个流程先回答“哪些部分会动”,再回答“这些部分沿哪里动”。只有拆开后几何不完整时,才需要最后的补全。
这里有两次看起来相似、用途不同的视觉提示:
- 分割时给区域编号:让 VLM 指出哪些区域是柜门、抽屉。
- 估计关节时给点和箭头编号:让 VLM 指出铰链经过哪些点,或部件沿哪个方向滑动。
第二次提示是方法最值得抓住的设计:每个图上标记都绑定着已知的三维几何,模型的选择可以直接转换为三维参数。
3. 先理解输出:一个关节要描述什么?
3.1 部件与关节组成一棵树
把每个刚体部件称为一个 link,把两个部件之间的运动约束称为一个 joint。父部件移动时,其子部件也会随它一起移动。
教学示例:一个柜门上装着可转动的旋钮,合理结构可以是:
旋钮既会随柜门移动,也可以相对柜门旋转。因此,正确的父子关系和正确的轴方向同样必要。
“看得见的零件”不一定都需要独立的活动关节。例如,焊在柜门上的把手和柜门没有相对运动,可以视作同一个刚体,或用固定关节连接。
3.2 旋转与平移需要的参数不同
对于旋转关节,用轴上一点 \(\mathbf{o}\in\mathbb{R}^3\) 和单位方向 \(\mathbf{d}\in\mathbb{R}^3\) 表示轴线:
若一个部件上的点 \(\mathbf{x}\) 绕轴旋转角度 \(q\),在统一参考坐标系下,它的位置变成:
这里 \(R(\mathbf{d},q)\) 就是绕方向 \(\mathbf{d}\) 旋转 \(q\) 的旋转矩阵。直觉上,先把轴移到原点,旋转,再移回去。
对于平移关节,只需方向 \(\mathbf{d}\) 和位移 \(q\):
所以,门的轴放在左边还是中间,会产生完全不同的开门动作;抽屉沿相同方向平移时,“轴线穿过哪个点”不会改变平移结果。
实际使用还需要确定初始姿态、正方向和运动上下限。轴线本身只描述运动的几何约束,不能独自决定门应该打开多少度。
4. 模块一:把静态网格拆成活动部件
4.1 为什么要先理解语义?
几何分割可以找到颜色、法向或形状不同的小区域,但它未必知道哪些区域应该一起运动。一扇柜门可能包含门板、装饰条、固定把手;这些外观不同的区域可能属于同一个活动刚体。
因此,这一步结合两个能力:
- VLM 根据渲染图提出部件名称,并判断大致的连接关系和关节类型。
- 二维分割与三维融合负责把这些名称落到具体表面上。
输入是网格及其多视角图像;输出是带语义和实例身份的三维部件。例如,两个抽屉可以同叫“抽屉”,但必须拥有不同的实例编号。
4.2 在二维图上识别部件
方法采用 PartSLIP++ 风格的多视角分割流程。所用的 Set-of-Mark(SoM)提示可以理解为“先给图上的区域贴号码,再让模型报号码”。
SAM 提出图像区域;VLM 看到带编号的区域,选择或组合属于指定部件的区域。一个部件可以由多个区域组成。RGB 外观与法向图中的几何线索,都可以帮助区域提取和识别。
这一步得到每个视角下的部件掩码。掩码是一个二值图:某个像素属于该部件就标记为 1,否则为 0。
4.3 多张二维掩码怎样变成三维分割?
先从网格采样三维点,并保存它们的颜色和法向。若采样了 \(N\) 个点,位置数组的形状就是 \(N\times3\)。
由于渲染时相机已知,可以保存“三维点投影到哪个像素、该点是否可见”的对应关系。这样,某个像素被识别为柜门,就可以给投影到这里的可见三维点提供一次柜门证据。
为了减少逐点判断的噪声,先把相邻且几何、颜色相近的点组成 superpoint(超点)。它实际是一小块点集,而不是一个点。这里用基于邻接图的 cut-pursuit 分区,使局部小块更倾向于沿外观和几何变化处分开。
对超点 \(S\) 和部件类别 \(c\),一个便于理解的融合分数是:
其中 \(V_v\) 是视角 \(v\) 中可见的三维点;\(M_{v,c}\) 是投影落在类别 \(c\) 掩码内的三维点。分母非零时,这个比值表示“所有有效观察中,有多大比例支持这个类别”。可见性很关键:被柜门遮住的点,不能拿柜门像素给自己投票。
随后给超点分配语义,并结合三维邻接关系和不同二维实例掩码的覆盖情况,把属于同一活动部件的超点合并。最后把点上的分割结果转成部件网格。
输入:网格、多视角相机
图像、投影对应 = 渲染并记录可见点(网格, 相机)
部件语义、连接草图 = VLM理解物体(图像)
对每个视角:
候选区域 = SAM提取区域(图像)
区域掩码 = VLM选择编号区域(候选区域, 部件语义)
# 多个编号区域可以共同组成一扇门
超点集合 = 按几何、颜色和邻接关系划分三维点
对每个超点:
统计各视角中可见点获得的语义支持
根据支持程度分配部件类别
合并属于同一实例的相邻超点
# 同叫“抽屉”的两个实例仍然分开
返回:部件网格、语义、父子连接关系
教学示例。 某块门板在两个视角中分别有 10 个和 8 个可见采样点,其中 9 个和 7 个落入“柜门”掩码,其支持分数是:
另一块柜体区域获得的柜门支持很低,因此不会被合入门板。两个不同抽屉即使类别相同,也会因为空间位置与二维实例对应不同而被区分。
二维模型负责认出物体表面的意义,三维对应关系负责把不同视角的判断汇聚到同一批点上。
5. 模块二:把三维关节搜索变成看图选择
5.1 连接附近为何有用?
柜门的铰链应该在柜门与柜体连接处,旋钮的轴通常穿过旋钮连接面。先寻找这些区域,就能大幅缩小后续搜索空间。
设相邻两部件的点云为 \(P_a\in\mathbb{R}^{N_a\times3}\) 和 \(P_b\in\mathbb{R}^{N_b\times3}\),定义点到另一点云的最近距离:
连接附近的点集合为:
如果集合为空,就把距离阈值 \(\tau\) 翻倍,直到找到邻近点。
这里的“连接区”实际表示几何接近区。它能提供候选,但无法证明那里一定存在铰链:闭合的柜门也可能沿多个边缘接近柜体。
5.2 从一大堆点变成可读的编号
把连接区聚成多个簇,以簇中心作为候选点。候选太少会漏掉重要位置,太多又会让图上的编号重叠。因此,方法尝试不同的 K-means 簇数,在图上编号不重叠的条件下尽量保留更多候选。
视角也需要选择:优先使用当前活动部件投影面积较大的视角;小部件可以裁剪放大。这里追求的是“让模型看清候选”,并不保证该视角总能看见真实铰链。
每个候选有两份表示:三维坐标 \(\mathbf{c}_i\),以及相机投影后的二维位置 \(\pi_v(\mathbf{c}_i)\)。在图上写下编号 \(i\),同时保留编号到三维坐标的表。
因此,模型回答“3、8”之后,系统可直接取出三维点 \(\mathbf{c}_3,\mathbf{c}_8\)。这避免了从模型自由生成的坐标文本中猜测三维位置。
输入:两个部件点云、渲染视角
连接点 = 空集合
重复直到连接点非空:
连接点 = 收集两部件之间距离小于阈值的点
若连接点为空:阈值 = 2 × 阈值
视角 = 选择活动部件投影面积大的视角
对若干候选簇数:
中心点 = KMeans聚类(连接点, 候选簇数)
将中心点投影到图像并检查编号间距
保留编号可区分且候选较多的方案
画出编号,并保存“编号 → 三维坐标”
返回:带标记的图像、三维候选表
教学示例。 柜门附近有 300 个连接点,聚成 6 簇后编号清晰;聚成 10 簇时,部分编号挤在一起。最终使用可读的候选方案。VLM 只需根据门的外观指出哪几个编号位于铰链处。
关键是这张“编号与三维点对应表”:视觉判断和精确几何计算通过它衔接。
6. 模块三:怎样得到旋转轴?
6.1 门式关节:选择多个点,再拟合直线
柜门或笔记本转轴通常沿铰链延伸方向旋转。让 VLM 在候选图中选择至少两个能表示铰链的点,就能从这些点拟合一条轴线。
若选择了 \(m\ge2\) 个点,先计算中心:
再把中心化点按行组成矩阵 \(X\in\mathbb{R}^{m\times3}\),用奇异值分解求它们延伸最明显的方向:
只选两个点时,就是沿这两个点的连线;有多个点时,则是在允许点位噪声的情况下找最贴近它们的直线。
教学示例。 VLM 为柜门选中编号 3 和 8,对应坐标为:
得到:
这是一条竖直轴。轴上的点并非必须是铰链的中心,只要在同一条轴线上,描述的旋转轴就相同。
6.2 旋钮式关节:一个点,再加一个平面法向
旋钮可能只有朝外的轴心位置容易定位,沿轴方向的第二个点藏在内部。此时,单个点无法独立确定空间直线,需要补入一个机械先验:旋转轴垂直于连接面。
先对连接区拟合平面:
拟合可用 RANSAC:反复用少量点提出平面,找支持它的邻近点,避免少数离群点把平面带偏。其法向 \(\mathbf{n}\) 就是垂直穿出该平面的方向。
接着让 VLM 选择一个表示轴心位置的候选点 \(\mathbf{c}_k\),令:
教学示例。 旋钮安装在平面 \(y=0.2\) 上,选择的轴心是 \((0.1,0.2,0.4)\),平面法向是 \((0,1,0)\)。这样就得到一条穿过旋钮中心、垂直柜门面板的轴。
要区分两件事:拟合铰链直线时,找点集“沿着哪里延伸”;拟合连接平面时,找“垂直这个面”的方向。
6.3 铰链藏在内部怎么办?
仅从连接区采样,有可能没有能指向隐藏铰链的位置。方法还考虑用法向与颜色把部件表面划分为超点区域,从不同区域补充候选,以覆盖更多可能的位置。
这增加的是可供 VLM 判断的几何位置,并不能恢复肉眼和表面几何都无法确定的真实内部机械结构。
输入:活动部件语义、带编号图像、候选三维点、连接点
根据部件用途判断适合哪种旋转结构
若能沿铰链选出多个位置:
编号集合 = VLM选择至少两个铰链点(图像)
选中点 = 根据编号查回三维坐标
轴上一点 = 选中点均值
轴方向 = 选中点的直线拟合方向
否则,采用垂直连接面的结构先验:
编号 = VLM选择轴心位置(图像)
轴上一点 = 对应三维候选点
轴方向 = 连接区拟合平面的单位法向
返回:轴上一点、单位轴方向
两条分支都要得到“一个位置和一个方向”;区别在于方向来自铰链点的连线,还是来自连接面的法向。
7. 模块四:怎样得到滑动方向?
7.1 为什么滑动关节不能直接照搬铰链选点?
抽屉导轨或按钮的滑动机构常常藏在内部。很多输入还是只有外壳的表面网格,无法可靠地通过内部导轨或碰撞试探找到运动方向。
方法因此先根据用途,把滑动关节分成两类:穿过连接面进出,或者沿连接面移动。
7.2 内外滑动:沿连接面的法向
抽屉拉出、按钮按入,都可以用“穿过安装表面”的方向近似。对连接区拟合平面后,取单位法向为平移方向:
教学示例。 一个抽屉正面位于平面 \(y=0.2\),它与柜体邻近的连接区也近似落在该平面上。拟合法向 \((0,1,0)\),于是抽屉沿 \(y\) 方向进出。
法向的正负都描述同一条运动轴。要让“正位移”对应拉出而不是推入,还需要一致的正方向和运动范围约定。
7.3 表面滑动:在平面内画候选箭头
滑动窗户、烤面包机拨杆常常沿物体表面移动。这里先用连接平面限制方向,再在平面内构造两条正交单位方向 \(\mathbf{u},\mathbf{v}\):
把 \(\mathbf{u},-\mathbf{u},\mathbf{v},-\mathbf{v}\) 四个三维方向投影成彩色箭头,让 VLM 选择符合功能的箭头。选择结果通过预存对应关系转换回三维方向。
教学示例。 烤面包机面板近似处于 \(xz\) 平面。候选方向为竖直的 \(\pm(0,0,1)\) 和水平的 \(\pm(1,0,0)\)。VLM 看出拨杆沿竖直槽移动,选择竖直方向的箭头。
这一步仍然是有限候选选择。它能表达构造出的方向;如果真实滑轨是另一条斜向轨道,就可能不匹配。
输入:部件用途、连接点、渲染图像
类别 = 根据部件功能判断滑动类型
连接平面 = 稳健拟合平面(连接点)
若类别是“内外滑动”:
方向 = 连接平面单位法向
否则,类别是“表面滑动”:
候选方向 = 在平面内构造两组正负正交方向
图像 = 把候选方向画成彩色箭头
选择 = VLM判断适合的箭头(图像)
方向 = 查回该箭头对应的三维方向
返回:单位平移方向
前一类沿表面的法向进出,后一类沿表面移动。分类把同一个“猜三维方向”的问题拆成了更简单的几何判断。
8. 模块五:拆开后缺了几何,怎样补?
8.1 可运动的结构与完整的外观是两件事
假设输入只有闭合柜子的外表面。门轴估计正确后,门可以转开,但柜子内部可能是一片空洞,门板背面也可能不存在。
这是因为输入从未提供被遮挡的内部表面。分割不能凭空得到不存在的几何。
可选后处理使用两个现成模型:
- HoloPart:接收带部件分割的网格,补全各部件几何。
- Meshy:对补全后的部件生成纹理与材质外观。
如果输入本来就有完整的独立零件和内部结构,可以跳过这一步。
输入:分割后的部件网格、关节结构
若部件有缺损或被遮挡造成的缺面:
完整部件 = HoloPart补全部件几何(分割网格)
带纹理部件 = Meshy生成纹理(完整部件)
否则:
带纹理部件 = 原有部件
将部件与已有关节结构组合
返回:外观更完整的可动资产
教学示例。 水桶把手遮住了一小块桶身,分割后桶身留下洞。补全模型生成缺失的桶壁,再为新增表面生成与桶身协调的纹理。
补全改善的是缺失形状和外观;它不自动验证真实内部结构、零件间碰撞或关节运动的物理正确性。
9. 把教学柜子完整走一遍
下面把前面的步骤串起来。柜子有柜体、柜门、抽屉,以及安装在柜门上的可转旋钮。设 \(z\) 轴向上,\(y\) 轴朝柜子外侧;以下数值统一采用米和角度作为教学单位。
第一步:识别并分开活动部件
从多视角图像中识别“柜门、抽屉、旋钮”;把掩码融合回三维,得到四个部件。柜门上的固定装饰属于柜门刚体,不需要额外活动自由度。
第二步:建立父子关系和运动类型
| 子部件 | 父部件 | 相对运动 |
|---|---|---|
| 柜门 | 柜体 | 绕铰链旋转 |
| 抽屉 | 柜体 | 沿柜子内外方向平移 |
| 旋钮 | 柜门 | 绕面板法向旋转 |
这一步决定后面要选择哪些几何分支。若把旋钮错误地连接到柜体,即使轴方向正确,开门时它也不会随门运动。
第三步:用几何候选确定轴
| 子部件 | 几何信息 | 得到的参数 |
|---|---|---|
| 柜门 | 选中竖直铰链上的两个候选点 | \(\mathbf{o}=(-0.3,0.2,0.3)\),\(\mathbf{d}=(0,0,1)\) |
| 抽屉 | 连接区拟合平面的法向 | \(\mathbf{d}=(0,1,0)\) |
| 旋钮 | 轴心候选点与柜门面板法向 | \(\mathbf{o}=(0.1,0.2,0.4)\),\(\mathbf{d}=(0,1,0)\) |
这些参数先在初始统一坐标系中理解;组成关节树时,要把关节相对父部件的位置关系表达一致。
第四步:给关节状态,观察部件运动
为了演示,另行指定柜门旋转 \(60^\circ\)、抽屉拉出 \(0.15\) 米、旋钮转动 \(30^\circ\)。这些只是演示状态,不是模型从外观精确测得的范围。
一个抽屉上的点原本是 \((0.1,0.2,0.3)\),拉出后:
柜门绕竖直铰链转动。旋钮先跟随柜门的姿态变化,再叠加自身相对柜门的旋转;这就是父子连接的作用。
第五步:检查拆开后是否缺面
如果原始网格没有抽屉内部和门板背面,使用可选补全。至此,输入中的“一个静态外壳”被组织成“多个部件和它们的运动关系”。
10. 它要训练吗?实际推理怎样运行?
Articulate AnyMesh 的资产转换流程无需在关节标注数据集上训练一个新的专用关节预测器。它调用预训练 VLM、分割模型和可选生成模型,并执行采样、聚类、几何拟合等计算。
因此,这里的 training-free 指资产转换流程不新增专门的关节模型训练;预训练模型本身依然是学习得到的,而且运行 VLM 需要相应模型服务或 API。
输入:静态网格
渲染结果 = 生成多视角观察(网格)
部件、语义、结构 = 识别并分割活动部件(渲染结果)
对每个需要运动的部件:
连接点 = 提取邻近连接区域(部件, 相关几何)
根据关节类型进入旋转或平移分支
生成适合该分支的视觉候选
利用VLM选择与几何拟合确定关节参数
若输入缺少内部几何:执行可选补全
组合部件与关节结构
# 这是逐物体处理流程,无需反向传播训练关节网络
返回:可动资产描述
论文还研究了新资产如何帮助机器人学习,但那是后续用途:生成的资产扩充仿真数据,机器人策略可以再接受训练或微调。
无需训练专用关节预测器的是前半段;后半段的机器人策略学习是另一项任务。论文中的真实机器人演示还包括在仿真里规划轨迹,再到真实环境执行该轨迹,两者也应分别理解。
11. 为什么这个组合有效,什么时候容易失败?
11.1 三种能力各自承担合适的工作
| 能力 | 它解决的困难 | 对方法的帮助 |
|---|---|---|
| 语义与常识 | “这是门还是按钮,它通常如何使用” | 允许超出少量固定物体类别 |
| 三维几何 | “候选位置在哪里,连接面朝哪里” | 把参数约束到输入网格的空间结构上 |
| 视觉标记 | “如何让模型指向精确位置” | 把语言选择映射为可计算的三维对象 |
最重要的设计可以概括为 几何生成候选,VLM 判断意义,几何计算参数。它将一个连续、高维的空间估计任务,拆成语义分类、有限候选选择和确定性的几何拟合。
11.2 误差会沿流程传递
如果候选中没有接近真实铰链的位置,后面的 VLM 就很难通过选编号补救。若抽屉被错误识别为向外开的门,正确的点云也可能被错误的旋转假设解释。
还需记住以下实际边界:
- 表面不包含全部机械信息。 两个外观相同的盒子,可能有不同的隐藏铰链,单一静态外形不一定能唯一决定真实机构。
- 几何先验并非适合所有结构。 先斜向上抬才能拉出的抽屉、非平面滑轨、复杂耦合机构,会超出简单旋转或单轴平移假设。
- 平面需要能被可靠拟合。 如果连接区域弯曲、混杂或分割错误,法向可能偏离真实运动方向。
- VLM 选择有误差。 编号拥挤、遮挡、部件过小,或常见类别先验与特殊设计不符,都可能导致错误。
- 可动不等于物理完全可信。 合理的轴和外观,还不足以保证运动限位、质量、摩擦、碰撞几何以及内部结构都真实。
11.3 阅读论文与使用公开脚本时的一个边界
公开脚本目前主要输出部件与关节轴描述;论文涉及的运动范围、URDF 应用、HoloPart/Meshy 后处理尚未在主入口中完整串联。此外,隐藏轴的候选在论文中包含表面超点,公开入口主要采用连接点聚类中心并补充部件质心。上文以论文的完整方法为主,不应把这些环节视为现有仓库一条命令全部具备。
12. 一页记住这个方法
可以按下面五步回忆:
- 识别:这个物体有哪些会动的部分?
- 分割:把二维语义判断融合回三维,得到独立刚体。
- 找候选:在连接附近构造能画到图上的点和方向。
- 定关节:门选多个点拟合轴;旋钮选一个点加法向;抽屉取法向;滑动拨杆选平面内箭头。
- 补外观:需要时补全几何与纹理,再将部件和关节用于仿真。
最值得保留的研究思路是:给基础模型一个与三维几何绑定的、容易作答的视觉选择题,让它的常识判断能够落到精确的空间操作上。
资料
本文来自博客园,作者:S-X-Q,转载请注明原文链接:https://www.cnblogs.com/sxq-blog/p/22896703

浙公网安备 33010602011771号