先从一个标题梗说起:圈子里常把“白嫖到的免费模型”调侃成“免费鸡蛋”,而“记得给免费鸡蛋打电话哦”其实是在提醒大家——当你使用别人分享的模型资源时,不要忘了感谢作者、遵守授权协议。不过本文并不打算只聊梗,我们顺着这条线,把一套从 MMD 模型到 VRChat 可用 Avatar 的完整制作流程拆开讲清楚。
很多刚开始接触 VRChat 和 MMD 的朋友,手里可能已经有一套喜欢的 PMX 模型,也看过不少别人录制好的 VRC 舞蹈视频,但轮到自己动手时,会遇到一连串问题:模型导进去是灰的、骨骼错位、表情菜单打不开、物理效果完全不自然。这些问题的根源,往往不是模型本身的问题,而是工具链和流程没有理顺。
这篇文章适合三类读者:第一次想把 MMD 模型导入 VRChat 的新手;已经在用 Unity 和 VRChat SDK 但经常在材质、骨骼、物理环节翻车的开发者;以及想系统整理一套可复用 Avatar 制作流程的模型师。文章会覆盖从 Blender 中转、VRM 导出、Unity 配置、Poiyomi 材质、PhysBone 物理到常见报错排查的完整路径,读完你就能照着一步步做出一个可以上传并实际使用的 VRC 角色。
1. VRC 与 MMD 的生态关系
1.1 MMD 是什么,为什么和 VRChat 关系密切
MMD 全称 MikuMikuDance,最早是日本开发者樋口优在 2008 年推出的免费 3D 动画制作软件。它本身定位是“让普通人也能轻松制作角色舞蹈动画”,核心能力集中在动作播放、镜头控制、物理模拟和 MME 特效渲染上。MMD 的模型格式通常以 PMX 或 PMD 为主,模型结构包含顶点、材质、骨骼、刚体、表情(Morph)等要素。
VRChat 是一款支持 VR 和桌面模式的社交平台,它的核心玩法之一就是用户可以上传自定义 Avatar 和世界。VRChat 社区里大量角色模型都来源于 MMD 模型库,因为 MMD 模型的风格契合二次元审美,动作资源也极其丰富,尤其适合跳舞、拍照、社交互动场景。你可以把“MMD 模型”理解为“素材资产”,把“VRChat Avatar”理解为“最终可交互的实时角色”,两者之间需要经过转换和优化。
1.2 从 MMD 模型到 VRChat Avatar 的差异
MMD 模型的渲染方式和 VRChat 的实时渲染有本质区别。MMD 里常用的 MME 特效(例如射线描边、光源散射、后处理滤镜)在 VRChat 的 URP(Universal Render Pipeline)环境下并不能直接使用,需要用 VRChat 兼容的 Toon Shader 替代,比如 Open 社区里常见的 Poiyomi Toon Shader 或 lilToon。
除了渲染,另一大差异是骨骼映射。VRChat 要求 Avatar 使用 Unity Humanoid 骨骼系统,玩家的头、手、手指会被直接映射到模型对应骨架上。MMD 模型的骨骼命名和结构不完全遵循 Unity Humanoid 标准,因此需要 Blender 或 Unity 的 Avatar Mapping 工具进行映射修正。此外,MMD 的刚体和物理模拟也不能直接搬到 VRChat,通常需要使用 VRChat SDK 中的 VRC Phys Bone(物理骨骼)组件来模拟头发、裙摆、尾巴等动态效果。
1.3 这套流程能用来做什么
完成整个转换后,你能实现:
- 在 VRChat 中上传并穿戴自制的 MMD 模型 Avatar;
- 为角色添加自定义表情菜单、手势、口型同步;
- 配置头发、裙子、耳朵等部位的物理动态;
- 优化性能等级,让角色在 VR 设备上流畅运行;
- 制作属于自己风格的 VRC 舞蹈视频或截图。
可以说,MMD 到 VRChat 的转换,是连接“模型兴趣”和“实时互动”最有价值的一条技术链路。
2. 环境准备与工具链说明
先把工具链规划好,后面才不会反复返工。下面的工具版本以当前常见稳定环境为例,具体版本要以你实际安装的软件和 VRChat SDK 要求为准。
2.1 必备工具清单
| 工具 | 作用 | 说明 |
|---|---|---|
| Blender | 模型导入、修复、修改、转换 | 推荐 3.6 或 4.x 版本,越新版对 VRM 和 FBX 支持越好 |
| MMD 本体(可选) | 查看 PMX/PMD 模型原貌,播放动作 | 如果只是做 VRC Avatar,不是必须 |
| Unity | VRChat Avatar 最终导入与上传 | 根据 VRChat Creator Companion 提示安装指定大版本 |
| VRChat Creator Companion(VCC) | 管理 Unity 项目、SDK 和依赖包 | 官方工具,推荐从它创建工程 |
| mmd_tools(Blender 插件) | 支持在 Blender 里导入导出 PMX/PMD | 开源免费,建议从官方 GitHub 下载 |
| VRM Add-on for Blender | 导出 VRM 1.0 模型 | 方便后续用 UniVRM 导入 Unity |
| UniVRM | Unity 中导入/导出 VRM | 可在 VCC 或 Unity Package Manager 安装 |
| Poiyomi Toon Shader 或 lilToon | VRChat 兼容的实时卡通着色器 | 让 MMD 风格材质在 VRChat 中生效 |
2.2 项目目录建议
工程层面,建议从一开始就建立一个清晰的目录结构,避免素材混乱。下面是我个人比较推荐的 VRChat Avatar 项目结构:
Assets/ MMDRoot/ Models/ # 原始 PMX/FBX/VRM 文件 CharacterName/ SourceFiles/ # 从 MMD/Blender 导出的原始素材 Textures/ # 贴图文件,按 body / face / hair 分目录 Materials/ # Unity Material 资产 Prefabs/ # 最终 Avatar 预置体 Animations/ # 待导入的动画(可选) PhysBones/ # 物理骨骼配置说明或脚本理由很简单:VRChat Avatar 涉及的文件非常多,贴图、材质、动画、预置体散落各处时,一旦迭代版本,想要回滚或排查问题会非常痛苦。命名时建议统一前缀,例如角色名缩写 + 部位 + 类型,如Miku_Body_MAT、Miku_Hair_PB。
2.3 版本兼容提醒
VRChat SDK 和 Unity 之间有严格版本匹配关系。当前主流流程是使用 VRChat Creator Companion 创建项目,它会自动选择合适的 Unity 版本并安装对应的 VRChat World SDK 或 Avatar SDK。如果你自己从零创建 Unity 工程,再手动导入 SDK,很容易出现“SDK 面板不显示”或“编译报错”的情况。
Blender 的插件也需要注意版本兼容。比如 mmd_tools 对 Blender 4.x 的支持情况可能和 3.x 有差异,如果导入模型时报错,可以先检查插件是否适配当前 Blender 版本。这个部分的教训是:不要盲目追新,稳定能用才是最重要的。
3. 在 Blender 中完成模型修复与转换
3.1 导入 PMX 模型
打开 Blender,先在插件菜单里启用 mmd_tools。
# 文件路径:Blender Python Console 或 Scripting 编辑器 # 这段是等效操作示意,实际使用可以通过菜单 Preferences -> Add-ons 勾选启用 import addon_utils addon_utils.enable("mmd_tools", default_set=False)启用插件后,使用菜单File -> Import -> Miku Miku Dance (.pmx/.pmd),选中你要处理的模型文件。导入时,mmd_tools 会自动处理坐标系转换、骨骼命名转换和基础材质创建。
很多新手导入后会遇到“模型全灰”或“贴图丢失”的情况。这通常是因为 PMX 模型使用了相对贴图路径,而 Blender 无法找到原始贴图目录。解决办法是手动到材质节点面板里重新加载贴图,或者将贴图和 PMX 放在同一目录下再导入。
3.2 修复材质与命名规范
MMD 模型在 Blender 里导入后,材质名称通常是原始日文或随机命名,不利于后续 Unity 中定位。我一般会先批量重命名材质,把所有材质统一成角色名_部位_用途格式。
# 文件路径:Blender Scripting 编辑器 # 运行前请确认当前 Blender 文件已导入模型 import bpy # 为当前 Blender 里所有材质添加 MAT_ 前缀 for mat in bpy.data.materials: if not mat.name.startswith("MAT_"): mat.name = f"MAT_{mat.name}" print("材质重命名完成,当前材质数量:", len(bpy.data.materials))这个脚本虽然简单,但在模型多、材质多的时候很实用。处理完材质后,还要检查透明材质(例如头发、蕾丝、瞳孔)是否正确设置了 Alpha 混合模式。有些 MMD 模型依赖“非透明贴图 alpha 通道”,到 Unity 后如果混合模式不对,会出现头发黑边、瞳孔异位等问题。
3.3 骨骼映射与 VRM 导出
MMD 模型导入 Blender 后,骨骼结构通常会自动转换成带 MMD 关节信息的骨骼层级。但 VRM 导出要求模型具备 T-Pose 姿态和标准 Humanoid 骨骼绑定。建议先在 Blender 里把模型姿势切换为 T-Pose(如果没有现成 T-Pose 动作,可以手动调整或使用 mmd_tools 的骨骼姿势工具)。
接下来安装 VRM Add-on for Blender,并在导出面板中选择 VRM 1.0 格式。导出前需要填写 VRM 模型信息,包括作者、模型名称、许可协议类型。这里的许可信息会被写入 VRM 文件,Unity 导入后也会读取,直接影响模型是否允许商用、是否允许修改等后续用途。
导出 VRM 时还需要特别注意:
- 不要有多余的未清除动画关键帧;
- 贴图必须是 Blender 当前可读取的有效路径;
- 骨骼名称建议保留 MMD Humanoid 命名,不要随意修改;
- 所有 Mesh 的材质必须已经正确指定。
完成导出后,你得到的是一份带标准 Humanoid 骨骼和 VRM 元数据的模型文件,接下来就可以进入 Unity 环节了。
4. 在 Unity 中配置 VRChat Avatar
4.1 用 VCC 创建 Avatar 项目
打开 VRChat Creator Companion,创建新的 Avatar 项目。VCC 会自动帮你安装 VRChat Avatar SDK,并提示所需的 Unity 版本。这里不要手动创建 Unity 工程再导入 SDK,否则后面的面板集成和依赖管理会浪费大量时间。
创建完成后,打开 Unity 项目,先把从 Blender 导出的 VRM 文件放进Assets/MMDRoot/Models/CharacterName/SourceFiles/目录。如果你安装了 UniVRM,Unity 会自动识别.vrm文件,并生成一个带 Prefab 的导入结构。
4.2 使用 UniVRM 导入 VRM
选中 VRM 文件后,可以在 Inspector 窗口看到 UniVRM 的导入选项。建议勾选“自动生成 Prefab”,因为后续会在 Prefab 上添加 VRC Avatar Descriptor 等组件。导入后,你会看到一个包含网格、骨骼、材质、动画的完整角色结构。
不同于直接导入 FBX,VRM 导入通常已经帮你处理好了 Humanoid 骨骼映射和许多模型结构问题。这也是为什么推荐“Blender 导出 VRM,Unity 导入 VRM”这条路径,因为它把容易出错的手工映射步骤简化掉了一部分。
4.3 安装并应用 Poiyomi Shader
在 VCC 中可以直接搜索并安装 Poiyomi Toon Shader。安装完成后,在 Unity 材质面板中,角色的材质仍可能指向标准 Shader 或 UniVRM 默认 Shader,需要切换为 Poiyomi 才能获得理想实时卡通效果。
如果角色材质较多,手动逐个切换太慢。可以使用下面这个编辑器脚本来批量将选中模型的材质切换为 Poiyomi Shader:
// 文件路径:Assets/Editor/ShaderSetter.cs // 使用方式:选中模型对象,在菜单栏找到 Tools -> Poiyomi Shader Setter using UnityEditor; using UnityEngine; public class ShaderSetter : EditorWindow { [MenuItem("Tools/Poiyomi Shader Setter")] public static void SetPoiyomiShaderOnSelected() { Shader poiyomiShader = Shader.Find("Poiyomi/Pro/7.9/Poiyomi Toon"); if (poiyomiShader == null) { Debug.LogError("未找到 Poiyomi Shader,请确认 Poiyomi 已正确安装,并核对 Shader.Find 中的路径名称"); return; } GameObject selected = Selection.activeGameObject; if (selected == null) return; Renderer[] renderers = selected.GetComponentsInChildren<Renderer>(true); int changedCount = 0; foreach (Renderer renderer in renderers) { foreach (Material mat in renderer.sharedMaterials) { if (mat == null) continue; mat.shader = poiyomiShader; changedCount++; } } Debug.Log($"已为 {changedCount} 个材质切换 Poiyomi Shader"); } }实际使用中,Poiyomi 的 Shader 路径名称可能因为版本不同而有所差异。如果执行脚本后提示找不到 Shader,请在材质面板的 Shader 下拉菜单中确认正确路径,再替换脚本里的字符串。
切换 Shader 后,模型通常会有明显“变亮”甚至“过曝”的效果。此时需要检查 Poiyomi 的关键参数:
Color:基础颜色,部分贴图本身包含光照信息,需要配合调低亮度;Normal Map:法线强度;Alpha Blend:透明材质需要选择正确的渲染模式;Stencil:用于实现瞳孔高光、边缘光等特效,需要保持同一套模板配置。
4.4 配置 VRC Avatar Descriptor
在导入的角色 Prefab 上添加VRC Avatar Descriptor组件。这个组件是 VRChat 识别 Avatar 的入口,是最关键的一步。
需要重点配置的内容有:
- View:视野位置,即玩家在 VRChat 中的眼睛位置,一般在头部骨骼附近,注意不要和嘴巴混在一起;
- Lip Sync:如果是普通 MC 模型且没有 Viseme 动画,通常选择
Viseme Blend Shape或Viseme Animation Set;如果没有任何 Viseme 资源,至少选择一个可工作的模式,否则游戏内说话时嘴型不会动; - Eye Look:可选,让角色眼睛能跟随其他玩家或镜头;
- Expressions / Menu:自定义表情菜单,需要提前创建 VRC Expression Parameters 和 VRC Expression Menu;
- Clips:用于配置待机动画或手势动画,初期可以先留空。
这里重点提醒:Expressions 菜单并不是“加上就有表情”,它需要先用VRC Expression Parameters定义参数,再用VRC Expression Menu把控制项(比如切换某组 Blend Shape)挂到菜单中。一个最常见的错误是只创建了菜单但没定义参数,导致打开菜单后点击无效。
4.5 上传前测试
在 Unity 编辑器中,进入 Play Mode 测试是上传前最重要的一步。打开 VRChat SDK 控制面板,选择角色并点击“Build & Test”或直接进入本地测试场景。在本地场景中,你可以验证以下内容:
- 模型是否有明显穿模;
- 表情菜单是否能正常切换;
- 说话时口型和声音是否匹配;
- 物理骨骼是否自然摆动;
- 手部和 VR 手柄交互是否顺手。
如果在本地测试中发现问题,不要急着上传,先回到 Unity 里修改模型材质参数、PhysBone 参数或表情配置。本地测试没问题后,再执行 Build & Publish。
5. 物理骨骼与动态效果配置
5.1 为什么需要 PhysBone
MMD 模型的头发、裙子、尾巴等部位通常包含刚体和关节物理,这些物理模拟是面向“离线动画渲染”设计的,在 VRChat 实时交互中会非常不稳定,甚至导致模型抖动和性能下降。
VRChat 官方推荐用 VRC Phys Bone 组件来替代 MMD 刚体物理。VRC Phys Bone 基于动态骨骼算法,可以模拟头发、裙子、耳朵、尾巴等附件的自然摆动,性能开销比刚体物理低很多,而且配置简单。
5.2 快速添加 VRC Phys Bone
你可以手动在需要模拟的动力骨架上添加组件,也可以编写简单脚本来自动添加。下面是一个参考脚本:
// 文件路径:Assets/Editor/AutoPhysBoneSetter.cs // 用法:将脚本放到 Editor 文件夹下,在编辑器菜单 Tools -> Auto PhysBone 中选择目标骨骼 using UnityEngine; using UnityEditor; using VRC.SDK3.Dynamics.PhysBone.Components; public class AutoPhysBoneSetter : EditorWindow { [MenuItem("Tools/Auto PhysBone/Add PhysBone to Selected")] public static void AddPhysBone() { Transform selected = Selection.activeTransform; if (selected == null) { Debug.LogError("请先选中要添加 PhysBone 的骨骼对象"); return; } VRCPhysBone pb = selected.gameObject.GetComponent<VRCPhysBone>(); if (pb == null) { pb = selected.gameObject.AddComponent<VRCPhysBone>(); } // 这里仅设置根骨骼为当前选择的对象 pb.rootTransform = selected; pb.stiffness = 0.2f; pb.gravity = 0.1f; pb.gravityPull = 0.1f; pb.immobile = 0.0f; EditorUtility.SetDirty(pb); Debug.Log($"已为 {selected.name} 添加 PhysBone,请按需微调参数"); } }实际项目中,我不建议直接使用脚本默认参数,因为不同模型的头发长度、裙摆宽度、飘动幅度差异很大。PhysBone 的常用参数可以这样理解:
Stiffness(刚度):数值越大越硬,摆动越小;Gravity(重力):影响下垂程度;Gravity Pull(重力牵引):影响回复速度;Immobile(僵硬程度):数值越大越不容易摆动;Rotation Limit(旋转限制):控制骨骼单轴旋转角度,防止头发穿模。
调试技巧:先给一个很小的刚度值(比如 0.1),在本地测试中观察模型摆动;如果摆动太夸张,就逐步增大刚度;如果完全不摆动,检查是否因为根骨骼选择错误或者角色整体被冻结。
5.3 多部件物理的层级关系
毛发物理建议只对最末端的骨骼链添加 PhysBone 根节点,不要对每个关节都添加组件。否则会产生重复物理计算,出现“头发乱甩”或“抖动”的问题。例如,一根马尾骨骼链只需要在起始骨骼添加一个 PhysBone,并让组件自动向下传导,而不是在每一节骨骼上都加组件。
6. 常见问题与排查清单
下面的表格列出了从 MMD 模型到 VRChat Avatar 流程中最常遇到的问题和排查思路:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 模型导入 VRChat 后整体灰色或白色 | Shader 未正确指派 | 安装 Poiyomi 或 lilToon,批量重新指定 Shader |
| 贴图丢失,材质显示紫色 | 贴图路径失效或贴图未导入 | 在 Blender 中重新加载贴图,或重新导入 VRM 到 Unity |
| 手指无法弯曲 | Unity Humanoid 骨骼映射未包含手指骨骼 | 检查 Avatar Descriptor 的 Avatar Mapping,手动填入手指骨骼 |
| 表情菜单点击无效 | Expression Parameters 未建立 | 确认VRC Expression Parameters中的参数名与菜单中的控制项一致 |
| 角色口型不动 | Viseme 未正确设置 | 在 Avatar Descriptor 中设置 Lip Sync,并确认 Blend Shape 名称 |
| 头发或裙子完全不摆动 | PhysBone 根骨骼选择错误 | 重新设置 PhysBone 的 Root Transform 为头发起始骨骼 |
| 头发穿模非常严重 | PhysBone 缺少碰撞体 | 在头部、肩部等位置添加 Capsule Collider,并在 PhysBone 的 Colliders 列表中加入 |
| 上传 VRChat 失败 | Unity 版本或 SDK 版本不匹配 | 使用 VCC 重新创建项目,按提示安装对应 Unity 版本 |
| 模型整体过大或过小 | 模型缩放单位不一致 | 在 Blender 或 Unity 中统一缩放,推荐模型身高约 1.4~1.6 米 |
| 进入 VRChat 后模型默认姿势不对 | T-Pose 和 Avatar Descriptor 姿势不一致 | 在 Unity 中重新进行 Humanoid 姿势校准 |
这些问题的共同特点是:错误现象在 Unity 中可能不明显,但进入 VRChat 后才会暴露。所以本地测试时,要模拟多种场景:坐在椅子上、走路、跳跃、举手、说话、切换表情等。每发现一个问题,就回到模型文件或材质配置层面修改,反复迭代。
7. 工程化建议与最佳实践
7.1 模型版权和来源标注
回到文章开头提到的“免费鸡蛋”梗:很多免费共享模型是有使用限制的。你在把模型从 MMD 导入 VRChat 时,尤其要注意模型的“允许事项”和“禁止事项”。有些作者允许个人娱乐使用,但禁止修改或重新上传;有些允许修改,但要求标注原作者和制作地址。建议保留一份授权说明文件,记录模型来源、作者信息、允许的操作范围。这既是对作者的尊重,也是避免后续账号风险的基本意识。
7.2 优化性能与视觉平衡
VRChat 对 Avatar 有性能评级系统,最常见的是“Very Poor”“Poor”“Medium”“Good”“Excellent”。评级考虑了三角形数量、材质数量、贴图大小、PhysBone 数量、粒子系统复杂度等。想让角色在 VR 设备上顺畅运行,建议关注几个硬指标:
- 三角形总数尽量控制在 3 万到 5 万以内;
- 材质数量尽量控制在 5 个以内,每个部位尽量复用材质;
- 贴图分辨率不必都上 4K,常用 1024 或 2048 即可;
- PhysBone 数量不要过多,每根发丝链只需要一个组件;
- 关闭不必要的阴影投射,使用 Poiyomi 内置的裁剪或优化选项。
对视觉影响最大的其实是 Poiyomi 的阴影和边缘光设置。很多“灰模”感来自环境光照与模型材质之间的配合问题,适当开启Shadows和Outline,能明显提升立体感。
7.3 备份与版本管理
Avatar 制作是一个反复迭代的过程。强烈建议每次大改动前,导出一次 VRM 或复制当前项目文件。更新材质、修改 PhysBone、调整表情菜单后,如果出现无法回退的问题,至少还有上一个稳定版本可以继续用。
如果你使用 Git 管理 Unity 项目,注意将Library/和Temp/加入.gitignore,只上传Assets/、Packages/、ProjectSettings/等必要目录。否则仓库体积会飞速膨胀,协作体验也会很差。
7.4 让角色“活起来”的进阶点
完成基础上传后,如果想进一步让角色显得自然,可以从这几个方向入手:
- 表情设计:利用 VRM 的 Blend Shape 制作“微笑、生气、闭眼、张嘴”等表情,绑定到表情菜单;
- 手势控制:通过
VRCAvatarParameter读取玩家手指弯曲数据,实现握拳、比心、点赞等手势切换; - 待机动画:制作 2~3 段自然的待机循环动画,避免角色像木头人一样站立;
- 视线跟随:开启 Eye Look 并配置目标视野骨骼,让角色目光跟随靠近的玩家;
- 物理细节:为衣服配饰、双马尾、裙摆分别设置不同参数的 PhysBone,增加层次感。
8. 后续学习路线与实用资源方向
完成 MMD 模型转换到 VRChat Avatar 后,你已经打通了一条“模型资产 -> 实时 Avatar”的核心链路。接下来可以沿着不同方向继续深入:
- 模型建模与改模方向:学习 Blender 的建模、雕刻、UV 展开和权重绘制,能帮你修改裙子长度、增加衣服饰品、修正模型身体比例等,从“能用”进阶到“好看”;
- 渲染与材质方向:深入研究 Poiyomi 或 lilToon 的 Shader 源码和使用技巧,理解卡通渲染背后的阴影、高光、边缘光、模板遮罩原理;
- VRChat 世界开发方向:当 Avatar 搭建熟练后,可以尝试用 VRChat SDK 制作自定义世界,导入场景资源、配置交互按钮、添加光照和音效;
- 实时动捕与动作制作方向:借助 MMD、VMC(Virtual Motion Capture)协议,将 VRChat 中的动作重定向到 Blender 或 Unity,制作 VRC 舞蹈视频。
每次做一个新角色时,可以给自己制定一套固定流程:先在 Blender 中检查模型结构,再导 VRM,进入 Unity 后先配材质,再配物理,最后做表情菜单。这套流程跑熟后,一个角色的转换时间能压缩到一两小时内。
希望这篇文章能帮你少踩一些坑。如果你在模型转换过程中遇到其他奇怪现象,不妨对照文中的排查表格逐步检查,通常都能在材质、骨骼、物理或表情配置里找到原因。动手做第一个角色吧,哪怕初期效果一般,也比停留在“想”和“看”的阶段强得多。