前两天有个做三维内容的同学跟我聊:现在用视频生成模型做素材已经越来越“像样”了,可一旦涉及到“让一个已有的3D模型根据视频动起来”,流程还是绕不开手工绑定、蒙皮、调权重和手动K帧,整个过程比重新建模还要慢。
我跟他聊了很久,最后落到一个关键词上:BLARM。它不是要解决“视频生成3D资产”的问题,而是要解决一个更让人头疼的问题——如何把一段视频里已经存在的运动,迁移到一个结构可能完全不同的3D对象身上。这个思路看起来直接,做起来却有很多容易被低估的环节。本篇文章不打算逐行复现论文公式,而是想从一个工程实践的角度,把“BLARM”这类“从视频学习并迁移3D运动”的方案拆开看:它真正在做什么,它凭什么能成立,它落地的时候会在哪里卡住,以及我们怎样用最小的代价先验证它。
1. 让3D物体动起来的最大瓶颈,不是建模,而是“动作资产”的复用
1.1 传统三维动画流程里,最难复用的是运动而模型本身
在Blender、Maya、3ds Max这类工具里,做一个“会动”的3D模型,通常不是建模环节最费时间,而是后面那串绑定、蒙皮、权重绘制、动画骨骼和K帧。
就算给一个现成的模型,如果没有配套的骨骼和权重,动画师依然需要从零开始:
- 给模型加入骨骼或控制点。
- 检查模型拓扑,必要时重新处理权重。
- 对肢体关节、弯曲区域反复测试蒙皮效果。
- 手工修正穿插和变形。
也就是说,“模型”和“动作”是两套资产。模型可以重复利用,动作却很难跨模型迁移。不同的身体比例、局部拓扑、坐标朝向、部件数量,都会让同一个动画文件在新的模型上变成一堆乱扭的面片。
这也是很多做数字人、产品展示、游戏模组和机械模拟的团队觉得很无奈的地方。你明明已经在视频里看到了一段自然的运动轨迹,但这套轨迹没法直接给3D对象用。要么用动捕设备重新录,要么一个关节一个关节地用脚本转。
1.2 视频里有运动,为什么不能直接“抄”到3D模型上
从视频中获取运动信息,其实早就不新鲜了。常见的人体姿态估计、手部关键点、物体6D姿态跟踪,都能从普通视频里抽出运动信息。
可一旦要求“把这个运动迁移到另一个3D模型”,难度会立刻上升一个量级:
- 视频只有2D投影,缺少深度信息;就算有三维重建,目标物体也可能和场景物体在尺度、部件比例上不一致。
- 视频中的运动自带“观察视角变化”,你很难区分哪些运动来自物体本身,哪些来自摄像机。
- 视频里物体可能被遮挡、模糊或出现非刚性变形,这些都会污染运动估计。
- 迁移对象和视频中的物体不是同一个资产时,需要建立“部件到部件”的对应关系。比如四足动物和六足机器人的脚能不能对应?玩具熊的手能不能对应机械臂?这种问题没有固定答案。
所以,更合理的做法不是让模型去“看懂视频里的全部语义”,而是把运动本身拆成更底层、更稳定的组件。BLARM标题里的“Latent Rigid Motion Primitives”,本质上就在做这件事。
2. 拆解标题:BLARM真正想表达的三个关键词
2.1 “Rigid”:为什么刚体运动是解决复杂动画的合理砖块
看到“rigid”这个词,有的同学会以为这只适用于机械臂或小汽车。但请回想一下,经典蒙皮动画也在做类似假设:模型局部是一块一块接近刚性的,骨骼带动蒙皮顶点时,每个顶点受附近骨骼变换的加权影响。
一个人跑步时,躯干、大腿、小腿、脚掌、手臂,每个局部在短时间内都可以近似为刚体;把它们组合起来,就能形成看似复杂的非刚性运动。把复杂动作拆成大量局部刚体变换,是几何处理和角色动画里被反复验证过的做法。
BLARM把这个概念往前推了一步:如果不需要人工指定部件属于哪个局部区域,而是让模型从视频中自动学出一系列能够解释整个运动的刚性变换,那运动迁移的适配性就会好很多。
换句话说,“刚体”不是限制,而是一种非常聪明的降维策略。它把一帧帧的无规律形变,转化为一组有物理约束的旋转和平移。
2.2 “Latent Motion Primitives”:动作基元不是手标出来的
传统骨骼绑定之所以可迁移性差,一个重要原因是人工预设部件拓扑:哪根骨头管哪个区域、有几个关节,都是建模师标定的。
Latent Motion Primitives则代表一个不同的思路:把一组“运动基元”放到隐空间里学习,而不是显式地手工画出骨骼和部件。模型可以在训练或优化过程中决定,需要多少个基元才能解释视频中的运动,每个基元对应的运动参数应该是什么。
当然,“隐式”不代表不需要约束。如果不加任何先验,模型很可能把整个物体当作一个刚体,或者把不同部件的运动混杂到同一个基元里。实际设计时通常还要加:
- 刚性约束:每个基元内部保持欧氏变换,保证局部不变形。
- 稀疏或空间约束:尽量让不同基元作用于不同空间区域。
- 时序平滑性:相邻帧之间的变换不能突变太多。
- 跨视角一致性:多视角输入时,同一个运动基元应该有一致的解释。
所谓“latent”,应该理解为“可以在目标函数下被优化出来”,而不是“完全不透明、不可控”。
2.3 “Blending”:把多个刚体变换融合成一个连续变形场
如果每个运动基元只负责一个显式区域,那最终效果就是生硬的机械零件拼接。要让模型表面连续自然,必须引入混合权重。
混合公式沿用的思路,本质上类似线性蒙皮或双四元数蒙皮。对于一个三维模型上的顶点x,最终变形位置可以写成:
$$x' = \sum_{i=1}^{K} w_i(x) \cdot T_i(x)$$
其中:
- $K$ 是潜在运动基元的数量;
- $T_i$ 是第 $i$ 个运动基元带来的刚体变换;
- $w_i(x)$ 是顶点 $x$ 受到第 $i$ 个基元影响的空间混合权重。
实际工程里不会直接用线性矩阵加权,因为多个旋转矩阵线性插值后可能不满足刚体性质,会出现“皮肤塌陷”或“糖果包装纸”类伪影。更稳妥的方式是使用对数映射、指数映射或四元数插值,再配合训练或优化出来的空间权重,让每个局部尽可能接近刚性,整体又保持连续。
这也是BLARM这个名字的精髓:Blending Latent Rigid Motion Primitives,把多个潜在刚体运动基元,通过混合场柔和地粘合成一个完整动画。
从工程角度看,这种设计比传统骨骼蒙皮多了一条优势:运动基元不一定对应“解剖学意义上的骨骼”,它可以是模型自己发现的空间单位。比如一个四足机器人,运动基元可能是在空间上重叠的多个旋转区域,而不是四条腿各一根骨头的硬编码逻辑。
3. 从视频到新3D对象,一套完整的理解流程
如果现在要实现或使用一个类似BLARM的方案,在工程上会遇到哪些具体环节?很多论文会把这部分浓缩成一个总体框架,但落地时,每个环节都藏着不少坑。按常规建模流程,可以把整个过程分成四步。
3.1 第一步:准备一个可供变形的3D对象
既然是把视频中运动迁移到“3D对象”,这个对象肯定不能只是隐式神经场,它最好是一个我们能读取、保存、导出的显式几何,比如mesh或SDF。
这一步表面上简单,实际上决定了后面的“成败”。需要检查三点:
- 初始姿态要对齐。视频中源物体的初始姿态,与目标3D对象的初始姿态最好接近。如果差异太大,模型需要同时学习一个巨大的“姿势补偿”,这会消耗大量表达能力。
- 拓扑要足够支持局部刚体运动。如果一张mesh在关节区域过于粗糙,即便刚性变换本身正确,渲染出来仍会看到明显穿插。
- 模型坐标系与相机坐标系要统一。如果开始没有对齐,后面过程会出现“物体原地消失,又绕另外一点旋转”的诡异情况。
3.2 第二步:建立视频与3D对象之间的空间对应
视频里的运动是在图像像素层面观测的;3D对象的运动则需要重建到三维空间。要让两者对齐,至少有一个中间表示,比如:
- 通过视频分割提取前景物体mask;
- 估计视频中物体的深度或3D坐标;
- 用相机姿态或视差信息把每帧像素反投影到点云;
- 在目标3D模型表面找到和视频采样点对应的最近点。
这一步很容易出现“全局对齐了,局部没对齐”的现象。比如提取到了视频中一个人挥舞手臂的动作,但迁移到卡通角色时,手臂长度和肩宽不同。如果只做刚性对齐,手的位置会整体偏掉;如果有局部对应关系,还要额外处理尺度非均匀的问题。
所以,很多方案不是直接从mesh到视频像素,而是先把目标3D模型投影到某个2D空间,然后与视频帧做特征匹配。这样就变成了一个“2D视觉特征匹配”的问题,可以使用光流、特征匹配、分割网络来辅助计算对应关系。
当然,这一部分正是最容易在复现论文时崩溃的地方。一个常见理解误区是:模型网络应该自己解决这些问题。实际上,解决对应关系通常需要依赖外部数据,比如视频有真实相机姿态、有mask标注,或者目标模型被预渲染出多张不同视角的参考图。没有这些数据,单靠一个自监督网络从头学非常难。
3.3 第三步:在视频中提取并优化潜在刚体运动基元
对应关系建立后,下一步就是驱动训练或优化。
对于每一段连续视频帧,系统需要从视觉信号里估计出:
- 当前目标物体各组成部分的运动参数;
- 每一个空间位置受哪些运动基元影响;
- 每帧之间运动变换是否平滑。
一种可行的抽象流程可以写成下面这种伪代码,它只是一个理解框架,不是某个具体模型的官方实现:
for video in dataloader: frames = sample_video_frames(video) features = encoder(frames) primitives, weights = motion_encoder(features) deformed_mesh = blend(target_mesh, primitives, weights) rendered = differentiable_render(deformed_mesh) loss = photometric_loss(rendered, frames) loss += rigid_reg(primitives) + smooth_reg(primitives, weights) loss.backward() optimizer.step()这里最关键的不是网络结构用了几个transformer层,而是“loss怎么设计”。如果只有像素重建误差,网络往往会忽略运动表达,直接生成一个能骗过渲染器的外观,而不是真正合理地让3D对象运动。经验之谈是,下面几类约束比精度还重要:
- 每个基元变换必须严格落在旋转和平移空间内;
- 混合权重必须保证空间平滑,并且尽量稀疏;
- 在时间维度上,运动速度和加速度不能剧烈跳变;
- 局部刚体约束要有容错边界,因为柔性布料、肌肉隆起不代表所有地方都能刚性拟合。
换句话说,运动基元的表达稳定性,很大程度不靠增加参数量,而是靠这些先验约束把解空间压窄。
3.4 第四步:混合、渲染与重定向到目标对象
当模型已经能在源视频中估计出一套运动基元后,最后要做的就是迁移。这里的“迁移”包含两层含义:
第一层,把整套运动应用到训练时已经见到的同一个3D对象上,形成一个重建后的动态3D内容。这一层更像“动态重建”,意味着你已经生成了对应视频的新视角渲染。
第二层,把通过学习得到的运动基元迁移到新的3D对象,这套对象在训练中没有以这个姿态出现过。这一步才是真正发挥价值的场景:目标模型和视频源物体可能完全不同,只要求运动基元在语义上可对应。
要做到第二层,通常还需要一个重定向层。想象视频里是一个传统的人形模特,目标模型是一个比例怪异的卡通形象。如果直接把源运动基元原样作用到目标模型上,很可能出现肘部过度旋转、手部插进大腿之类的问题。合理的方式是引入关节角度限制、目标姿态偏好或运动重定向模块。
当前很多研究工作依然在“同一个物体”或“一类物体”上测试;跨物种、跨结构的大跨度迁移,属于非常前沿的方向。因此在读论文、评测开源项目的时候,应该分清楚:这个模型是“重建了视频中这个物体的动态3D”,还是“提取了可迁移的运动模型并应用到了新物体”。
4. 如果准备动手复现或验证,试试这套“最小试错框架”
很多人看论文会记住整体结构,然后直接拿真实视频跑,最后得到一团扭曲的mesh,找不到问题在哪。我建议用下面这个递进式框架,每一步都先确认输入和输出是否干净,再往下一步推进。
4.1 先做单刚体,再做双刚体,最后才做连续形变
第一轮实验,不要一上来就挑战人穿衣服走路。用这种视频最容易:
- 一个不缩放的玩具小车在桌面移动;
- 一台机械臂固定底座,只转动单个关节;
- 一个静态背景下的茶壶绕固定轴旋转。
这些场景里,运动本身可以非常容易被一个刚体变换或两个刚体变换解释。你先验证最基础链路:视频输入 -> 对应点 -> 估计旋转平移 -> 混合权重 -> 渲染。只要这个链路能把绿色玩具车转换成红色玩具车的运动,就已经证明基础流程是通的。
第二轮实验,再加两个部件之间的铰接或遮挡,比如四足玩具上的腿部摆动。这可以暴露“运动基元分配”的问题:哪个顶点属于哪个部件,过渡区域如何处理。
第三轮实验,再挑战复杂运动。先让系统在这个数据上成功拟合,才能谈快速泛化。
4.2 数据质量检查表
下面是几条我在类似任务中一定会检查的内容,建议在做“从视频学3D运动”类实验前先过一遍:
| 检查维度 | 待确认的问题 | 最可能造成的现象 |
|---|---|---|
| 视频时长 | 是否大于10秒?是否有足够视角变化? | 深度/运动基元退化解 |
| 相机姿态 | 是否固定?如果运动,是否有真实内参/外参? | 物体被误识别为相机运动 |
| 前景分割 | 是否精确?是否把阴影或背景物体算入? | 背景点被赋予运动,整体漂移 |
| 物体尺度 | 源物体与目标模型之间比例是否一致? | 迁移后动作幅度失真 |
| 遮挡程度 | 是否有长时间自遮挡?是否有外部遮挡? | 被遮挡部分的运动参数发散 |
| 初始对齐 | 目标模型与视频首帧是否已对齐? | 训练初期loss不下降,或结果完全错乱 |
这些检查之所以重要,是因为“视频驱动3D运动”非常依赖多模态信息之间的对齐。一个不精确的相机估计,就足以让整段程序无论如何优化都得不到干净结果。
4.3 复现代码时的排查顺序
如果看到结果出了诡异问题,不要先调模型结构,按这个顺序查:
- 看数据流。保存训练过程中的中间量,包括分割mask、对应点、估计出的基元变换和混合权重,确认哪个环节首次出现异常。
- 看相机与网格坐标系。把源物体的第一帧投影到图像并保存为jpg,肉眼核对是否重合。经常出现坐标系左右翻转、Z轴方向不一致的问题。
- 看变换是否被正则限制。如果直接使用的线性矩阵没有重新投影到SO(3),几轮训练后会出现缩放变形,看似是网络表达问题,实际是参数化问题。
- 看混合权重是否在空间上平滑。如果权重图出现椒盐噪声,大概率在网络输出后缺少平滑损失或空间注意力。
- 最后才看网络结构。很多不收敛现象,在简化数据上也会出现,这时候减少基元数量或增大权重稀疏惩罚往往比加深网络更有用。
4.4 用一个最小实验评估迁移质量
做完一次迁移后,怎么判断效果到底是好还是坏?不能只靠肉眼。建议观察五类指标:
- 时序一致性:相邻帧变换是否平滑,是否出现剧烈抖动。
- 刚体保持度:把源模型上同一个局部区域多个点追踪下来,它们的距离是否在运动中近似不变。
- 渲染重投影误差:用预估相机把变形后的3D模型投影回视频帧,是否和原视频前景轮廓对得上。
- 权重连续性:同一顶点在相邻帧中的混合权重变化是否过大。
- 交叉迁移稳定性:把同一段运动从一个模型迁移到另一个同拓扑模型,变形结果是否有明显局部走形。
如果这些都通过,才说明方案具备了可重复验证的基础。
5. 这个方向能取代传统绑定吗:应用边界与长期影响
5.1 最适用的场景与不适合的场景
先说结论:BLARM这类“视频驱动运动基元”的研究,目前更适合做自动化辅助,而不是立刻取代商业级动画绑定。
适合的场景有:
- 机械运动、刚体占主导的产品展示;
- 四足或双足机器人的动作仿真;
- 已有大量3D模型但缺少动作资产的素材库;
- 希望把真实世界一段动作快速变成视觉原型,而精度要求不极高。
不适合的场景也很明显:
- 柔软布料、流体、肌肉颤动等大范围非刚性形变;
- 多个物体互相接触碰撞且需要物理一致性;
- 源物体与目标模型差异特别大,且没有额外语义标注;
- 对动作精度有严格要求的电影级制作。
在这些场景里,刚性基元假设提供的先验太强了。如果非要用,就需要增加额外的表面形变编码器或物理损失,但那已经接近另一个研究方向。
5.2 对工具链和工作流意味着什么
即使不能完全取代传统绑定,这类方案也会改变内容生产流程。
以前拿到一个3D模型,要先判断它能不能复用公司的动作库。如果模型比例变了,甚至只是手指数量变了,很多动作会直接失效。以后,动作层面可能不再以“骨骼名称”为单位,而以“潜在刚体运动基元”为单位。模型之间的动作迁移,不再需要严格对应“Joint A到Joint B”,而是由网络自动寻找空间对应。
同时,它与新的渲染工具结合会更顺滑。现在3D重建社区已经从“静态神经辐射场”慢慢走向3D高斯泼溅,这里面的大量动态场景同样需要把运动拆成基元再混合。BLARM里的思路,对动态高斯泼溅、可微渲染、游戏引擎里的动画驱动都有借鉴意义。
它不是要端掉动画师的饭碗,而是把最繁琐的“权重调试和动作重定向”缩减成“预设约束加结果检查”。对于独立开发者和小团队,这是一个明显降低门槛的方向。
5.3 从更长的时间尺度看,这条路线值得持续关注
回头再看BLARM这个标题,它能带来的启发其实超过一个模型本身:
第一,把连续且复杂的运动,拆成离散且有约束的刚体组件,会让问题变得更容易收敛、更容易控制。这种拆解法在三维视觉和图形学里会反复出现。
第二,视频天然同时提供了形状、运动和语义,但要真正跨物体迁移,必须找到运动表征与几何表征之间的“转接口”。Latent Rigid Motion Primitives就是这样一个转接口,它不是传统骨骼,也不是像素光流,而是介于两者之间的一种可优化表达。
第三,这类方案最大的工程价值,不是“节省几小时K帧时间”,而是让动作资产可以沉淀下来。一旦目标3D模型与视频源物体都映射到同一套潜在刚体运动空间,一套动作就能被任意能用这套基元解释的模型所用。
所以,如果你正在做三维重建、动作迁移或产品级自动化动画,我的建议是:别把BLARM只看成一篇论文,而是把它当作一套“如何把复杂运动变成可复用部件”的设计范式。从最小场景开始,先拟合一个刚体,再拟合两个刚体,然后再触碰困难场景。这个方法跑通之后,你会发现很多所谓“需要高深网络才能解决”的问题,往往只是因为你还没把动作拆到这个粒度。