PMX 转 VRM 完整指南:把 MMD 模型变成桌面角色
从 MMD 生态的 PMX 格式,到 VRM 1.0 标准,这篇指南基于 VRM 官方规范,讲清骨骼映射、表情系统、MToon 材质和 Spring Bone 物理的完整转换流程。最终目标只有一个:得到一个能导入 AniMate、放在桌面上的 `.vrm` 文件。
为什么要把 PMX 转成 VRM?
PMX 是 MMD(MikuMikuDance)生态的标准模型格式,承载着无数创作者精心雕琢的角色。但 PMX 的核心局限也很明显:它主要服务于 MMD 动画制作,在其他场景中使用受限。
VRM 则是专为虚拟角色设计的开放 3D 格式,在 VTuber 直播、VRChat、桌面伴侣等领域被广泛支持。将 PMX 转为 VRM 后,你的模型可以:
- 在 萌灵 AniMate 等桌面伴侣中“活”起来:待机、互动、对话、跳舞。
- 用于 VTuber 直播(VTube Studio、Warudo 等)。
- 在 VRChat 等 VR 社交平台中使用。
- 跨软件复用,一次转换,多平台通用。
简单说:PMX 是给 MMD 用的,VRM 是给“所有地方”用的。
两种转换方案一览
| 方案 | 工具 | 适合人群 | 难度 | 推荐度 |
|---|---|---|---|---|
| 方案 A:Blender | Blender + VRM Addon | 有 Blender 基础或愿意学的人 | ★★★ | ⭐⭐⭐⭐⭐ 推荐 |
| 方案 B:Unity | Unity + MMD4Mecanim + UniVRM | 有 Unity 基础的人 | ★★★★ | ⭐⭐⭐ |
VRM 格式技术原理:理解你在转换什么
在动手转换之前,理解 VRM 的技术架构,能帮你避开绝大多数转换陷阱。这一节是整篇指南的理论基础,后续每一步操作都与此相关。
VRM 不是全新格式,而是 glTF 2.0 的扩展
VRM 并非从零发明的格式,而是基于 glTF 2.0(Khronos Group 制定的 3D 传输标准)的扩展集合。VRM 文件本质上是一个 `.glb` 二进制文件,只是使用 `.vrm` 作为扩展名,并在 glTF 的 `extensions` 字段中注入 VRM 专属扩展:
extensionsUsed: [
"VRMC_vrm", // VRM 核心扩展
"VRMC_materials_mtoon", // 卡通材质
"VRMC_springBone", // 弹簧骨骼物理
"VRMC_node_constraint", // 节点约束
"KHR_materials_unlit", // 无光照材质(辅助)
"KHR_texture_transform", // 纹理变换(辅助)
]
任何支持 glTF 2.0 的渲染器,只要实现上述扩展,就能加载 VRM 模型,这正是 VRM 能跨平台通用的底层原因。
VRM 的五大核心子系统
| 子系统 | 字段 | 作用 | 是否必需 |
|---|---|---|---|
| Humanoid(人形骨骼) | humanoid | 将 glTF 节点映射到标准化人体骨骼 | ✅ 必需 |
| Meta(元数据) | meta | 模型名称、作者、版本、许可证 | ✅ 必需 |
| FirstPerson(第一人称) | firstPerson | VR 中头部网格的显示 / 隐藏设置 | 可选 |
| Expressions(表情) | expressions | 面部表情系统(0.x 称 BlendShape) | 可选 |
| LookAt(视线追踪) | lookAt | 眼球跟随目标的视线控制 | 可选 |
系统执行顺序:为什么排列顺序很重要
VRM 规范定义了严格的子系统执行顺序。每一帧的更新循环中,各子系统按以下顺序依次求值:
1. Humanoid 骨骼求解
↓ (头部位置确定后)
2. LookAt 视线求解
↓ (Bone 类型旋转眼球 / Expression 类型设置权重)
3. Expression 表情更新
↓ (外部输入 → LipSync → AutoBlink → LookAt 类型表情)
4. Expression 应用
↓ (所有表情权重累积后统一应用)
5. Constraints 节点约束求解
↓ (如旋转约束、IK 约束等)
6. Spring Bone 弹簧骨骼物理求解
VRM 0.x 与 VRM 1.0:版本差异
| 维度 | VRM 0.x | VRM 1.0 |
|---|---|---|
| 表情系统名称 | BlendShape | Expression(重命名) |
| 表情权重范围 | 0–100 | 0–1 |
| 情绪表情命名 | joy、sorrow、fun | happy、sad、relaxed |
| “惊讶”表情 | 无 | 新增 surprised |
| 表情绑定类型 | 主要基于 MorphTarget | MorphTargetBind + MaterialColorBind + TextureTransformBind |
| 表情冲突处理 | 未规范 | 引入 Override 系统(block / blend 模式) |
| 扩展名前缀 | 无统一前缀 | VRMC_ 前缀 |
| chest 骨骼 | 必需 | 可选 |
| neck 骨骼 | 必需 | 可选 |
官方参考资源
| 资源 | 地址 | 用途 |
|---|---|---|
| VRM 官方网站 | vrm.dev | 格式概览、工具列表、应用案例 |
| VRM 规范仓库 | github.com/vrm-c/vrm-specification | 完整技术规范(JSON Schema + 文档) |
| UniVRM(Unity 实现) | github.com/vrm-c/UniVRM | Unity 的 VRM 导入导出库 |
| VRM Addon for Blender | github.com/saturday06/VRM-Addon-for-Blender | Blender 的 VRM 插件 |
方案 A:Blender + VRM Addon
第一步:环境准备
| 工具 | 版本要求 | 下载地址 |
|---|---|---|
| Blender | 3.6+,推荐 4.2+ | blender.org |
| VRM Addon for Blender | 最新版 | GitHub |
| MMD Tools(可选) | 最新版 | Blender 插件市场搜索安装 |
| CATS Blender Plugin(可选) | 最新版 | GitHub 搜索下载 |
安装 VRM Addon
- 打开 Blender,进入菜单栏 Edit → Preferences。
- 选择 Add-ons 标签页,点击右上角 Install...。
- 选择下载的 VRM Addon `.zip` 文件,点击 Install Add-on。
- 在插件列表中找到 VRM,勾选启用。
安装 MMD Tools(用于导入 PMX)
- 同样在 Preferences → Add-ons → Install 选择 MMD Tools 的 `.zip` 文件。
- 安装并启用插件。
- 安装后,Blender 的 File → Import 菜单会多出
MikuMikuDance Model (.pmx/.pmd)选项。
第二步:导入 PMX 模型
- 执行 File → Import → MikuMikuDance Model (.pmx/.pmd)。
- 在文件浏览器中选中你的 `.pmx` 模型文件。
- 导入后检查模型完整性:所有网格是否完整导入、材质和贴图是否正确加载、骨骼结构是否完整。
第三步:骨骼映射(最关键的一步)
PMX 和 VRM 使用不同的骨骼系统。VRM 要求 Humanoid(人形)骨骼,也就是标准化的骨骼结构。这一步就是把 PMX 的骨骼映射到 VRM 的标准骨骼上。
- 选中模型的 Armature(骨骼对象)。
- 在右侧属性面板找到 VRM 标签页。
- 点击 Create VRM Model,插件会自动尝试将 PMX 骨骼映射到 VRM 标准骨骼。
- 进入 Humanoid 面板检查映射结果。
骨骼映射参考:MMD → VRM
以下表格列出 MMD 标准骨骼名与 VRM Humanoid 骨骼的对应关系。加粗的为 VRM 必需骨骼,缺失会导致导出失败;其余为可选骨骼。
躯干与头部
| MMD 骨骼名(日文) | 对应身体部位 | VRM 标准骨骼 | VRM 1.0 必需? |
|---|---|---|---|
| 全ての親 | 根骨骼 / 胯部 | Hips | ✅ 必需 |
| 上半身 | 上半身 | Spine | ✅ 必需 |
| 上半身2 | 胸部 | Chest | 0.x 必需,1.0 可选 |
| 上半身3 | 上胸部 | UpperChest | 可选(需 Chest 存在) |
| 首 | 脖子 | Neck | 0.x 必需,1.0 可选 |
| 頭 | 头 | Head | ✅ 必需 |
| 左目 / 右目 | 左眼 / 右眼 | LeftEye / RightEye | 可选(视线追踪用) |
| あご | 下巴 | Jaw | 可选 |
腿部
| MMD 骨骼名(日文) | 对应身体部位 | VRM 标准骨骼 | VRM 1.0 必需? |
|---|---|---|---|
| 左足 | 左大腿 | LeftUpperLeg | ✅ 必需 |
| 左ひざ | 左小腿 | LeftLowerLeg | ✅ 必需 |
| 左足首 | 左脚踝 | LeftFoot | ✅ 必需 |
| 左つま先 | 左脚趾 | LeftToes | 可选 |
| 右足 | 右大腿 | RightUpperLeg | ✅ 必需 |
| 右ひざ | 右小腿 | RightLowerLeg | ✅ 必需 |
| 右足首 | 右脚踝 | RightFoot | ✅ 必需 |
| 右つま先 | 右脚趾 | RightToes | 可选 |
手臂
| MMD 骨骼名(日文) | 对应身体部位 | VRM 标准骨骼 | VRM 1.0 必需? |
|---|---|---|---|
| 左肩 | 左肩 | LeftShoulder | 可选 |
| 左腕 | 左上臂 | LeftUpperArm | ✅ 必需 |
| 左ひじ | 左前臂 | LeftLowerArm | ✅ 必需 |
| 左手首 | 左手腕 | LeftHand | ✅ 必需 |
| 右肩 | 右肩 | RightShoulder | 可选 |
| 右腕 | 右上臂 | RightUpperArm | ✅ 必需 |
| 右ひじ | 右前臂 | RightLowerArm | ✅ 必需 |
| 右手首 | 右手腕 | RightHand | ✅ 必需 |
手指(可选但推荐)
MMD 手指骨骼通常命名为 指0 到 指3,VRM 1.0 有完整的手指骨骼定义。手指骨骼不影响基本功能,但抓取、手势等手部动画很依赖它。
| VRM 手指骨骼 | 说明 |
|---|---|
| LeftThumbMetacarpal | 拇指掌骨 |
| LeftThumbProximal | 拇指近节 |
| LeftThumbDistal | 拇指远节 |
| LeftIndexProximal → Distal | 食指三节 |
| LeftMiddleProximal → Distal | 中指三节 |
| LeftRingProximal → Distal | 无名指三节 |
| LeftLittleProximal → Distal | 小指三节 |
右侧手指命名规则相同,把 Left 替换为 Right 即可。
VRM 1.0 Humanoid 骨骼层级树
每个 Humanoid 骨骼的父骨骼是固定的;如果中间骨骼不存在,则向上查找祖父骨骼。理解父子关系对排查映射问题至关重要:
root(非 Humanoid 骨骼,原点)
└── hips
├── spine
│ └── (chest)
│ └── (upperChest)
│ ├── (neck)
│ │ └── head
│ │ ├── (leftEye)
│ │ ├── (rightEye)
│ │ └── (jaw)
│ ├── (leftShoulder)
│ │ └── leftUpperArm
│ │ └── leftLowerArm
│ │ └── leftHand
│ └── (rightShoulder)
│ └── rightUpperArm
│ └── rightLowerArm
│ └── rightHand
├── leftUpperLeg
│ └── leftLowerLeg
│ └── leftFoot
│ └── (leftToes)
└── rightUpperLeg
└── rightLowerLeg
└── rightFoot
└── (rightToes)
hips 做位移,其他骨骼只做旋转;Humanoid 骨骼之间允许存在非 Humanoid 的中间节点;骨骼缩放分量必须为正值,零不被允许。如果自动映射失败
- 使用插件的 Auto Map 功能重新尝试。
- 在 Humanoid 面板中手动指定缺失的骨骼。
- 确认 PMX 骨骼命名是否符合 MMD 标准,日文骨骼名需正确对应。
第四步:表情设置(Expression / BlendShape)
VRM 模型需要标准表情,才能在桌面伴侣中正确显示面部动画:眨眼、说话、情绪表达都依赖于此。VRM 0.x 中称为 BlendShape,VRM 1.0 中重命名为 Expression,两者本质相同,但 1.0 的功能更完整。
情绪表情
| VRM 1.0 名称 | VRM 0.x 名称 | MMD morph 名 | 说明 |
|---|---|---|---|
happy | joy | 笑い | 开心 / 微笑 |
angry | angry | 怒り | 生气 |
sad | sorrow | 困る | 悲伤 |
relaxed | fun | にっこり | 放松 / 舒适 |
surprised | 0.x 无 | びっくり | 惊讶(VRM 1.0 新增) |
口型同步
| VRM 1.0 名称 | VRM 0.x 名称 | MMD morph 名 | 对应元音 |
|---|---|---|---|
aa | a | あ | あ(a) |
ih | i | い | い(i) |
ou | u | う | う(u) |
ee | e | え | え(e) |
oh | o | お | お(o) |
眨眼
| VRM 1.0 名称 | VRM 0.x 名称 | MMD morph 名 | 说明 |
|---|---|---|---|
blink | blink | まばたき | 双眼眨眼 |
blinkLeft | — | 左まばたき | 左眼单眨(1.0 新增) |
blinkRight | — | 右まばたき | 右眼单眨(1.0 新增) |
视线表情
| VRM 1.0 名称 | 说明 |
|---|---|
lookUp | 眼睛向上看 |
lookDown | 眼睛向下看 |
lookLeft | 眼睛向左看 |
lookRight | 眼睛向右看 |
leftEye/rightEye 骨骼,Expression 类型通过四个视线表情移动顶点或纹理偏移。大多数 MMD 模型用表情方式实现眼球转动,因为 MMD 的眼球通常是贴图。设置方法
- 在 VRM 面板中找到 BlendShape Master(VRM 0.x)或 Expressions(VRM 1.0)区域。
- 逐一添加表情组,把 MMD 的 morph 对应到 VRM 标准表情。
VRM 1.0 表情的三种绑定类型
| 绑定类型 | 作用 | 典型应用场景 |
|---|---|---|
| MorphTargetBind | 绑定到网格的 MorphTarget(顶点形变) | 眨眼、张嘴、微笑等面部形变 |
| MaterialColorBind | 绑定到材质颜色变化 | 脸红、瞳孔变色 |
| TextureTransformBind | 绑定到纹理 UV 偏移 / 缩放 | 眼球贴图滚动实现视线移动 |
在 VRM 1.0 中,一个“脸红”表情可以同时包含 MorphTarget(脸颊顶点微微鼓起)和 MaterialColorBind(脸颊材质变红),两者组合在同一个 Expression 下,这是 VRM 0.x 做不到的。
VRM 1.0 表情冲突处理:Override 系统
当程序同时触发多个表情时,例如“说话时自动眨眼”,面部网格可能穿模。Override 系统通过三种模式解决:
| Override 模式 | 行为 | 适用场景 |
|---|---|---|
none | 不干预,程序表情正常运行 | 默认值 |
block | 当此表情权重大于 0 时,目标程序表情权重设为 0 | 开心时阻止眨眼(硬截断) |
blend | 随此表情权重从 0 到 1 线性衰减目标程序表情 | 平滑过渡(推荐) |
每个表情可以设置三个 Override 属性:overrideMouth 影响口型,overrideBlink 影响眨眼,overrideLookAt 影响视线。
happy、angry、sad 等情绪表情设置 overrideBlink = "blend" 和 overrideMouth = "blend",能有效避免“微笑时眨眼导致眼皮穿透脸颊”的问题。批量创建表情映射(可选)
如果 MMD 模型的网格处于合并状态,可以用脚本批量创建表情映射。以下是 VRM 0.x BlendShape 版本参考脚本:
import bpy
# 需要选中模型网格后运行
# 此脚本将 MMD 标准 morph 名映射到 VRM 标准表情
# VRM 0.x 名称映射
Proxy = {
"blink": "まばたき",
"a": "あ",
"i": "い",
"u": "う",
"e": "え",
"o": "お",
"joy": "笑い",
"angry": "怒り",
"sorrow": "困る",
}
for name, morph_name in Proxy.items():
bpy.ops.vrm.add_vrm0_blend_shape_group(
armature_object_name=bpy.context.active_object.name,
name=name
)
# 详细绑定操作见 VRM Addon 文档
happy / sad / relaxed 并新增 surprised。VRM 1.0 的 MorphTarget 权重范围为 0–1(0.x 为 0–100),脚本中的权重值也需要调整。第五步:视线追踪设置(LookAt)
LookAt 系统让角色的眼球跟随目标移动。在桌面伴侣中尤其重要:当鼠标移动时,桌面角色的眼睛会自然地看向鼠标方向。
| 模式 | 实现方式 | 适用场景 |
|---|---|---|
| Bone 类型 | 旋转 leftEye 和 rightEye 骨骼 | 眼球有独立骨骼的模型 |
| Expression 类型 | 通过 lookUp / lookDown / lookLeft / lookRight 表情驱动 | 眼球是贴图的模型(大多数 MMD 模型) |
左目 / 右目 的骨骼。有独立眼球骨骼就使用 Bone 类型;眼球是面部网格的一部分且通过贴图表现,就使用 Expression 类型。大多数 MMD 模型属于后者。LookAt 空间与偏移
LookAt 系统基于 LookAt Space,它以 head 骨骼为父级,并通过 offsetFromHeadBone 定义视线原点,通常在双眼之间:
LookAt Space(视线空间)
├── 父级:head 骨骼(跟随头部运动)
├── 原点偏移:offsetFromHeadBone(如 [0, 0.06, 0])
└── 旋转:head 骨骼在模型空间中静止旋转的逆
在 VR 中,offsetFromHeadBone 对应 HMD(头显)的位置;在桌面场景中,它决定视线追踪的基准点。
RangeMap:控制眼球转动范围
| RangeMap 属性 | 作用 |
|---|---|
rangeMapHorizontalInner | 水平内侧转动范围(鼻梁方向) |
rangeMapHorizontalOuter | 水平外侧转动范围(耳朵方向) |
rangeMapVerticalDown | 垂直向下转动范围 |
rangeMapVerticalUp | 垂直向上转动范围 |
每个 RangeMap 有两个子参数:inputMaxValue 是视线角度上限,值越小,同样角度下眼球转动幅度越大;outputScale 是输出上限,Bone 类型为骨骼旋转角度(度),Expression 类型为表情权重(0–1)。
boneRotation = min(|angle|, inputMaxValue) / inputMaxValue × outputScale
inputMaxValue(如从 90 改为 45)或增大 outputScale;如果转动太夸张,反向调整。第六步:材质转换(MToon 着色器)
PMX 和 VRM 使用不同的材质系统。VRM 推荐使用 MToon 材质,这是 VRM 规范中定义的专用卡通着色器(VRMC_materials_mtoon 扩展),基于 Lambert 反射模型扩展,专为动漫风格角色设计。它提供了受光面 / 阴影面的双色控制、可调的明暗边界、边缘光(Rim Light)和描边(Outline),能还原 MMD 的 toon 渲染效果。
- 选中模型网格。
- 在 Material Properties 面板中逐一处理每个材质。
- 将材质的 Shader 从 MMD 材质转换为 MToon。
渲染模式与透明度
| 参数 | 说明 | 设置建议 |
|---|---|---|
| Alpha Mode | OPAQUE(不透明)/ MASK(剔除透明)/ BLEND(半透明) | 皮肤用 OPAQUE,头发边缘用 MASK,裙摆蕾丝用 BLEND |
| transparentWithZWrite | BLEND 模式下是否写入深度缓冲 | 半透明物体需要排序时设为 true |
| renderQueueOffsetNumber | 渲染队列偏移(仅 BLEND 模式) | 解决半透明物体之间的遮挡问题 |
渲染队列优先级:OPAQUE > MASK > BLEND + ZWrite > BLEND。
受光色与阴影色
| 参数 | 说明 | 设置建议 |
|---|---|---|
| Lit Color(baseColorFactor) | 受光面颜色 + 贴图 | 填入原 PMX 的基础贴图 |
| Shade Color(shadeColorFactor) | 阴影面颜色 + 贴图 | 填入原贴图或调暗版本,MToon 用此色替代 Lambert 中的黑色阴影 |
传统 Lambert 模型的背光面是黑色,而 MToon 允许指定阴影色,让阴影面可以是有颜色的暗色调,而不是死黑。这是卡通渲染的关键。
明暗边界控制
| 参数 | 默认值 | 说明 |
|---|---|---|
| shadingToonyFactor | 0.9 | 明暗边界锐利度。趋近 1.0 是硬边(赛璐璐),趋近 0.0 是柔和渐变 |
| shadingShiftFactor | 0.0 | 明暗边界位置偏移。正值扩大受光面,负值扩大阴影面 |
| shadingShiftTexture | — | 贴图 R 通道控制不同区域的明暗边界位置 |
| shadingShiftTexture.scale | 1.0 | 贴图对边界的影响程度 |
shading = dot(法线N, 光源方向L) + shadingShiftFactor + 贴图贡献 × scale
shading = linearstep(-1.0 + shadingToonyFactor, 1.0 - shadingToonyFactor, shading)
颜色 = lerp(阴影色, 受光色, shading) × 光色
shadingToonyFactor 越接近 1,明暗分界线越像刀切一样干净;越接近 0,过渡越柔和。大多数动漫模型推荐 0.8–1.0。
边缘光(Rim Lighting)
| 组件 | 参数 | 说明 |
|---|---|---|
| MatCap | matcapFactor + matcapTexture | 通过视角空间法线采样贴图,常用于固定视角高光 |
| Parametric Rim | parametricRimColorFactor、parametricRimFresnelPowerFactor(默认 5.0)、parametricRimLiftFactor(默认 0.0) | 基于 Fresnel 效应的程序化边缘光,无需贴图 |
| Rim Mask | rimMultiplyTexture | 用贴图遮罩边缘光,控制哪些区域有边缘光 |
| Lighting Mix | rimLightingMixFactor(默认 1.0) | 0 表示边缘光不受光照影响,1 表示完全受光照影响 |
rimShape = pow(saturate(1.0 - dot(法线N, 视线V) + rimLiftFactor), fresnelPowerFactor)
边缘光 = rimShape × parametricRimColorFactor
给头发材质添加 Parametric Rim,颜色设为淡蓝或淡紫,FresnelPower 设为 3–5,可以在头发边缘产生柔和的逆光效果。
描边(Outline)
| 参数 | 说明 |
|---|---|
outlineWidthMode | none(无描边)/ worldCoordinates(世界坐标,随距离变化)/ screenCoordinates(屏幕坐标,恒定粗细) |
outlineWidthFactor | 描边宽度。世界模式单位为米,屏幕模式为屏幕高度比 |
outlineWidthMultiplyTexture | 描边宽度遮罩贴图(G 通道),控制不同区域粗细 |
outlineColorFactor | 描边颜色 |
outlineLightingMixFactor | 0 为纯色描边,1 为描边颜色乘以表面光照结果 |
MToon 的描边通过单独渲染 Pass 实现:使用正面剔除,将顶点沿法线方向偏移后绘制背面,形成描边效果。无论 doubleSided 如何设置,描边始终使用正面剔除。
shadingToonyFactor;顶点色会被 MToon 忽略,需要其他方式补偿。UV 动画
| 参数 | 默认值 | 说明 |
|---|---|---|
uvAnimationScrollXSpeedFactor | 0.0 | UV X 方向滚动速度(UV 单位 / 秒) |
uvAnimationScrollYSpeedFactor | 0.0 | UV Y 方向滚动速度 |
uvAnimationRotationSpeedFactor | 0.0 | UV 旋转速度(弧度 / 秒,绕 0.5, 0.5 逆时针) |
uvAnimationMaskTexture | — | 动画遮罩贴图(B 通道) |
典型应用是给眼睛或屏幕材质添加 UV 滚动,实现“屏幕闪烁”效果。变换顺序为先旋转(绕中心 0.5, 0.5),再平移。
纹理通道打包
| 通道 | 对应贴图 |
|---|---|
| R | shadingShiftTexture(明暗边界偏移) |
| G | outlineWidthMultiplyTexture(描边宽度遮罩) |
| B | uvAnimationMaskTexture(UV 动画遮罩) |
shadingToonyFactor 设为 0.9,再根据效果微调。第七步:物理骨骼(Spring Bone)
VRM 使用 Spring Bone(弹簧骨骼)实现头发、衣服等部位的物理摆动效果。PMX 模型通常有自己的物理设置,但需要重新配置为 VRM 标准。
| 部位 | 说明 |
|---|---|
| 头发 | 各缕头发的骨骼链 |
| 胸部 | 胸部物理(如适用) |
| 衣服 | 裙摆、披风、丝带等摆动物体 |
| 配饰 | 长飘带、尾巴等 |
Spring Bone 的骨骼链结构
VRM Spring Bone 以 骨骼链(SpringChain)为单位组织,每条链由有序的关节(SpringJoint)组成。给定关节 a-b-c-d,运行时将其展开为三个“头-尾”对:
头(旋转) 尾(位移+碰撞)
a → b
b → c
c → d
- 头节点的旋转根据尾节点的位移计算。
- 链条最后一个关节仅作为尾节点使用,其自身参数被忽略。
- 如果需要最后一节骨骼也有物理效果,在末尾添加一个空骨骼节点。
joints[n] 必须是 joints[n+1] 的父级或祖先;一个关节不能同时属于多条 SpringChain;分支链需定义为独立 SpringChain,执行顺序未定义。Spring Bone 关节参数
| 参数 | 类型 | 说明 | 调节建议 |
|---|---|---|---|
hitRadius | float(米) | 关节碰撞半径 | 通常设为骨骼长度的一小部分,如 0.02–0.05 |
stiffness | float(≥0) | 回弹到初始姿态的力 | 值低柔软飘逸,值高僵硬回弹快 |
gravityPower | float | 每帧施加的重力大小 | 值高下垂明显,0 为无重力 |
gravityDir | float[3] | 重力方向向量 | 通常为 [0, -1, 0] |
dragForce | float(0–1) | 减速力,惯性衰减率 | 值低惯性大,值高快速停止 |
物理算法(Verlet 积分)
Spring Bone 每帧执行三步:
步骤 1:惯性计算
惯性 = (currentTail - prevTail) × (1.0 - dragForce)
回弹 = deltaTime × parentWorldRotation × initialLocalRotation × boneAxis × stiffness
重力 = deltaTime × gravityDir × gravityPower
nextTail = currentTail + 惯性 + 回弹 + 重力
nextTail = worldPosition + (nextTail - worldPosition).normalized × boneLength
步骤 2:碰撞检测
对每个分配给当前 SpringChain 的碰撞器,计算与关节尾部的距离;
如果距离小于 0,将关节沿碰撞方向向外推,并重新约束骨骼长度。
步骤 3:应用旋转
prevTail = currentTail
currentTail = nextTail
to = (nextTail × (parentWorldMatrix × initialLocalMatrix).inverse).normalized
node.rotation = initialLocalRotation × fromToQuaternion(boneAxis, to)
碰撞器(Collider)
| 碰撞器类型 | 参数 | 适用场景 |
|---|---|---|
| Sphere(球形) | offset、radius | 头部、胸部、手部 |
| Capsule(胶囊形) | offset、radius、tail | 躯干、大腿、手臂 |
球形碰撞:
distance = |nextTail - colliderOffset| - colliderRadius - jointRadius
if distance < 0:
推出方向 = (nextTail - colliderOffset).normalized
nextTail += 推出方向 × |distance|
胶囊碰撞:
将关节位置投影到胶囊轴线上,再按球形碰撞处理。
Center Space(评估空间)
默认情况下 Spring Bone 在世界空间中求值。VRM 1.0 支持 center 属性,指定一个节点作为参考坐标系:惯性在 center 空间中求值(消除角色移动时的过度晃动),重力仍在世界空间中求值。当角色行走或跑步时头发晃动过于剧烈,把 center 设为 head 骨骼,可以让头发只响应头部运动而非全身运动。
在 Blender 中添加
- 选中 Armature。
- 在 VRM 面板中找到 Spring Bone 区域。
- 添加 Spring Bone Group(对应一条 SpringChain)。
- 指定 Root Bones(骨骼链的根骨骼)。
- 设置 stiffness、gravityPower、dragForce 参数。
- 可选:添加 Collider Group,指定碰撞骨骼和碰撞器形状。
在 Unity 中添加(进阶)
如果需要更精细的物理效果,可以在 Blender 完成基础转换后,导入 Unity 使用 UniVRM 配置 Spring Bone。UniVRM 提供可视化碰撞器编辑,更适合精细调整。
| 参数 | Unity 组件 | 说明 |
|---|---|---|
stiffness | VRM10SpringBoneJoint.m_stiffnessForce | 柔硬程度 |
dragForce | VRM10SpringBoneJoint.m_dragForce | 减速力 |
gravityPower | VRM10SpringBoneJoint.m_gravityPower | 重力大小 |
hitRadius | VRM10SpringBoneJoint.m_hitRadius | 碰撞半径 |
| 碰撞器 | VRM10SpringBoneCollider | Sphere / Capsule 碰撞器 |
Unity 用户也可以参考 VrmSpringBoneTool,它能大幅简化物理骨骼配置,并支持从 VRM 0.x 迁移到 1.0。
第八步:填写元数据并导出 VRM
在 VRM 面板中找到 Meta 区域,填写模型信息(VRMC_vrm.meta 字段):
| 字段 | 说明 | 示例 |
|---|---|---|
| Name / Title | 模型名称 | 星野瑠美-学园制服 |
| Author | 作者名 | tarara |
| Version | 版本号 | 1.0 |
| Description | 模型描述 | 基于 XX 模型改造,适配 VRM 1.0 |
| License | 使用许可 | 查看模型 readme 后选择 |
| Avatar Permission | 是否允许作为他人虚拟形象 | 只允许 / 允许 / 禁止 |
| Allow Excessively Violent Usage | 是否允许暴力场景使用 | 允许 / 不允许 |
| Allow Excessively Sexual Usage | 是否允许色情场景使用 | 允许 / 不允许 |
| Commercial Usage | 商业使用许可 | 允许 / 不允许 |
| Third Party Licenses | 第三方许可 | 附带模型原作者的许可条款 |
VRM 标准许可证类型
| 许可证 | 说明 |
|---|---|
| Redistribution | 允许再配布 |
| Modification | 允许修改 |
| Credit | 需要署名 |
导出前检查与导出
- 确认模型为 T-Pose:双臂水平展开,掌心向下。VRM Humanoid 以 T-Pose 作为初始姿态,如果导出时不是 T-Pose,导入后动画会出现严重错位。
- 选择导出版本:桌面伴侣等新场景推荐 VRM 1.0;旧平台兼容选 VRM 0.x。
- 执行 File → Export → VRM (.vrm)。
- 选择导出路径,确认导出设置后完成导出。
导出后的最后一步:导入 AniMate
转换完成并不等于“角色已经能用”。导出 `.vrm` 后,先用下面这份清单快速检查,再导入 萌灵 AniMate:
- 骨骼:Humanoid 必需骨骼完整,手臂、腿部和头部没有自动映射遗漏。
- 表情:眨眼、口型和情绪表情都在,VRM 1.0 的 Override 已设为 blend。
- 材质:透明材质没有出现黑块,MToon 明暗边界符合预期。
- 物理:头发、裙摆没有明显穿模,碰撞器覆盖头部和躯干。
- 授权:Meta 中已按原作者 readme 填写许可字段。
导入 AniMate 后,右键桌面角色进入萌灵工坊,点击添加萌灵,选择刚才导出的 `.vrm` 文件即可。模型加载后先调整大小、位置和鼠标互动,再进入工坊添加动作、舞蹈和舞台。AniMate 支持 VRM 0.x / 1.0 直接导入,并把角色管理、动作、舞蹈和音乐律动放在同一个角色库里。
相关阅读
| 问题 | 专门页面 |
|---|---|
| VRM 桌宠是什么? | VRM 桌面伴侣 |
| 已经拿到 `.vrm` 文件? | VRM 导入教程 |
| 模型从哪里找? | 免费 VRM 模型目录、VRM 模型来源 |
| 想让角色跳舞? | 角色舞蹈工坊、舞蹈与舞台教程 |
| 想自己制作 VRM? | AI 与 Codex 制作 VRM、桌宠制作指南 |
| 桌宠软件推荐? | 桌宠软件推荐 |
常见问题
PMX 能直接导入 AniMate 吗?
AniMate 优先面向 VRM 桌面伴侣体验,最省心的是直接使用 `.vrm` 文件。PMX 建议先通过 Blender + VRM Addon 或 Unity + UniVRM 转换。
没有 3D 软件基础能完成转换吗?
可以。Blender + VRM Addon 是相对平缓的路线:安装插件、导入 PMX、创建 VRM Model,再按面板逐项处理骨骼、表情、材质和物理,大部分操作不需要写代码。
VRM 0.x 和 VRM 1.0 怎么选?
新场景推荐 VRM 1.0:表情命名更统一、支持 Expression Override、Spring Bone 规范更完整。需要兼容旧平台时再使用 VRM 0.x。
转换后头发和裙摆物理效果变差怎么办?
先确认每条 SpringChain 的父子关系正确,再调整 hitRadius、stiffness、gravityPower、dragForce,并给头部和躯干添加碰撞器。复杂裙摆需要更多碰撞器和更细致的调参。
别人的 MMD 模型可以转换和商用吗?
必须阅读模型 readme 中的许可条款。多数 MMD 模型禁止商业使用和再配布;修改、直播、商用等行为都要按作者授权逐项确认。
把你的 MMD 角色放上桌面
先用 AniMate 内置模型跑通桌面体验,再导入自己转换的 VRM,在萌灵工坊里管理角色、动作和舞蹈。