最近整理硬盘翻资料,翻出一堆以前从MMD社区收集的.pmx模型,顺手在Blender和Unity里各试了一遍,又把不少老朋友踩过的坑重新踩了一次。这里想围绕“在Blender与Unity上使用MMD(.PMX等)格式文件”这件事,把插件选择、模型处理、动作迁移,以及最容易让人心态炸裂的那几个问题完整梳理一遍。MMD和PMX格式本身不是复杂得离谱,难就难在它天生是给MikuMikuDance准备的,而Blender和Unity各有各的单位制、渲染管线和骨骼动画逻辑,直接把.pmx丢进去往往是一堆黑脸、错位骨骼和飘到天上的刚体。如果你准备做二次元同人动画、想把MMD角色改成游戏可用资产,或者需要在Unity里做虚拟角色演示,这篇应该能帮你少走不少弯路。
1. PMX模型在Blender和Unity之间流通的真实价值
1.1 这些格式从哪里来,为什么散落得到处都是
MMD(MikuMikuDance)最早是日本人樋口优开发的免费3D动画软件,主要面向Vocaloid相关创作,后来衍生出大量同人角色、舞蹈动画和模型资源。PMX是MMD后续版本扩展出的模型格式,相比更老的PMD格式,它在材质命名、球面贴图映射、表情组管理和物理骨修正上都做了升级。表面上你拿到的只是一个.pmx文件,但里面实际塞了网格、法线、UV、材质贴图路径、骨骼层级、形态键(表情)、刚体、约束和IK链。理解这个结构很重要,因为后续所有Blender和Unity里的问题,基本都是这些构成部分在跨软件时“水土不服”造成的。
为什么这些模型值得折腾?因为MMD生态沉淀下来的资源量非常大,想找动漫风格角色、机械配件、舞蹈动作,直接搜.pmx/.vmd,几乎要什么有什么。对一个独立开发者或者自媒体创作者来说,这比从零建模划算太多。缺点也很明显:这些资源的标准工作流都建立在MMD软件上,纹理路径、骨骼命名、单位比例都带有很强的历史包袱,换到Blender和Unity就跟方言遇上了普通话一样,翻译得好不好全靠工具和个人经验。
1.2 我实际遇到的“非用不可”的三个场景
第一个场景是渲染升级。MMD自带渲染器始终是做“动画片段”的工具,光效和景深都偏模板化。想要用Cycles/EEVEE做出更接近商业品质的效果,或者想配合Blender的合成节点出片,就必须把.pmx导进来重新调材质。
第二个场景是游戏开发。做独立游戏时想用一个现成的二次元角色,最方便的就是找MMD模型。但Unity不认识.pmx,需要转成它能识别的FBX或者借助专用插件导入,再重新整理Animator控制器、碰撞体和Rigidbody,模型才能从“跳舞的摆件”变成“能跑能跳能交互的游戏角色”。
第三个场景是模型修改和重置。很多老模型的脸部精度、材质分辨率和布线质量在现在的标准下已经不够看。我习惯在Blender里重建UV、修改脸部贴图、添加物理裙摆细节,然后导回Unity使用。这种情况下最需要的是“能在Blender里完整解析PMX”的工具,而不仅仅是能导入看一眼。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Blender接入PMX:插件选择与导入前准备
2.1 mmd_tools的安装与两个容易翻车的点
Blender这边,目前最稳的选择是mmd_tools这个开源插件,它同时支持导入.pmd和.pmx,也能处理.vmd动作文件和材质转换。安装路径是:顶部菜单“编辑 - 偏好设置 - 插件 - 安装”,选中下载好的zip压缩包,然后搜“mmd_tools”启用即可。注意,不要先把zip解压再选文件夹,Blender的插件安装器需要的是zip本身。启用后确认菜单里多出“文件 - 导入 - MikuMikuDance格式(.pmd/.pmx)”和“文件 - 导出”对应项。
第一个容易翻车的点是插件版本与Blender版本匹配。mmd_tools在Github上有多个分支,老版本代码挑Blender 2.7时代的API用,硬装在Blender 4.x上直接报错。我现在使用的是2.8以上兼容版本,装完还必须在偏好设置里检查一次是否真的被识别,别看到zip选了就以为装好了。
第二个翻车点往往在导入阶段。很多MMD模型材质贴图路径带有日文或中文,如果文件放在带有特殊字符的路径下,Blender会找不到纹理,导致导入后模型灰蒙蒙的。我的习惯是把模型和贴图文件统一放进一个小目录里,路径全改成英文数字,再导入。导入参数默认通常没问题,尤其注意scale参数:mmd_tools会把MMD模型从原始单位换算成Blender的米制单位,默认的值对应模型高约1.4到1.6米,这个比例后面导出FBX时会直接影响Unity里的尺寸,最好不要在导入参数里随手乱改。
2.2 导入后先别急着改:先看懂骨骼、刚体和材质树
成功导入后,Blender的大纲视图里会出现不少新东西:一个主网格对象、骨骼(Armature),以及一大堆看起来像小盒子的刚体对象。刚体对象在MMD里是用来模拟头发、裙子、胸部等部位物理摆动的,不参与渲染,但如果你的目的是做表情特写或者建模改造,它们反而会碍事。我的处理是先把刚体集合隐藏起来,只保留模型和骨骼进入编辑状态。
第一次接触MMD模型的人,最容易犯的错误是见到这么多骨骼就直接进入姿态模式乱掰。MMD的骨骼分两种:普通变形骨骼用来驱动身体移动,附带物理的骨骼则要配合刚体解算才能动得自然。在Blender中如果直接旋转带物理的骨骼,效果可能很生硬,甚至把模型拉变形,因为约束和刚体还没被正确激活。所以导入后先做三件事:第一,在骨骼数据属性里查看是否有“表情”形态键被正确加载;第二,确认材质球数量;第三,打开Blender的Rigid Body World面板,了解当前刚体世界的状态后再考虑要不要启用物理模拟。
3. 在Blender里改PMX模型时,我优先处理四个区域
3.1 材质与贴图:MMD的Toon信息映射到Cycles/EEVEE
MMD模型走的是卡通渲染路线,材质里包含主贴图(color)、自发光贴图、法线贴图和Toon贴图(类似Cel Shading用的亮度阈值图)。mmd_tools导入后会把它们转换成Blender的节点树,但转换结果往往偏保守,直接渲染出来通常不够“二次元”,也不够干净。
我的常规做法是,选中模型,进入材质属性面板,逐个材质检查节点。重点看是否每个材质球都接了一个图像纹理,纹理的颜色空间是否为“sRGB”。对于头发、裙子和装饰物,则需要把混合模式改成alpha clip或alpha hash,否则在EEVEE里很容易出现透明排序错误。千万不要以为节点多就等于丰富,很多老模型会把一堆无效贴图挂在节点树里,清理掉反而能减少渲染负担。
有些模型的材质厚度感很差,需要手动调粗糙度。MMD的Toon材质对应的其实是高光闭合和一个近似入射光阈值的着色逻辑,在Blender里我习惯给主材质加一个Principled BSDF,保留贴图颜色的同时,把roughness设为0.4到0.6,specular设为0.5附近。如果你追求比较纯净的卡通感,也可以接一层Toon BSDF配合主贴图,不过这个更依赖个人审美,没有统一标准。
3.2 物理刚体和约束:从一个“摆件”变成能动的角色
如果只是做静态图或者单纯绑定动画演示,刚体可以直接忽略。但如果你想让头发和裙摆随着角色转身自然摇晃,就得认真处理刚体。MMD的物理系统本质上是一个弹簧约束网络,角色是主体骨架,头发等“附属骨”通过约束连接在主体上,刚体负责碰撞检测。
在Blender中使用mmd_tools导入的时候,刚体世界往往会按对象类型分组成“刚体”“连接”之类的集合。要启用物理,需要到“场景属性 - 刚体世界”里确认类型为“动态”,然后选择全部刚体对象并设置quality与collision margin。这里有个坑:很多旧模型的刚体数量非常大,动辄几百个,模拟起来Blender会卡成PPT。所以我的建议是把物理模拟限制在真正需要的部位,比如长发和裙摆,其他刚体直接隐藏或删除。还有,如果需要物理参与渲染动画,提高解算次数很关键。在刚体世界的设置里,把每秒步数调整到120左右,速度采样调大,可以明显减少刚体抖动。
3.3 表情形态键的管理与备份
MMD的表情在Blender里会被转换成形态键(Shape Keys),比如笑、哭、闭眼、张嘴这些。由于形态键是基于顶点差值的,一旦你修改了模型网格结构,比如重新拓扑了脸部,原形态键很可能失效。所以动手改网格前,先到右侧数据面板检查一下是否有形如“眉上”“目”开头的形态键列表。
如果你想在保留原始表情的基础上调整脸型,建议先把模型复制一份,在这个备份网格上练习修改。此外,很多模型头部有几组材质分别对应眼睛、眉毛、面部皮肤和嘴巴,改动时要小心不要误删材质槽,否则表情即使有,也会因为缺少材质而变得诡异。
导出FBX时,Blender默认会带出口Shape Keys,但要确认导出面板的“应用修改器”和“仅选中”选项是否符合预期。像“仅选中”如果关闭了,会把场景里其他参考模型也导进去,破坏Unity里的结构。
3.4 保存与重导出:谨慎处理原点位置与命名
在Blender中改完模型后,保存成.blend文件是自己的工程,真正要留给Unity的是FBX或直接从mmd_tools导出的PMX。这里最容易被忽略的是“原点”和“命名”。MMD模型的原点通常位于角色双脚中间的地面位置,如果Blender里你加了分组或重新绑定了骨骼,物体原点可能漂移。导出前选中主模型,设置原点到几何中心或者保持原始原点,然后按Ctrl+A应用全部变换。
命名也很关键。Unity读取动画剪辑时主要通过骨骼名称匹配,骨骼名字一旦出现后缀“_copy”或者数字后缀,Animator映射就会乱。在Blender里导出前检查Armature的骨骼命名里有没有特殊符号和重名。我的习惯是,在导出前把刚体和辅助对象隐藏,只保留网格、骨骼和表情,这样FBX里不会出现一长串物理辅助节点。
4. Unity端接入PMX:插件路线与角色配置实战
4.1 MMD4Mecanim导入前的注意事项和参数
Unity要直接吃.pmx,成熟方案是MMD4Mecanim插件。它不仅能导入模型,还能把.vmd动作转成Unity的AnimationClip,极大地方便制作舞蹈类游戏内容。插件使用前有一点要明确:它会默认生成一套自己的物理方案,包括刚体、碰撞体、弹簧关节,导入参数需要认真设置,否则角色就像一个松散的人偶。
导入流程是先把MMD4Mecanim文件夹拖进Unity的Assets目录,然后找到顶部菜单“MMD4Mecanim - Convert - PMX Model”。在弹出的窗口里选择.pmx文件,同时可以选择对应贴图文件夹。比较关键的选项是“导入材质”和“生成Avatar”。如果目标是在Unity里使用二次元风格渲染,我建议先不要急着生成材质,保留MMD原贴图,等导入后用专门的二次元Shader处理。
另一个值得注意的参数是比例设置。MMD4Mecanim默认会把模型缩放为适合Unity的身高,通常生成的角色高度在1.5到1.7米。如果你要把这个角色放进一个特定比例的房间场景,记得先对照Unity默认胶囊体检查大小。
4.2 骨骼映射与Animator设置:让Unity的Animator认识MMD骨架
MMD4Mecanim导入后会自动尝试映射Unity Humanoid骨骼,比如把“上半身”“下半身”“頭”这些骨骼匹配到Unity的Humanoid对应部位。但自动映射不是100%可靠,尤其面对改造过的模型。导入后要立刻打开模型文件,进入Rig页,选择Humanoid,打开Avatar Configuration逐项检查。
如果出现角色倾斜、骨盆位置不对,多半是根骨骼和Hips映射错了。MMD的骨骼名称是日文/中文,在Unity英文界面下容易对不上号。手动映射时可以打开左侧“Bone Mapping”列表,逐项指定。注意MMD的脊柱分了好几节(髋关节、腰、胸、颈等),Unity的Humanoid可能只会认其中一部分,剩下的骨骼可以作为附加骨骼保留,不影响动画。
Animation Type选择Humanoid的另一个好处是可以用Unity的IK系统,例如让角色视线跟踪摄像机,或者手部正确抓住物体。如果你选了Generic,则只能依靠骨骼名驱动动画,很多玩法逻辑会难写很多。
4.3 物理与碰撞体的二次处理:避免角色睡觉时飘起来
导入.pmx后,Mesh下面会挂载不少球体、胶囊体碰撞体,这些是从MMD刚体转化来的。它们在Unity里一般挂有Rigidbody和对应Spring Joint。这里有个经典问题:角色导入后在编辑器里正常,一按Play整个人往下掉或者在地面上抖成筛子。
原因通常是刚体设置成了Dynamic且Use Gravity打开,而模型和地面之间又没有合适的碰撞体。解决分两步:第一步,模型自身物理调试阶段先关掉Use Gravity,改成Kinematic,确认骨骼驱动正常;第二步,给角色脚下加一个Static的地面Collider,再逐个调整刚体的Collider半径和高度,让裙摆、头发、胸口装饰都在合理范围内。
特别提醒,MMD4Mecanim生成的角色会有多个Rigidbody,如果你打算用Unity的CharacterController做游戏角色控制,就得考虑是否保留它们。因为CharacterController本身不参与物理碰撞,保留一堆Rigidbody会造成角色穿插。我的做法是,对于需要动画驱动的头发和裙子刚体先保留,其余刚体全部移除。
5. 从Blender到Unity的FBX工作流:比例、材质和动作搬运
5.1 FBX导出:单位、缩放、轴向和法线
如果模型已经经过Blender深度修改,我通常会直接导FBX再进Unity,毕竟MMD4Mecanim导入的是原始.pmx,改完的模型反而绕不回去。Blender导出FBX时,最影响Unity效果的是几个参数:
| 设置项 | 推荐值 | 理由 |
|---|---|---|
| 应用变换 | 开启 | 消除Blender里的旋转/缩放残留 |
| Forward | -Y | 匹配Unity的角色前方向 |
| Up轴 | Z | Blender默认Z-up,导出成Unity的Y-up需要该设置 |
| 应用缩放 | FBX Units Scale | 避免Unity里出现0.01这种奇怪的缩放值 |
| 形状键 | 勾选 | 保留表情形态键,后续导入Unity的BlendShapes |
如果你不确定Forward轴,可以先导一个最基础的立方体对比。通常Unity角色默认面向+Z轴,Blender里模型面向+Y或-Z视建模习惯而定。调整对之后,导入Unity的模型前后方向就不会别扭。
5.2 Unity导入面板上的几个设置,决定了你的角色是否变形
FBX导入Unity后,不要直接拖进场景就完事。首先要看模型选项卡里的“File Scale”,如果你的Blender场景单位是米、角色身高1.5,这里通常不需要额外改;如果用了非标准比例,File Scale会显示成奇怪的值,角色进场景后会突然变大或缩小。再往下是法线设置。Blender里如果你用了自动平滑,导出的FBX法线是硬边法线,Unity里最好设为“Import”而不是“Calculate”,否则原有光滑组信息可能被覆盖。
Rig选项卡里,如果之前做了Avatar配置,要确保Animation Type是Humanoid,并确认Avatar引用正确。Material选项卡里,把材质创建模式设为“Standard”或“SRP”,避免生成一堆不可见的旧Shader材质。另外,如果以后要循环播放舞蹈动作,记得在Animation选项卡勾选“Loop Time”,并调整循环匹配范围,否则动作播放完会跳回 T 姿势。
5.3 VMD动作迁移到Animator的三种方式
MMD动画文件是.vmd,Blender和Unity都无法直接当作Animator Clip使用,但都有办法转。
方式一,用MMD4Mecanim直接把.vmd转换成Unity AnimationClip。这是最简单的路径,适合模型没经过大改的情况。转换后在Asset里会多出一个动画文件,拖进Animator Controller即可。
方式二,在Blender里导入.vmd,让mmd_tools把动作套到骨骼上,然后用NLA编辑器或Action数据烘焙成FBX动画。这样做的好处是动画已经和模型骨骼绑定,导出的FBX自带动画,Unity里只要用Generic Animation模式读取即可。缺点是无法直接利用Humanoid的IK重定向,转换出来的是固定骨骼动画。
方式三,对已经发展成完整角色的模型,手动在Unity里重新录制动画。这种做法适合只想借用模型、动作完全不需要保留MMD风情的情况。我会用Timeline配合骨骼动画,逐帧调整关键姿态,操作量大,但最终效果最贴合游戏手感。
6. 来回调试踩过的坑:完整排查链路和修复记录
6.1 模型发黑/发暗:先从贴图Color Space开始查
模型导入后整体发黑是最高频的问题。在Blender里看起来正常的贴图,到了Unity却暗得像背光,大多数情况不是灯光问题,而是贴图的Color Space被错误标记成了Normal Map或者勾选了奇怪的sRGB模式。排查链路是:先选中材质球对应的主贴图,检查Unity导入面板里的颜色空间设置;如果贴图本身是彩色主贴图,必须勾选sRGB,如果是法线贴图则取消勾选。
有时候发黑也来自材质shader选择不对。MMD原版材质带有Glow和Toon贴图,直接套Standard Shader会把toon贴图当作自发光,导致颜色过曝或发黑。我的建议是使用专门的卡通渲染Shader,比如Unity的Toon Shader或者URP下的二次元风格Shader,把Toon贴图塞进特化的高光槽,效果会比Standard Shader自然很多。
6.2 角色穿地或飞天:刚体组和单位缩放脱不开关系
如果在Unity里点击Play后角色直接坠落到Y轴负数,或者像弹跳球一样上下颠簸,先不要怀疑动画,而是去检查刚体。排查链路是这样:第一步,把角色Animator组件暂时禁用,观察默认T pose是否有下坠趋势;第二步,检查角色根部的Rigidbody是不是Dynamic并开启了Use Gravity;第三步,检查地面是否有Collider。
角色飞天通常是由单位的缩放不当引起的。如果FBX导入的File Scale不正确,角色在Unity里显示为几十米高,就会掉出一般场景的碰撞范围。遇到这种情况先把模型Scale重新设为1,检查角色的胶囊体高度,再把刚体Use Gravity关掉,改用代码对角色施加向下的间接力,或者干脆用Character Controller插件替代原生刚体。
6.3 表情丢失:形态键没有迁移到Unity
Blender里表情调得好好的,到了Unity怎么都变成无表情状态,这个我栽过跟头。排查链路是先回Blender确认形态键还存在;再检查FBX导出时有没有勾选形状键;导入Unity后,选中模型,在网格部分的Import Settings里确认“Import BlendShapes”已打开。如果所有设置都对但表情还是不触发,要确认模型使用的是SkinnedMeshRenderer,而不是MeshRenderer,因为只有SkinnedMeshRenderer支持蒙皮和BlendShapes,普通网格渲染器完全读不到表情数据。
MMD4Mecanim导入的话,表情映射是自动的,但通常位于模型自身的自定义脚本中。如果用了FBX导入,则要自己写代码或者用Animator的Blend Shape节点去驱动权值。
6.4 透明零件排序错乱:渲染队列问题
MMD角色的裙子、头发、蝴蝶结之类经常是半透明贴图,到Unity里就会出现“透过头发看见后脑勺”“裙摆里层显示在外面”这种穿帮。排查链路首先要看材质Shader是否使用透明混合模式,如果没有,把Surface改成Transparent或者Alpha Clip。如果透明混合模式开启了,但排序还是乱,可以尝试调整渲染队列,在Shader代码里指定Tags,或材质面板里设置Render Queue,比如把头发材质放在3000之后。URP管线下还要注意Depth Write是否开启,开启后能解决很多遮挡关系错误,但有可能让半透明头发边缘出现黑边,需要再配合模糊层处理。
6.5 导入后表面出现奇怪的裂纹:法线和平滑阴影设置
模型表面在Unity里出现细线状的黑色裂缝,尤其发生在脸颊、手肘这些曲率大的地方,基本是法线问题。在Blender里编辑模型时,法线信息分布在顶点和面边两侧,如果原本模型包含多条硬边(嘴角、眼角这种),Blender的自动平滑会用30度角拆分。导入Unity后如果法线导入设置清掉了这些硬边信息,模型表面就会被错误地统一光照,出现阴影裂缝。
修复方法是回到Unity导入设置的Model页,把Normals设置为Import,并在下面勾选Calculate Lightmap Seams等选项。如果还有裂缝,只能回到FBX导出前,在Blender里把“自动平滑”角度调低到45到60度再导出,或者干脆关闭自动平滑让网格使用原始法线。
6.6 构建游戏后角色变得很轻/很重:刚体配置尚可但物理React怪异
这个坑我遇到得更隐蔽。在编辑器里一切都好,打包进安卓后,角色的头发却像失重一样飘起来。原因是不同平台物理帧率不一致,Unity的物理步长在移动端可能变快,导致弹簧关节力过大。排查时先把物理扩展里所有Spring的damper值调大一倍,再把碰撞体的触点数降低。如果仍然很飘,就把裙摆刚体从Dynamic改为Kinematic,改由Animator骨骼直接驱动,放弃物理模拟,这样稳定性大幅提升,只是视觉效果上少一点随机晃动。
7. 一些实用的管道心得体会
如果你只是想把MMD动作场景复刻到Blender里看渲染效果,那么一条路径就够了:安装mmd_tools导入.pmx和.vmd,调整材质,建好灯光摄像机,直接出片。这类工作流依赖的是mmd_tools本身的物理模拟和动作解析能力。
如果你是把模型改成游戏角色,建议不要一条路走到黑。我现在的习惯是:先评估模型是否需要深度改造,只需要做渲染效果调整时直接用MMD4Mecanim;需要改脸型、改布线、加材质细节时,在Blender里改完后再走FBX进Unity。避免把同一个模型在Blender、MMD和Unity之间反复倒来倒去,每倒一次,材质和骨骼数据就会损失一层。
还有一点必须提醒:MMD社区模型版权情况比较复杂,有些模型明确禁止用于游戏或商业项目,有些允许改造但要求保留原模型作者信息。无论你是做同人短片还是个人小游戏,动手前最好翻一下模型自带的readme文本,尊重一下作者的使用范围。
最后给一个小技巧:把所有常用模型统一一个基础目录结构,每个模型文件夹里放好“模型原始文件”“贴图”“修改后的blend工程”“Unity导出”四个子目录。这样哪怕过了半年再回来维护,也不至于出现“这个模型贴图找不到”“这个FBX是哪个版本改的”这种事儿。工具上踩过的坑总会有,但项目整理得越清晰,后期翻车概率就越低。
