题目里的“记得给免费鸡蛋打电话哦”乍一看像是 VRChat 群里的玩梗表情包,但点进去之后,真正要做的是 VRC 模型与 MMD 模型从整理、修复、优化到上传 VRChat 的完整流程。这套流程是 VRChat 创作者社区里的日常项目,核心工具链非常固定:MMD 负责模型的原始形态与动作数据,Blender 负责修骨架、改材质、做优化,最后通过 Unity 和 VRChat SDK 上传成可用的 Avatar。
这篇文章会把这条链路拆开讲清楚。你会看到 MMD 模型进入 VRChat 之前需要哪些准备、Blender 里怎么批量处理 PMX/PMDX 三渲二模型、Unity 侧怎么配置 Avatar Descriptor、上传后怎么验证表情和性能等级。不做特效魔术,只给能落地的操作流程和排查思路。适合正在做 VRChat Avatar 导入、MMD 模型二改、或者被材质丢失和穿模问题卡住的创作型玩家。
1. 这个主题到底在讲什么:VRC、MMD 与 Blender 的三角关系
先理清三者的分工。
VRChat是一个多人虚拟社交平台,用户上传自定义 Avatar 参与聊天、拍照、活动。Avatar 上传基于 Unity 和官方 VRChat SDK 完成。它可以识别 Blender/FBX 导出的模型,但需要额外挂载 Avatar Descriptor、表情动画、追踪点位等 VRChat 组件。
MMD(MikuMikuDance)是日本开发的免费 3D 动画制作软件,模型通常是 PMX 或 PMD 格式。MMD 模型有完整的骨骼、刚体、材质和表情 Morph,这些并不直接兼容 VRChat。VRChat 需要的是骨骼 SkinMesh 绑定、顶点动画、合法三角面,MMD 模型的刚体物理需要转换或删掉,表情需要映射成 VRChat 的 BlendShapes/FX Layer。
Blender是中间承重墙。直接用 MMD 工具导出的模型进 Unity,往往会出现比例错误、材质丢失、骨骼冗余、刚体残留等问题。Blender 承担三件事:
- 导入 MMD 模型并校验模型结构。
- 清理刚体、场景垃圾数据,修复穿模或错误材质。
- 导出为 VRChat 可用的 FBX,并配合插件做自动处理。
这套链路的输入输出很固定:PMX/PMD 进入 Blender,FBX 从 Blender 出去,再到 Unity 里做最终配置。整体没有“一步到位”的按钮,但模型结构规范之后再走后续流程会顺利很多。
2. VRChat 模型制作核心能力速览
把核心工序整理成一张表,方便对照自己的项目缺哪一步。
| 环节 | 工具 | 输入 | 输出 | 关键动作 |
|---|---|---|---|---|
| 模型源 | MMD 网站、模型作者发布页、自制 | PMX / PMD | PMX / PMD | 检查模型授权,确认可编辑 |
| 导入与修复 | Blender | PMX / PMD | Blender 场景 | 用 mmd_tools 或 CATS 插件导入,修复材质、骨骼、穿模 |
| 批量转换 | Blender 后台模式 | 多个 PMX | 多个 FBX | 用 Python 脚本批量导入并导出 |
| Avatar 配置 | Unity + VRChat SDK | FBX | VRChat Avatar | 设置 Avatar Descriptor、Compatibility、表情、追踪点位 |
| 上传验证 | VRChat 客户端 | VRCA 包 | 游戏内 Avatar | 检查性能等级、表情切换、同步效果 |
这项工作的核心能力可以概括为:能改模型、能批量转、能塞进 Unity、能通过 SDK 上传、能在 VRChat 里跑通表情和追踪。
值得说明的是,不同 Blender 版本对 mmd_tools 的支持程度不同,Unity 版本也要匹配 VRChat 官方 SDK 要求。建议开始时锁定一套稳定环境,不要同时追最新版 Blender、Unity 和 SDK,模型出问题后很难判断是哪一环不兼容。
3. 适用场景与使用边界
这套流程适合以下几类人:
- VRChat 玩家想做自己的 Avatar,手头有 MMD 模型但不知道如何导入。
- MMD 模型作者想把自己的模型发布到 VRChat,需要提供 FBX 和上传文档。
- 创作者在整理素材库,想把几十个 MMD 模型批量转换为统一格式的 FBX。
- 模型 MOD 制作者需要改贴图、换服装、修 Mesh,但不想碰原本的 MMD 工程文件。
不在边界内的场景也要说清楚:
- 不适合零基础直接硬上。至少需要了解 Blender 基础视图操作、Unity 场景概念和 FBX 是什么。
- 不适合拿付费模型或明确禁止改动的模型直接二改上传。授权条件必须先确认。
- 不适合把未经授权的人物形象、真人面部扫描、他人声音相关数据放进模型。近些年 VRChat 生态越来越重视版权与隐私,上传前要守边界。
版权与合规提醒:MMD 模型通常有“可以改”“不能公开发布”“不能用于游戏”“需要版权页备注”之类的授权限制,一定要看模型作者附带的 readme。不要因为模型下载包里没有明确禁止,就认为可以随便用。涉及真人形象或 VOCALOID 官方形象时,更要参考官方素材使用规定。
4. 环境准备与前置条件
推荐一套比较稳妥的创作环境,具体版本以你自己的系统适配为准。
4.1 硬件与系统
- Windows 10/11 为主,macOS/Linux 也能做 Blender 处理,但 VRChat SDK 和 Unity 生成 assetbundle 时对 Windows 的支持更顺。
- 至少 16GB 内存,32GB 更稳。Blender 加载高面数 MMD 模型 + 多张贴图时,内存比显存更容易成为瓶颈。
- 显卡 6GB 显存起步。这里不是跑 AI 推理,而是处理 3D 模型,显存需求集中在 Blender 视口和 Unity 编辑器预览。
- 磁盘预留 30GB 以上。Blender 工程、Unity Library 缓存、SDK 包缓存都会占空间。
4.2 软件清单
| 软件 | 作用 | 备注 |
|---|---|---|
| Blender | 模型修复、格式转换 | LTS 版本优先,例如 2.93 LTS 或 3.6 LTS / 4.x 看插件兼容 |
| mmd_tools | Blender 插件,导入 PMX/PMD | 开源,从 Blender 扩展或 GitHub 安装 |
| BlenderCATS | 旧版经典 MMD 插件 | 版本较老,新 Blender 可能不兼容,小心选择 |
| Unity Hub | Unity 版本管理 | 安装 VRChat SDK 指定版本的 Unity |
| Unity 2022.3 | Avatar 构建 | 以 VRChat 官方 SDK 兼容表为准 |
| VRChat SDK | Avatar 上传与性能检测 | 从 VRChat 官方仓库下载 |
4.3 通用检查清单
- Blender 能否识别 PMX/PMD 文件(装了 mmd_tools 后)。
- 模型贴图和材质是否在同一个目录结构里。
- Unity 是否能打开空场景。
- VRChat SDK 是否导入到 Unity 工程。
- 电脑是否登录了 VRChat 通行证(上传 Avatar 需要登录账号)。
5. MMD 模型导入 Blender 的完整流程
5.1 导入 PMX/PMD
打开 Blender,删除默认的立方体(也可以不清,后面的脚本会处理场景重置)。然后选择菜单中的“File > Import > MikuMikuDance Model(.pmx/.pmd)”。找不到该菜单,说明 mmd_tools 插件没有启用,去 Edit > Preferences > Add-ons 里搜索 mmd_tools 勾选激活。
导入常见的几个参数:
- Scale:MMD 模型单位与 Blender 不同,通常选择 0.08,会把模型缩小到人类尺寸比例。
- Clean Model:可选,是否清除 MMD 刚体、Joint 等非渲染数据。VRChat 不需要刚体物理,但先用不 Clean 的方式导入,方便检查原始结构。
- Use Grease Pencil:这是动态遮罩,一般不需要,不要勾。
导入后如果看到模型比例太小或太大,先不用慌,调整视图焦距或者直接改缩放,Unity 侧还会再做一次比例校准。
5.2 材质丢失与贴图变紫的处理方式
MMD 模型最常出的第一个问题:模型是紫红色或全黑。
原因多数是贴图路径失效。MMD 的贴图通常是 .tga、.png、.dds,模型文件内部引用的是相对路径。如果你把 PMX 和贴图分开放,Blender 就找不到材质。
解决步骤:
- 在 Blender 中将贴图文件和 PMX 文件放到同一层目录。
- 重新导入模型。
- 如果依旧丢失,进入 Blender 的“File > External Data > Find Missing Files”,选择贴图所在的文件夹。
- 检查材质节点,确认 Image Texture 的路径是有效路径。
不是所有 MMD 模型都自带法线贴图或者高光贴图,丢失一张 _s、_n、_g 贴图属于正常现象。只要主贴图文件能找到,颜色就能显示出来,其他贴图可以在 Unity 里用标准 Shader 补。
5.3 穿模、破面和骨骼修正
MMD 模型带刚体和骨骼,Blender 里表现为骨骼孤岛、未父级化网格等结构。在 Blender 中处理时要注意几项:
- 网格是否应用了缩放。选择网格后 Ctrl+A 应用全部变换,防止导出后比例错乱。
- 骨架是否关联到 Mesh。查看模型是否有 Armature 并且 Mesh 有顶点组绑定。没有骨骼绑定的模型不满足 VRChat 追踪要求。
- 物理刚体是否残留。在 Outliner 中查看是否有 rigidbody、joint 对象。用于 VRChat 导出前应删除这些物理对象,因为 VRChat 的 Phys Bone 是另一套专有系统,MMD 刚体不会被识别。
修复穿模比较麻烦,常见做法:
- 把嵌套在衣服里的小饰品 Mesh 删除或者单独隐藏。
- 对衣服内部穿插的顶点做刷权重处理。
- 用 Blender 的 Mesh Deform 或 Surface Deform 绑定到驱动骨。
新手最推荐的策略不是做复杂修复,而是选面数干净、骨骼清晰的模型,减少二改负担。
5.4 表情 Morph 转换为 BlendShapes
MMD 模型通过 Morph 实现口型、眼睛、脸颊变化。Blender 的 mmd_tools 导入时会把 Morph 转为 shape keys,这一步通常自动完成。
在 Blender 的 Shape Keys 面板里可以看到眼睛睁开、闭眼、哭、笑之类的 Morph 名称。如果发现一个 Morph 都没有,说明导入选项中没有勾选“Import Morph”,需要重新检查导入参数。
导出 FBX 时,shape keys 默认会保留在 FBX 中,Unity 里会自动识别为 BlendShapes,VRChat 的表情系统才能正常驱动。
6. 模型优化与批处理脚本
当手上有几十个 MMD 模型要转换为 FBX 时,一个一个手动导入导出效率太低。Blender 支持 Python 脚本后台执行,可以把整个流程串起来。
下面是一份通用批处理脚本。它做的事包括:
- 读取一个目录下所有 PMX 文件。
- 重置场景。
- 通过 mmd_tools 导入 PMX。
- 应用缩放,清理空对象。
- 导出 FBX。
import bpy import os import glob import sys # 用法示例: # blender --background --python batch_convert.py -- ./input_pmx ./output_fbx argv = sys.argv if "--" in argv: argv = argv[argv.index("--") + 1:] else: argv = [] input_dir = argv[0] if len(argv) > 0 else "./mmd_models" output_dir = argv[1] if len(argv) > 0 else "./converted_fbx" scale_value = float(argv[2]) if len(argv) > 2 else 1.0 os.makedirs(output_dir, exist_ok=True) pmx_files = glob.glob(os.path.join(input_dir, "*.pmx")) + glob.glob(os.path.join(input_dir, "*.pmd")) if not pmx_files: print("ERROR: No PMX/PMD files found in", input_dir) sys.exit(1) for filepath in sorted(pmx_files): name = os.path.splitext(os.path.basename(filepath))[0] print("Processing:", name) # 重置场景 bpy.ops.wm.read_factory_settings(use_empty=True) # 导入 MMD 模型 try: bpy.ops.mmd_tools.import_model(filepath=filepath, scale=0.08) except Exception as e: print("FAILED_IMPORT:", name, e) continue # 选中全部对象并应用缩放 bpy.ops.object.select_all(action='SELECT') for obj in bpy.context.selected_objects: bpy.context.view_layer.objects.active = obj try: bpy.ops.object.transform_apply(location=False, rotation=False, scale=True) except Exception: pass # 导出 FBX output_path = os.path.join(output_dir, name + ".fbx") try: bpy.ops.export_scene.fbx( filepath=output_path, use_selection=False, object_types={'ARMATURE', 'MESH'}, add_leaf_bones=False, apply_unit_scale=True, apply_scale_options='FBX_SCALE_ALL' ) print("EXPORTED:", output_path) except Exception as e: print("FAILED_EXPORT:", name, e)调用方式:
blender --background --python batch_convert.py -- ./mmd_models ./converted_fbx说明:脚本中的mmd_tools.import_model操作名需与插件的实际操作名一致,mmd_tools 不同版本可能略有差异,以插件界面中显示的函数名或报错为准。生产跑批前,先复制一个模型测试单文件转换,确认结果再全量运行。
批量任务还需要注意:
- 每个模型的面数、材质数量、贴图大小差异很大,建议先写一个统计脚本,输出目录中每个模型的三角面和材质数。
- 导出后的 FBX 建议单独放一个目录,不要和原文件混在一起。
- 如果某个模型转换失败,不要让脚本崩溃退出,记录错误信息后继续下一个模型。
查看模型面数的辅助脚本也可以顺手做成批量:
import bpy import glob import sys argv = sys.argv if "--" in argv: argv = argv[argv.index("--") + 1:] else: argv = [] input_dir = argv[0] if argv else "./mmd_models" for pmx in sorted(glob.glob(os.path.join(input_dir, "*.pmx"))): bpy.ops.wm.read_factory_settings(use_empty=True) try: bpy.ops.mmd_tools.import_model(filepath=pmx, scale=0.08) tri_count = 0 mat_count = 0 for obj in bpy.context.scene.objects: if obj.type == 'MESH': obj.data.calc_loop_triangles() tri_count += len(obj.data.loop_triangles) mat_count += len(obj.data.materials) print(f"{os.path.basename(pmx)}\tTriangles={tri_count}\tMaterials={mat_count}") except Exception as e: print(f"{os.path.basename(pmx)}\tERROR={e}")blender --background --python inspect_models.py -- ./mmd_models这套批处理方式本质上是“本地模型流水线”,把重复劳动交给脚本处理。面数过高的模型可以在批处理时增加一个简化步骤,或者直接在 Blender 里做 Decimate 修改器。但 Decimate 会破坏权重和造型,对 MMD 模型来说要谨慎,最好在模型源头上选择合适的低面数版本。
7. Unity 侧 VRChat Avatar 上传流程
7.1 创建 Unity 工程并导入 SDK
先在 Unity Hub 创建新工程,工程模板选择 3D(Built-in Render Pipeline),然后打开 VRChat 官方 SDK 下载页,根据官方说明导入两个包:
- VRChat SDK - Base
- VRChat SDK - Avatars
导入完成后,菜单栏会出现 VRChat SDK 选项。
7.2 导入 FBX 并检查模型
把 Blender 导出的 FBX 拖到 Unity 的 Assets 窗口,选中 FBX 后检查 Inspector:
- Model Scale:尽量保持为 1,如果模型尺寸不接近 1.6~2 米,需要调整 Scale Factor。
- Rename Bones:不要关闭。
- Avatar Definition:设置为 Create From This Model。
- 检查 Animation Type 是否为 Humanoid,如果不是,先绑定骨架。
Unity 会把 FBX 转换成 Humanoid 配置。VRChat Avatar 需要正确的 Humanoid 骨骼映射,手指骨骼、髋骨、头部追踪点都会依赖这个映射。导入后如果 Avatar Configure 里出现大量红色 Warning,说明 Blender 里导出时骨骼重命名或层级被破坏,返回 Blender 检查骨架结构。
7.3 配置 Avatar Descriptor
把 FBX 模型拖动到场景 Hierarchy,选中模型根节点后执行:
Component > VRC Avatar Descriptor配置要点:
- Viewpoint:眼睛位置,应该位于双眼中央前方一点。设置错误会导致第一人称视角偏移。
- Lipsync:可以作为表情口型触发源。
- Visemes:对应 MMD 模型的口型 shape keys,选择 VRCHAT 的 viseme 映射类型。
- Expressions / FX Layer:挂载表情菜单和自定义动画层。
- Colliders:用于模型表面碰撞,可选但不影响上传。
VRChat SDK 还要求模型网格不能有无限大的 bounding box,顶点权重要合法,骨骼不能有多余的 scale 动画。
7.4 构建上传与本地预览
在菜单栏点击:
VRChat SDK > Show Control Panel进入 Control Panel 后:
- 登录 VRChat 账号。
- 将场景中 Avatar 拖到 Blueprint 面板。
- 点击 Build & Publish 上传,或者直接使用 Local Test 在 VRChat 客户端预览。
第一次上传前,建议先用 Local Test。本地预览不会对其他玩家公开,适合检查模型表现。
一个常见的困惑是:上传报错是网络问题还是模型问题。VRChat SDK 会给出明确日志,区别在于:
- 网络问题:通常卡在打包 AssetBundle 后上传阶段,重试或更换网络可解决。
- 模型问题:SDK 在构建阶段就会弹红色错误信息,直接指向骨骼、面数或组件配置。
8. 模型性能与资源占用观察方法
8.1 注意哪些指标
一个 VRChat Avatar 的性能主要由以下因素决定:
| 指标 | 观察方式 | 越小越好 |
|---|---|---|
| 三角面数 | Unity 选中 Mesh 后检查 Polygons | 建议控制在 3 万面以内 |
| 材质数量 | 模型材质槽数量 | 控制在 8 个以内,越多渲染批次越高 |
| 贴图尺寸 | 查看贴图文件的 Max Size | 建议 1024x1024,角色衣物细节可 2048 |
| Skinned Mesh 数量 | 模型 Mesh 数量 | 越少越好,之前 MMD 拆分过細的情况要合并 |
| Phys Bone 数量 | 挂载的 Phys Bone 组件数量 | 越多开销越高,普通白飘带动画 5 到 10 根比较合适 |
这些数字不是死标准,VRChat 官方会在 SDK 中给性能等级提示。上传前打开 VRChat SDK 的 Performance 窗口查看等级,Poor 等级的模型会被系统限制镜头或隐藏,尽量不要以 Poor 发布。
8.2 观察显存和内存
Blender 或 Unity 处理高面数模型时,系统内存往往比显存先吃满。因此观察方式就分成两层:
- 如果是 Blender 视口卡顿,重点看任务管理器中 Blender 进程的内存占用,以及显卡驱动面板里的专用 GPU 内存。
- 如果是 Unity 构建 AssetBundle 时卡顿,重点看 Unity 编译进程的 CPU 占用,以及导入模型时贴图解码占用的显存。
- 贴图尺寸过大时,Unity 导入设置里会把 Max Size 调小一点,不一定要重新产出一套贴图。
8.3 降低资源占用的手段
- 模型面数高但结构简单时,可以在 Blender 里用 Decimate 修改器,但必须检查权重。
- 合并同材质 Mesh:在 Blender 里用 Join 合并多个物体,但前提是它们挂载在同一骨架下。
- 贴图从 4096 降到 2048 甚至 1024,VRChat 移动端或性能等级检测会明显变好。
- 删减没有用的空物体、隐藏物体和多余的动画 Clip。
- 使用 VRC Fury 这类第三方优化工具,可以把模型一键清理掉隐藏 Mesh、重复材质和非法组件,但使用后仍要在 Unity 里目测检查一遍。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Blender 菜单里找不到 MMD 导入项 | mmd_tools 插件未启用 | Edit > Preferences > Add-ons 搜索 mmd_tools | 启用插件,或重新安装匹配 Blender 版本的 mmd_tools |
| 模型导入后全紫红色 | 贴图路径失效 | File > External Data > Find Missing Files | 将贴图放到与 PMX 同目录,重新关联贴图路径 |
| 模型缩放在 Blender 正常,Unity 里巨大或极小 | FBX 应用缩放不一致 | 检查 Blender 导出时 apply_scale_options | 导出 FBX 前先 Apply All Transforms,Unity 里确认 Scale Factor |
| 衣服严重穿模 | 权重绑定错误或刚体干扰 | Blender 权重刷选检查 | 删除 MMD 刚体,使用原有骨骼权重重新绑定 |
| Unity 导入 FBX 后骨架显示不匹配 | 骨骼命名或层级错误 | Avatar Configure 查看映射状态 | 在 Blender 里统一骨骼命名,确保骨骼是 Humanoid 骨架 |
| 表情没有反应 | shape keys 没有导出或 VRC Visemes 没设置 | 检查 FBX 导入面板中 BlendShapes | 保证 Blender 导出了 shape keys,Unity 中 VRC Avatar Descriptor 配置 Visemes |
| 上传失败提示 Build Failed | 模型组件不合法或 Unity 版本不适配 | 查看 Unity Console 日志 | 根据错误修复模型,或切换到 VRChat SDK 支持的目标版本 |
| 模型在 VRChat 里被标记为 Poor | 面数、材质、贴图偏大 | 查看 SDK 性能报告 | 合并网格、压缩贴图、减少材质数量再上传 |
| 本地预览正常,别人看是黑的 | 使用了不被 VRChat 支持的自定义 Shader | 检查粒子材质和 Shader | 更换为 VRChat Toon Lit 或标准 Shader,确认 Fallback 正确 |
10. 最佳实践与合规提醒
10.1 工程化文件管理
建议把文件按角色名称统一组织:
avatars/ 模型名称/ source_pmx/ # MMD 原始文件 textures/ # 贴图 blends/ # Blender 原工程 exports/ # FBX 输出 unity_project/ # 对应 Unity 工程名 notes.md # 授权信息、修改记录、待办不要在一个文件夹塞几十个模型然后靠文件名找。批量处理时,脚本会把 FBX 输出到exports目录,原模型和贴图仍在source_pmx与textures中,这样重跑脚本不会污染原始资源。
10.2 版本与备份策略
Blender 工程、Unity 工程、模型源文件都要分开备份。特别是模型源文件,二次修改后就不要覆盖原文件。合理的做法是给版本号:
- 模型名称_v01_original.pmx
- 模型名称_v02_bone_fix.blend
- 模型名称_v03_texture_compress.fbx
VRChat SDK 和 Unity 版本一旦锁定,就不要在项目做到一半的时候顺手升级。新版 SDK 可能有更好的性能检测,但也可能改变导入流程,可能让你的工程 Library 缓存全部重建,增加不必要的风险。
10.3 合规与隐私边界
- 上传别人制作的模型前,先看模型的 readme 或授权页面,确认允许用于 VRChat Avatar。
- 免费模型不等于可以随意二改,有的免费模型只允许“下载使用”,禁止“再分发”。
- 真人形象模型、真人声音、真人脸型和体型数据,涉及肖像权和隐私权,除非拿到明确书面授权,否则不建议制作成公开 Avatar。
- 在 VRChat 内拍摄他人 Avatar 和内容用于文章素材时,要获得对方同意。
- 大量生成、批量上传同一风格 Avatar,也要关注平台条款,避免被判定为自动化灌水或不正当使用。
这些边界不是平台限制的灰色解读,而是创作社区长期形成的共识。遵循授权规则,作品才能长期存在。
11. 总结与下一步
整个 VRC + MMD 工作流最值得先做的是跑通一条最小路径:拿一个有授权的 MMD 模型,用 Blender 导入并清理,导出一个 FBX,进入 Unity 配置 VRC Avatar Descriptor,本地预览成功后上传。这条路径跑通之后,后续所有优化、表情、动态骨、性能调优才有意义。
最容易踩的三个坑:第一是贴图路径失效,第二是模型比例和骨骼映射错乱,第三是 VRChat SDK 与 Unity 版本不匹配。先锁定环境,再开始批量操作,能省下大量排查时间。
下一步可以考虑的方向:给模型做 VRChat 表情菜单、用动画控制器实现动态眼神追踪、用 Phys Bone 做头发与飘带物理、把多套服装做成换装系统,以及研究 VRC Fury 对高面数 MMD 模型的自动优化。工具链没有变,重点会从“能上传”转向“上传后表现好”。建议先保存模型源文件和每版 Blender 工程,多做几次本地预览再正式发布,整个流程的稳定性会高很多。