你在做VTuber动画或虚拟角色游戏吗?
有没有遇到过这种情况:在Mixamo下载了一个超棒的动作,结果导入VRM后角色直接散架——骨骼对不上、表情全乱、有些平台能播有些平台不能播。
这是虚拟形象动画领域的长期痛点:每个平台的骨骼格式不一样,动作数据无法复用。
VRMA格式,就是为了解决这个问题而生的。
VRMA是什么
VRMA(文件扩展名.vrma)是VRM联盟在2024年2月正式发布的标准化虚拟形象动画格式,全称是VRMC_vrm_animation,版本1.0。
它的核心思路非常直接:
把你做的动作动画,用一种标准格式描述,而不是跟某个具体模型绑定。
实现方式是基于glTF 2.0——这是3D行业的通用交换格式。VRMA在glTF的基础上添加了一个扩展(VRMC_vrm_animation),用来描述哪些骨骼对应VRM的哪个部位、表情BlendShape怎么驱动、视线看向哪里。
这样一来,只要是一个标准VRM模型,不管是谁做的,都可以直接播放同一个VRMA动画文件——不需要重新绑定,不需要手动配置。
这就是为什么VRMA被业内称为"虚拟形象动画的USB接口"。
VRMA和BVH/FBX/VMD有什么区别
| 格式 | 平台相关性 | 表情支持 | 跨平台可用性 |
|---|---|---|---|
| BVH | 无关(纯骨骼数据) | ❌ 不支持 | 需转换,复杂 |
| FBX | 强绑定(Autodesk生态) | ⚠️ 有限 | 需转换,复杂 |
| VMD(MMD专用) | 强绑定(MMD生态) | ✅ 支持 | ❌ 仅限MMD生态 |
| VRMA | 无关(标准化) | ✅ 完整支持 | ✅ 所有VRM平台通用 |
BVH是最通用的原始格式,几乎所有动作捕捉硬件都支持输出BVH,但BVH本身不包含任何骨骼语义的描述——它只知道"转了90度",不知道转的是哪根骨头。VRMA就是在BVH的基础上加了一层语义标注。
核心概念:三件事
VRMA动画由三个核心部分组成:
骨骼映射(Humanoid Bones)
VRMA定义了52个标准化骨骼——26个核心骨骼(躯干+四肢)+ 26个手指骨骼。每个骨骼都有明确的名称:hips、spine、head、leftUpperArm……
制作VRMA动画时,需要告诉格式"我这根glTF节点对应的是哪个VRM骨骼"。这一步叫做骨骼映射,是VRMA制作中最关键的一步。
好消息是:如果你用VRM Add-on for Blender,所有这些都自动处理好了。
表情动画(Expressions)
VRMA支持直接编码表情BlendShape的权重动画。比如一个"微笑"动作,可以直接存储为BlendShape权重从0到1的关键帧动画,不需要骨骼参与。
表情名称遵循VRM 1.0标准:happy、sad、angry、surprised、blink……如果你用的是VRM 0.x模型,需要做一次名称映射。
视线控制(LookAt)
VRMA内置了视线追踪配置。可以指定眼球看向特定坐标,也可以配置眼球旋转角度范围。这个功能在VTuber实时应用中非常重要——让角色自然地看向观众或场景中的物体。
十分钟实操:Blender端
准备工作
需要安装:
- Blender 3.6 LTS或4.0+
- VRM Add-on for Blender(v3.17.1+)
安装Add-on:Blender → Edit → Preferences → Add-ons → Install → 选择下载的zip文件 → 启用"VRM-Addon-for-Blender"
步骤一:导入VRM模型
File → Import → VRM (.vrm) → 选择你的VRM文件
导入后,VRM Add-on会自动创建Humanoid骨架。如果你从Mixamo下载过动作,接下来要建立骨骼映射。
步骤二:导入BVH动作
Mixamo的动作可以直接以FBX格式下载,Blender对FBX支持良好:
File → Import → FBX (.fbx) → 选择你的动作文件
关键问题:Mixamo的骨骼命名(mixamorig:Hips)和VRM的骨骼命名(hips)不一致,需要建立映射。
好消息是:VRM Add-on for Blender有自动检测功能,大多数情况下能自动匹配。如果自动检测失败,参见下文的52骨骼映射表手动配置。
步骤三:配置骨骼映射(关键)
在Blender右侧属性面板找到 Object Data Properties → VRM Humanoid:
这里列出了52个VRM标准骨骼名称。每一行的Bone列,需要手动指定对应的实际骨骼节点名称。
如果你用的是Mixamo动作,参考下表进行映射(这是业界最完整的Mixamo→VRM骨骼映射):
| Mixamo骨骼 | VRM骨骼 | 必需 |
|---|---|---|
| mixamorig:Hips | hips | ✅ |
| mixamorig:Spine | spine | ✅ |
| mixamorig:Spine1 | chest | ✅ |
| mixamorig:Neck | neck | ✅ |
| mixamorig:Head | head | ✅ |
| mixamorig:LeftArm | leftUpperArm | ✅ |
| mixamorig:LeftForeArm | leftLowerArm | ✅ |
| mixamorig:LeftHand | leftHand | ✅ |
| mixamorig:LeftUpLeg | leftUpperLeg | ✅ |
| mixamorig:LeftLeg | leftLowerLeg | ✅ |
| mixamorig:LeftFoot | leftFoot | ✅ |
手指骨骼(左手/右手各15根)映射方法相同,在VRM Humanoid面板中依次对应填入即可。
步骤四:导出VRMA
File → Export → VRM Animation (.vrma)
导出版本选择VRMA 1.0,帧率推荐30fps。导出选项中确保以下内容被勾选:
- ✅ Export Humanoid Bone Mapping(骨骼映射)
- ✅ Export Blend Shape(表情动画,如果包含的话)
- ✅ Export Look At(视线控制,如果包含的话)
导出会根据你配置的骨骼映射,自动生成正确的VRMA文件。
验证方法:用任何支持VRMA的播放器(如VRoid Hub网页端)打开导出的.vrma文件,检查动画是否正常播放。
十分钟实操:Unity端
准备工作
- Unity 2021.3 LTS或2022.3 LTS
- UniVRM 0.122.0+(通过Unity Package Manager安装:
com.vrmc.univrm@0.122.0)
步骤一:导入VRM
把你准备好的VRM文件放入Assets/Models/目录,Unity会自动识别并导入。如果需要程序化导入:
using UnityEngine;
using VRM;
public class VRMLoader : MonoBehaviour
{
async void Start()
{
var bytes = File.ReadAllBytes("Assets/Models/avatar.vrm");
var context = new VRMImporterContext();
context.Load(bytes);
context.ShowMeshes();
var go = context.Root;
go.transform.SetParent(transform);
}
}
步骤二:导入BVH动画
UniVRM内置了BVH导入支持。在Unity Asset Store搜索并导入BVH Importer,或者直接通过代码:
var bvhContext = new BVHImporterContext();
bvhContext.Parse("Assets/Animations/motion.bvh");
var bvhObject = bvhContext.Load();
步骤三:转换并播放VRMA
UniVRM提供了VRMA Converter,可以直接处理BVH→VRMA的转换(实验性功能)。转换完成后,动画会挂载到目标VRM模型的对应骨骼上。
var converter = new VRMAConverter(bvhObject, vrmTarget, boneMapping);
var vrmaBytes = converter.Convert(frameRate: 30, exportLookAt: true);
File.WriteAllBytes("Assets/Exports/animation.vrma", vrmaBytes);
播放VRMA动画:
var clip = VRMAAnimationLoader.LoadAnimationFromFile("Assets/Exports/animation.vrma");
var controller = new AnimatorController();
controller.AddAnimationClip(clip);
GetComponent<Animator>().runtimeAnimatorController = controller;
Web端:three-vrm-animation
Web端播放VRMA用@pixiv/three-vrm-animation,这是VRM Consortium官方维护的Web SDK。
核心流程只有三步:
// 1. 加载VRM模型
const vrm = await loader.load('/models/avatar.vrm');
// 2. 加载VRMA动画
const animation = await loader.load('/animations/motion.vrma');
// 3. 播放
const mixer = new THREE.AnimationMixer(vrm.scene);
mixer.clipAction(animation).play();
完整示例:加载模型后等待userData.vrm可用,再用VRMAnimationLoaderPlugin加载.vrma文件。动画混合(AnimationMixer)和Three.js原生动画系统完全兼容,可以实现平滑的淡入淡出切换。
常见问题
Q:骨骼映射时提示"骨骼未找到"
检查是否正确导入了VRM Add-on,以及你的动作文件骨骼命名是否被Blender修改过。有时候骨骼名称末尾会被Blender自动添加.001之类的后缀。
Q:导出的VRMA在某些平台无法播放
确认你的VRM模型版本(0.x还是1.0)。VRMA 1.0与VRM 1.0完全兼容,但与VRM 0.x的兼容需要做表情名称映射(参见附表)。
Q:手指动画看起来很怪
手指骨骼是最容易出问题的地方。确保52个骨骼全部映射完整,手指末端骨骼尤其容易遗漏。
Q:BVH原始姿态不是T-Pose,转换后角色歪了
BVH导入工具(如bvh2vrma)有T-Pose自动校正功能。如果自动检测失败,需要手动指定T-Pose参考帧。具体参数可查阅工具文档中的tPoseCorrection配置项。
下一步
现在你已经掌握了VRMA的基础概念和三个平台的实操流程。接下来可以深入:
- 使用Three.js在网页端构建完整的VTuber播放应用
- 在Unity中利用Animation Rigging实现更复杂的动画混合
- 研究表情动画的高级编辑——让角色的表情更加生动
参考资源
Xmohe Techie:VRM换装技术从入门到精通——进阶换装方案,包含Modular Avatar和VRoid Studio完整对比
- VRM Consortium官方——VRM格式规范、工具下载、开发者文档
- @pixiv/three-vrm-animation GitHub——Web端VRMA播放SDK
- UniVRM GitHub——Unity端VRM/VRMA完整支持