如果让你给一只章鱼设计走路的动作你会怎么做它有八条腿没有骨头你该先迈哪条再换一个一条蛇怎么跑一只老鹰怎么落地一个机器人大白怎么打架这些问题在动画和游戏行业里有个朴素的答案找动画师一帧一帧手调。一个角色几天甚至几周。换一个角色一切重来。而最近普林斯顿大学、加州大学伯克利分校、MIT、南洋理工的研究者联合发表了一项工作名字叫UniMate已经被计算机图形学顶会SIGGRAPH Asia 2026接收。它做的事用一句话就能说清给它一个 3D 角色再写一句话它就能让这个角色动起来。不管这个角色是人、猫、鲨鱼、鸟、蛇还是一把会开合的剪刀。普林斯顿、伯克利、MIT 联手让鲨鱼、老鹰、大白用同一个 AI 大脑动起来等等这不是早就有了吗你可能会说AI 生成动作不是早就有了吗确实有但有一个大坑以前的 AI 是偏科生。打个比方。以前的模型像一个只会做川菜的厨师你让他做粤菜他会懵你给他一堆粤菜食材他得先回炉重造一遍也就是研究里说的针对每种骨架重新训练、或者需要参考动作。原因很简单不同生物的骨架长得完全不一样。人有两条腿、两只手猫有四条腿和一条尾巴蛇是一长串关节鸟有翅膀昆虫的腿多得数不过来。AI 习惯处理规整的数据而骨架的形状千奇百怪没法塞进同一个模子。所以过去的方法要么只能做人要么每种动物单独训练一个模型。UniMate 的野心是一个模型通吃所有骨架。而且论文强调推理时不需要针对每个骨架重新训练也不需要现场优化。它能做到实时生成。它到底能干嘛1. 同一句话不同角色各演各的输入走路人类走得像人四足动物走得像动物每个角色都按自己的骨架结构来动而不是生硬地套同一套动作。2. 同一个角色不同台词随心换给大白对就是那个充气机器人、老鹰、鲨鱼分别输入不同指令它们都能生成符合描述的动作。3. 同一个角色同一句话每次还不一样这点很关键。真实的生物不会每次走得一模一样UniMate 每次生成的动作既符合描述又各有变化。4. 三个零样本小技能不用额外训练直接复用同一个模型动作编辑原动作是站着转头你只想保留转头让身体改成向前走它能做到头不动身体换。动作补间给个起始姿势和结束姿势再写一句蹲下再站起来中间的过程它自己补全。动作续写连续输入起飞 → 向前冲 → 降落一只鸟的连贯飞行动作就接出来了。如果你是做游戏、动画、短视频特效的是不是已经开始坐不住了所以动画师要失业了吗短期内不会。原因有三论文解决的是让任意骨架有个靠谱的基础动作而不是替代导演的艺术判断。影视级的表演、情绪、风格仍然需要人来把关。这是学术成果离稳定好用的商业工具还有距离官方代码也尚未完全开放。它自己的数据里都有人工逐条审核的环节说明高质量动作离不开人的参与。但长期会改变分工过去动画师花大量时间做从零到六十分的体力活未来这部分很可能被 AI 接手人去做六十分到一百分的创意活。对独立游戏开发者、小团队来说这反而是好事。以前养不起动画师的人终于有机会让自己的怪物活起来了。它为什么能做到前面是科普下面是干货。一、核心难题怎么让 AI 看懂骨架的形状UniMate 用的是拓扑感知的扩散 TransformerTopology-aware Diffusion Transformer。扩散模型你可能听过Stable Diffusion 画图就是它。Transformer 就更熟了ChatGPT 的底座。UniMate 把二者结合起来生成动作关键创新是让注意力机制知道骨架的连接结构。论文提出了三个机制① 图感知的注意力偏置Graph-aware attention bias基于关节之间的成对关系和测地距离沿着骨架走的距离而不是直线距离来调整注意力。通俗说肩膀和手肘离得近注意力就该亲一点脚趾和头顶离得远就该疏一点。② 谱旋转位置编码Spectral RoPE这是最有意思的一点。RoPE 是大语言模型里常用的位置编码但它是为一维序列设计的词有先后顺序。可骨架是一棵树没有天然的第几个。论文把 RoPE 推广到了任意运动学树上借助的是图拉普拉斯矩阵Graph Laplacian。③ 全局拓扑条件器Global topological conditioner从静止姿态rest pose的骨架里通过注意力池化提取一个整体骨架特征告诉模型你现在要驱动的是一条蛇不是一个人。二、数据13,006 条动作是怎么洗出来的光有模型不够还得有多才多艺的训练数据。作者整合了 Truebones、Mixamo、Objaverse-XL 三个来源构建了UniML3D13,006 条带文本描述的动作序列覆盖两足、四足、鸟类、海洋生物、昆虫、蛇形和关节刚体。但原始数据脏得惊人骨架断开、根节点错位、有的关节根本不动、动作违反物理、坐标系和朝向不统一。项目页公开了一套16 步的清洗流程分三个阶段阶段做了什么过滤只保留主骨架树用正向运动学校正根节点删掉 IK 控制器等幽灵关节剔除静止、抖动、速度异常的片段标注用 LLM 统一关节命名用 LLM 选出左右对称关节对来判断朝向30FPS 重采样并四视角渲染用多模态 LLM 写描述最后人工逐条审核规范化广度优先序列化骨架树按拓扑直径缩放统一到 y 轴向上、初始根在原点朝向对齐到 z旋转表示相对静止姿态做特征归一化这一套下来才让一只章鱼和一个人的数据能放进同一个模型里训练。三、代码长什么样先声明官方的训练/推理代码尚未发布。下面第一部分是官方已公开的环境配置第二、三部分是根据论文描述写的概念示意用来帮助理解思路不是官方实现细节以论文和后续开源代码为准。官方已公开环境搭建..Pythonconda create -n unimate python3.10 -yconda activate unimatepip install setuptools81pip install -r requirements.txt --no-build-isolation示意代码 1图感知注意力偏置概念示意思路用骨架树上的最短路径距离给注意力分数加一个距离惩罚。...Pythonimport torchimport torch.nn as nnclass GraphBiasedAttention(nn.Module):def __init__(self, dim, heads8):super().__init__()self.h headsself.qkv nn.Linear(dim, dim * 3)self.out nn.Linear(dim, dim)# 每个注意力头学一个距离衰减系数self.dist_scale nn.Parameter(torch.zeros(heads))def forward(self, x, geo_dist):# x: (B, J, D) J 个关节# geo_dist: (B, J, J) 关节间的测地距离沿骨架走的距离B, J, D x.shapeq, k, v self.qkv(x).chunk(3, dim-1)q, k, v [t.view(B, J, self.h, -1).transpose(1, 2) for t in (q, k, v)]attn (q k.transpose(-1, -2)) / (q.shape[-1] ** 0.5)# 离得越远注意力越被压低偏置对每个头可学习bias -self.dist_scale.view(1, -1, 1, 1) * geo_dist.unsqueeze(1)attn (attn bias).softmax(dim-1)out (attn v).transpose(1, 2).reshape(B, J, D)return self.out(out)示意代码 2用图拉普拉斯给骨架编号概念示意思路骨架没有第几个但图拉普拉斯的特征向量能给每个关节一个反映其结构位置的坐标再用它去做类似 RoPE 的旋转。...Pythonimport torchdef laplacian_positions(adj, k8):adj: (J, J) 骨架邻接矩阵 - 每个关节的 k 维结构坐标deg torch.diag(adj.sum(-1))L deg - adj # 图拉普拉斯eigvals, eigvecs torch.linalg.eigh(L)return eigvecs[:, 1:k 1] # 去掉平凡的第 0 个特征向量def spectral_rotary(x, pos, base10000.0):x: (J, D), pos: (J, K)用结构坐标代替序列下标做旋转J, D x.shapeK pos.shape[1]half D // 2# 把 D/2 个频率分配给 K 个谱坐标freqs base ** (-torch.arange(half) / half)theta pos[:, torch.arange(half) % K] * freqs # (J, half)x1, x2 x[..., :half], x[..., half:2 * half]return torch.cat([x1 * theta.cos() - x2 * theta.sin(),x1 * theta.sin() x2 * theta.cos()], dim-1)说明特征向量存在符号和重根的不确定性真实实现需要额外处理论文里应有更严谨的做法这里只展示核心想法。示意代码 3零样本编辑的原理概念示意论文提到编辑、补间、续写都是同一个预训练模型区别只在于采样时固定哪些动作 token。这和图像修复inpainting的思路很像...Pythontorch.no_grad()def sample_with_constraint(model, skeleton, text, known, mask, steps50):known: 已知动作比如保留的头部转动 / 起止姿势mask : 1 表示固定不动0 表示让模型自由生成x torch.randn_like(known)for t in reversed(range(steps)):x model.denoise_step(x, t, skeleton, text) # 正常去噪一步noisy_known model.add_noise(known, t) # 把已知部分加同等噪声x mask * noisy_known (1 - mask) * x # 已知部分钉死return x动作编辑mask 钉住头部关节其余自由生成动作补间mask 钉住首尾帧动作续写mask 钉住上一段的末尾帧。一个模型三种玩法这也是统一基础模型的魅力所在想自己上手玩交互式 Demo项目页提供网页版 3D 展示可以直接拖拽旋转看结果还支持拖入 .fbx / .glb / .gltf 文件预览数据集 UniML3D已在 Hugging Face 发布配套数据处理代码已开源MIT 协议注意版权其中 Truebones 动物动作是商业素材包不允许再分发需要自行购买Mixamo、Objaverse-XL 也各自遵循原有许可训练与推理代码官方标注即将发布最后回到开头那个问题怎么让一条蛇走路过去的答案是找一个懂蛇的动画师花几天。UniMate 给出的新答案是写一句话。当然距离人人都能一键让万物起舞还有一段路。但每一次让 AI 少一点偏科创作的门槛就低一点。更多transformerVITswin tranformer 参考头条号人工智能研究所 v号人工智能研究Suo, 启示AI科技动画详解transformer 在线视频教程