博客 · PMX 转 VRM · 桌面角色教程 · 2026-08-06

PMX 转 VRM 完整指南:把 MMD 模型变成桌面角色

从 MMD 生态的 PMX 格式,到 VRM 1.0 标准,这篇指南基于 VRM 官方规范,讲清骨骼映射、表情系统、MToon 材质和 Spring Bone 物理的完整转换流程。最终目标只有一个:得到一个能导入 AniMate、放在桌面上的 `.vrm` 文件。

PMX 模型经过 Blender 或 Unity 转成 VRM 1.0,再导入 AniMate 成为桌面角色
转换不是格式改名,而是把 MMD 的骨骼、表情、材质和物理逐一映射到 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:BlenderBlender + VRM Addon有 Blender 基础或愿意学的人★★★⭐⭐⭐⭐⭐ 推荐
方案 B:UnityUnity + MMD4Mecanim + UniVRM有 Unity 基础的人★★★★⭐⭐⭐
没有 3D 软件基础也不用担心:方案 A(Blender)学习曲线更平缓,Blender 免费开源,社区教程丰富。本文以方案 A 为主线,方案 B 作为备选。

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(第一人称)firstPersonVR 中头部网格的显示 / 隐藏设置可选
Expressions(表情)expressions面部表情系统(0.x 称 BlendShape)可选
LookAt(视线追踪)lookAt眼球跟随目标的视线控制可选
为什么这很重要:PMX 转 VRM 的本质,就是把 PMX 的骨骼、表情、材质、物理系统逐一映射到 VRM 的五个子系统中。理解了这一点,你就理解了后续每一步的目的。

系统执行顺序:为什么排列顺序很重要

VRM 规范定义了严格的子系统执行顺序。每一帧的更新循环中,各子系统按以下顺序依次求值:

1. Humanoid 骨骼求解
   ↓  (头部位置确定后)
2. LookAt 视线求解
   ↓  (Bone 类型旋转眼球 / Expression 类型设置权重)
3. Expression 表情更新
   ↓  (外部输入 → LipSync → AutoBlink → LookAt 类型表情)
4. Expression 应用
   ↓  (所有表情权重累积后统一应用)
5. Constraints 节点约束求解
   ↓  (如旋转约束、IK 约束等)
6. Spring Bone 弹簧骨骼物理求解
转换时的实际影响:如果转换后发现“表情和眨眼互相干扰”或“物理骨骼抖动异常”,很可能与表情 Override 设置或 Spring Bone 的执行顺序依赖有关。后续步骤会逐一解决。

VRM 0.x 与 VRM 1.0:版本差异

维度VRM 0.xVRM 1.0
表情系统名称BlendShapeExpression(重命名)
表情权重范围0–1000–1
情绪表情命名joysorrowfunhappysadrelaxed
“惊讶”表情新增 surprised
表情绑定类型主要基于 MorphTargetMorphTargetBind + MaterialColorBind + TextureTransformBind
表情冲突处理未规范引入 Override 系统(block / blend 模式)
扩展名前缀无统一前缀VRMC_ 前缀
chest 骨骼必需可选
neck 骨骼必需可选
实践建议:VRM Addon for Blender 和 UniVRM 都支持导出 VRM 0.x 和 VRM 1.0。对于桌面伴侣等新场景,推荐导出 VRM 1.0,它的 Expression Override 能避免“说话时眨眼导致面部穿模”等实际问题;需要兼容旧平台时再使用 VRM 0.x。

官方参考资源

资源地址用途
VRM 官方网站vrm.dev格式概览、工具列表、应用案例
VRM 规范仓库github.com/vrm-c/vrm-specification完整技术规范(JSON Schema + 文档)
UniVRM(Unity 实现)github.com/vrm-c/UniVRMUnity 的 VRM 导入导出库
VRM Addon for Blendergithub.com/saturday06/VRM-Addon-for-BlenderBlender 的 VRM 插件

方案 A:Blender + VRM Addon

第一步:环境准备

工具版本要求下载地址
Blender3.6+,推荐 4.2+blender.org
VRM Addon for Blender最新版GitHub
MMD Tools(可选)最新版Blender 插件市场搜索安装
CATS Blender Plugin(可选)最新版GitHub 搜索下载

安装 VRM Addon

  1. 打开 Blender,进入菜单栏 Edit → Preferences
  2. 选择 Add-ons 标签页,点击右上角 Install...
  3. 选择下载的 VRM Addon `.zip` 文件,点击 Install Add-on
  4. 在插件列表中找到 VRM,勾选启用。
Blender 4.5+ 用户注意:VRM Addon 已可直接在 Blender 的 Extensions(扩展)平台中搜索安装,无需手动下载。

安装 MMD Tools(用于导入 PMX)

  1. 同样在 Preferences → Add-ons → Install 选择 MMD Tools 的 `.zip` 文件。
  2. 安装并启用插件。
  3. 安装后,Blender 的 File → Import 菜单会多出 MikuMikuDance Model (.pmx/.pmd) 选项。

第二步:导入 PMX 模型

  1. 执行 File → Import → MikuMikuDance Model (.pmx/.pmd)
  2. 在文件浏览器中选中你的 `.pmx` 模型文件。
  3. 导入后检查模型完整性:所有网格是否完整导入、材质和贴图是否正确加载、骨骼结构是否完整。
贴图丢失怎么办:如果模型显示纯色或黑色,先检查贴图路径是否与 PMX 文件在同一目录。使用 Bandizip 或 7-Zip 解压时,把编码改为“日文(Shift-JIS)”,可以解决文件名乱码导致的贴图丢失。

第三步:骨骼映射(最关键的一步)

PMX 和 VRM 使用不同的骨骼系统。VRM 要求 Humanoid(人形)骨骼,也就是标准化的骨骼结构。这一步就是把 PMX 的骨骼映射到 VRM 的标准骨骼上。

  1. 选中模型的 Armature(骨骼对象)
  2. 在右侧属性面板找到 VRM 标签页
  3. 点击 Create VRM Model,插件会自动尝试将 PMX 骨骼映射到 VRM 标准骨骼。
  4. 进入 Humanoid 面板检查映射结果。

骨骼映射参考:MMD → VRM

以下表格列出 MMD 标准骨骼名与 VRM Humanoid 骨骼的对应关系。加粗的为 VRM 必需骨骼,缺失会导致导出失败;其余为可选骨骼。

躯干与头部
MMD 骨骼名(日文)对应身体部位VRM 标准骨骼VRM 1.0 必需?
全ての親根骨骼 / 胯部Hips✅ 必需
上半身上半身Spine✅ 必需
上半身2胸部Chest0.x 必需,1.0 可选
上半身3上胸部UpperChest可选(需 Chest 存在)
脖子Neck0.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 即可。

MMD 骨骼名到 VRM Humanoid 标准骨骼的映射图
绿色是导出必需骨骼,灰色是可选项。自动映射失败时,优先检查这些节点是否绑定在旋转骨骼而不是 IK 骨上。
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 的中间节点;骨骼缩放分量必须为正值,零不被允许。
重要检查:MMD 模型的腿骨可能绑定在 D 骨(装饰骨)上而非 IK 骨上,务必检查权重实际所在的骨骼。VRM 需要旋转骨骼而不是 IK 骨;如果模型使用了 IK 骨骼,转换时确保权重绑定在对应的旋转骨骼上。
如果自动映射失败
  • 使用插件的 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 名说明
happyjoy笑い开心 / 微笑
angryangry怒り生气
sadsorrow困る悲伤
relaxedfunにっこり放松 / 舒适
surprised0.x 无びっくり惊讶(VRM 1.0 新增)
口型同步
VRM 1.0 名称VRM 0.x 名称MMD morph 名对应元音
aaaあ(a)
ihiい(i)
ouuう(u)
eeeえ(e)
ohoお(o)
眨眼
VRM 1.0 名称VRM 0.x 名称MMD morph 名说明
blinkblinkまばたき双眼眨眼
blinkLeft左まばたき左眼单眨(1.0 新增)
blinkRight右まばたき右眼单眨(1.0 新增)
视线表情
VRM 1.0 名称说明
lookUp眼睛向上看
lookDown眼睛向下看
lookLeft眼睛向左看
lookRight眼睛向右看
视线表情 vs 视线骨骼:VRM 的 LookAt 系统有两种模式,Bone 类型旋转 leftEye/rightEye 骨骼,Expression 类型通过四个视线表情移动顶点或纹理偏移。大多数 MMD 模型用表情方式实现眼球转动,因为 MMD 的眼球通常是贴图。
设置方法
  1. 在 VRM 面板中找到 BlendShape Master(VRM 0.x)或 Expressions(VRM 1.0)区域。
  2. 逐一添加表情组,把 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 影响视线。

实践建议:导出 VRM 1.0 时,为 happyangrysad 等情绪表情设置 overrideBlink = "blend"overrideMouth = "blend",能有效避免“微笑时眨眼导致眼皮穿透脸颊”的问题。
VRM 标准表情与 MMD morph 映射示意
情绪、口型、眨眼和视线四类表情分别映射 MMD morph;VRM 1.0 用 Override 协调同时触发的表情。
批量创建表情映射(可选)

如果 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 文档
VRM 1.0 注意:如果导出 VRM 1.0,表情名称需改为 happy / sad / relaxed 并新增 surprised。VRM 1.0 的 MorphTarget 权重范围为 0–1(0.x 为 0–100),脚本中的权重值也需要调整。

第五步:视线追踪设置(LookAt)

LookAt 系统让角色的眼球跟随目标移动。在桌面伴侣中尤其重要:当鼠标移动时,桌面角色的眼睛会自然地看向鼠标方向。

模式实现方式适用场景
Bone 类型旋转 leftEyerightEye 骨骼眼球有独立骨骼的模型
Expression 类型通过 lookUp / lookDown / lookLeft / lookRight 表情驱动眼球是贴图的模型(大多数 MMD 模型)
如何判断你的模型属于哪种:在 Blender 中检查是否有名为 左目 / 右目 的骨骼。有独立眼球骨骼就使用 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;如果转动太夸张,反向调整。
注意:VRM 的视线系统假设双眼看向同一方向,不支持斗鸡眼。Bone 类型中左右眼的内外侧 RangeMap 是镜像的,左眼内侧等于右眼外侧。

第六步:材质转换(MToon 着色器)

PMX 和 VRM 使用不同的材质系统。VRM 推荐使用 MToon 材质,这是 VRM 规范中定义的专用卡通着色器(VRMC_materials_mtoon 扩展),基于 Lambert 反射模型扩展,专为动漫风格角色设计。它提供了受光面 / 阴影面的双色控制、可调的明暗边界、边缘光(Rim Light)和描边(Outline),能还原 MMD 的 toon 渲染效果。

  1. 选中模型网格。
  2. Material Properties 面板中逐一处理每个材质。
  3. 将材质的 Shader 从 MMD 材质转换为 MToon
渲染模式与透明度
参数说明设置建议
Alpha ModeOPAQUE(不透明)/ MASK(剔除透明)/ BLEND(半透明)皮肤用 OPAQUE,头发边缘用 MASK,裙摆蕾丝用 BLEND
transparentWithZWriteBLEND 模式下是否写入深度缓冲半透明物体需要排序时设为 true
renderQueueOffsetNumber渲染队列偏移(仅 BLEND 模式)解决半透明物体之间的遮挡问题

渲染队列优先级:OPAQUE > MASK > BLEND + ZWrite > BLEND

受光色与阴影色
参数说明设置建议
Lit Color(baseColorFactor)受光面颜色 + 贴图填入原 PMX 的基础贴图
Shade Color(shadeColorFactor)阴影面颜色 + 贴图填入原贴图或调暗版本,MToon 用此色替代 Lambert 中的黑色阴影

传统 Lambert 模型的背光面是黑色,而 MToon 允许指定阴影色,让阴影面可以是有颜色的暗色调,而不是死黑。这是卡通渲染的关键。

明暗边界控制
参数默认值说明
shadingToonyFactor0.9明暗边界锐利度。趋近 1.0 是硬边(赛璐璐),趋近 0.0 是柔和渐变
shadingShiftFactor0.0明暗边界位置偏移。正值扩大受光面,负值扩大阴影面
shadingShiftTexture贴图 R 通道控制不同区域的明暗边界位置
shadingShiftTexture.scale1.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)
组件参数说明
MatCapmatcapFactor + matcapTexture通过视角空间法线采样贴图,常用于固定视角高光
Parametric RimparametricRimColorFactorparametricRimFresnelPowerFactor(默认 5.0)、parametricRimLiftFactor(默认 0.0)基于 Fresnel 效应的程序化边缘光,无需贴图
Rim MaskrimMultiplyTexture用贴图遮罩边缘光,控制哪些区域有边缘光
Lighting MixrimLightingMixFactor(默认 1.0)0 表示边缘光不受光照影响,1 表示完全受光照影响
rimShape = pow(saturate(1.0 - dot(法线N, 视线V) + rimLiftFactor), fresnelPowerFactor)
边缘光 = rimShape × parametricRimColorFactor

给头发材质添加 Parametric Rim,颜色设为淡蓝或淡紫,FresnelPower 设为 3–5,可以在头发边缘产生柔和的逆光效果。

描边(Outline)
参数说明
outlineWidthModenone(无描边)/ worldCoordinates(世界坐标,随距离变化)/ screenCoordinates(屏幕坐标,恒定粗细)
outlineWidthFactor描边宽度。世界模式单位为米,屏幕模式为屏幕高度比
outlineWidthMultiplyTexture描边宽度遮罩贴图(G 通道),控制不同区域粗细
outlineColorFactor描边颜色
outlineLightingMixFactor0 为纯色描边,1 为描边颜色乘以表面光照结果

MToon 的描边通过单独渲染 Pass 实现:使用正面剔除,将顶点沿法线方向偏移后绘制背面,形成描边效果。无论 doubleSided 如何设置,描边始终使用正面剔除。

常见问题:透明材质需要把 Alpha Mode 设为 MASK 或 BLEND;材质显示异常时可先全改 MASK 排查;MMD toon 效果需要调整 shadingToonyFactor;顶点色会被 MToon 忽略,需要其他方式补偿。
MToon 卡通材质的受光色、阴影色、边缘光和描边参数示意
MToon 用“受光色 + 阴影色 + 边界”替代传统材质阴影,再通过边缘光和描边强化动漫轮廓。
UV 动画
参数默认值说明
uvAnimationScrollXSpeedFactor0.0UV X 方向滚动速度(UV 单位 / 秒)
uvAnimationScrollYSpeedFactor0.0UV Y 方向滚动速度
uvAnimationRotationSpeedFactor0.0UV 旋转速度(弧度 / 秒,绕 0.5, 0.5 逆时针)
uvAnimationMaskTexture动画遮罩贴图(B 通道)

典型应用是给眼睛或屏幕材质添加 UV 滚动,实现“屏幕闪烁”效果。变换顺序为先旋转(绕中心 0.5, 0.5),再平移。

纹理通道打包
通道对应贴图
RshadingShiftTexture(明暗边界偏移)
GoutlineWidthMultiplyTexture(描边宽度遮罩)
BuvAnimationMaskTexture(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 关节参数
参数类型说明调节建议
hitRadiusfloat(米)关节碰撞半径通常设为骨骼长度的一小部分,如 0.02–0.05
stiffnessfloat(≥0)回弹到初始姿态的力值低柔软飘逸,值高僵硬回弹快
gravityPowerfloat每帧施加的重力大小值高下垂明显,0 为无重力
gravityDirfloat[3]重力方向向量通常为 [0, -1, 0]
dragForcefloat(0–1)减速力,惯性衰减率值低惯性大,值高快速停止
版本差异:VRM 0.x 中链条末端没有终端关节时,运行时会自动在 7cm 距离处添加一个 SpringJoint;VRM 1.0 不会自动添加,需要手动在末尾添加空节点。
物理算法(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)
理解这个算法的意义:Spring Bone 不是刚体物理,而是简化的质点-弹簧系统。它不处理碰撞反弹,只有推开;不模拟空气阻力,只有 dragForce 衰减。因此复杂裙摆物理效果可能不如 MMD 的 Bullet 物理,这是转换后“物理效果变差”的根本原因。
碰撞器(Collider)
碰撞器类型参数适用场景
Sphere(球形)offsetradius头部、胸部、手部
Capsule(胶囊形)offsetradiustail躯干、大腿、手臂
球形碰撞:
distance = |nextTail - colliderOffset| - colliderRadius - jointRadius
if distance < 0:
    推出方向 = (nextTail - colliderOffset).normalized
    nextTail += 推出方向 × |distance|

胶囊碰撞:
将关节位置投影到胶囊轴线上,再按球形碰撞处理。
典型配置:头部用 Sphere 碰撞器防止头发穿入;躯干用 Capsule 碰撞器防止裙摆穿入身体;手部用 Sphere 碰撞器防止袖口穿入手臂。
Center Space(评估空间)

默认情况下 Spring Bone 在世界空间中求值。VRM 1.0 支持 center 属性,指定一个节点作为参考坐标系:惯性在 center 空间中求值(消除角色移动时的过度晃动),重力仍在世界空间中求值。当角色行走或跑步时头发晃动过于剧烈,把 center 设为 head 骨骼,可以让头发只响应头部运动而非全身运动。

在 Blender 中添加
  1. 选中 Armature。
  2. 在 VRM 面板中找到 Spring Bone 区域。
  3. 添加 Spring Bone Group(对应一条 SpringChain)。
  4. 指定 Root Bones(骨骼链的根骨骼)。
  5. 设置 stiffness、gravityPower、dragForce 参数。
  6. 可选:添加 Collider Group,指定碰撞骨骼和碰撞器形状。
在 Unity 中添加(进阶)

如果需要更精细的物理效果,可以在 Blender 完成基础转换后,导入 Unity 使用 UniVRM 配置 Spring Bone。UniVRM 提供可视化碰撞器编辑,更适合精细调整。

参数Unity 组件说明
stiffnessVRM10SpringBoneJoint.m_stiffnessForce柔硬程度
dragForceVRM10SpringBoneJoint.m_dragForce减速力
gravityPowerVRM10SpringBoneJoint.m_gravityPower重力大小
hitRadiusVRM10SpringBoneJoint.m_hitRadius碰撞半径
碰撞器VRM10SpringBoneColliderSphere / Capsule 碰撞器

Unity 用户也可以参考 VrmSpringBoneTool,它能大幅简化物理骨骼配置,并支持从 VRM 0.x 迁移到 1.0。

Spring Bone 骨骼链、碰撞器和物理参数示意
Spring Bone 用少量参数模拟头发和裙摆的摆动;头部球形碰撞器与躯干胶囊碰撞器是桌面角色最常见的配置。

第八步:填写元数据并导出 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需要署名
务必尊重原作者许可:如果转换的是他人制作的 MMD 模型,导出 VRM 前必须阅读模型附带的 readme,确认使用方式符合原作者许可条款。大部分 MMD 模型禁止商业使用和再配布。
导出前检查与导出
  1. 确认模型为 T-Pose:双臂水平展开,掌心向下。VRM Humanoid 以 T-Pose 作为初始姿态,如果导出时不是 T-Pose,导入后动画会出现严重错位。
  2. 选择导出版本:桌面伴侣等新场景推荐 VRM 1.0;旧平台兼容选 VRM 0.x。
  3. 执行 File → Export → VRM (.vrm)
  4. 选择导出路径,确认导出设置后完成导出。

导出后的最后一步:导入 AniMate

转换完成并不等于“角色已经能用”。导出 `.vrm` 后,先用下面这份清单快速检查,再导入 萌灵 AniMate

  • 骨骼:Humanoid 必需骨骼完整,手臂、腿部和头部没有自动映射遗漏。
  • 表情:眨眼、口型和情绪表情都在,VRM 1.0 的 Override 已设为 blend。
  • 材质:透明材质没有出现黑块,MToon 明暗边界符合预期。
  • 物理:头发、裙摆没有明显穿模,碰撞器覆盖头部和躯干。
  • 授权:Meta 中已按原作者 readme 填写许可字段。

导入 AniMate 后,右键桌面角色进入萌灵工坊,点击添加萌灵,选择刚才导出的 `.vrm` 文件即可。模型加载后先调整大小、位置和鼠标互动,再进入工坊添加动作、舞蹈和舞台。AniMate 支持 VRM 0.x / 1.0 直接导入,并把角色管理、动作、舞蹈和音乐律动放在同一个角色库里。

转换的最终目标:把 MMD 模型从“只在动画软件里存在”,变成桌面上会眨眼、会看向鼠标、会陪你聊天、会跳舞的 AniMate 桌面角色。先下载软件跑通内置模型体验,再导入自己转换的 VRM,是最稳的上手顺序。

相关阅读

问题专门页面
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,在萌灵工坊里管理角色、动作和舞蹈。

下载 AniMate

官方参考