尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

PMX转FBX导入Unity全流程:卡通渲染模型的格式转换与工程实践

发布时间:2026/9/15 13:25:44

资讯中心
01
ARTICLE

PMX转FBX导入Unity全流程:卡通渲染模型的格式转换与工程实践

PMX转FBX导入Unity全流程:卡通渲染模型的格式转换与工程实践
1. 为什么非要绕一圈PMX、FBX和Unity之间的格式鸿沟先说说我这次做事的起因。前阵子接了个Unity卡通渲染的Demo需求美术资源用的是从MMD生态里拿来的PMX模型具体是哪个模型不多说了总之就是那类二次元风格、带完整骨骼和表情形态键的角色模型。一开始我的想法很简单PMX不就带网格、带贴图、带骨骼嘛Unity又不是吃不下带骨骼的模型直接拖进去不就行了结果当然是撞了南墙。Unity对FBX、OBJ、GLTF这些通用格式支持得很顺但PMX这种MMD专用格式Unity原生压根不认。没有官方导入器也没有Runtime载入的好方案社区倒是有一些第三方PMX加载插件但稳定性、表情支持、骨骼映射都差点意思尤其在动画重定向和卡通渲染Shader衔接上非常别扭。所以绕一圈走Blender中转从PMX转成FBX是目前最可控、最通用、也最适合进Unity渲染管线的做法。这里有个基本概念需要先厘清PMX是MikuMikuDance的模型格式它不只是带贴图的模型它还把MMD专用的材质参数比如自发光、边缘色、地面阴影色、表情形态键Morph、物理骨骼Physics都打包在内部。而FBX是一个通用交换格式它把这些信息抽象成Unity能理解的那一套——网格、材质槽、骨骼层级、动画Clip。换句话说转换不是换个后缀而是重新组织整套数据。Unity不认识PMX但FBX是它的母语Blender就是那个翻译官。在做这个转换之前我还特意想了一下为什么不用Cats插件直接转换Cats是Blender里专门处理MMD模型的一个插件很多MMD转VRM的流程都靠它。但它有个问题它会把模型强转成它认为的标准结构某些原神的模型细节、表情分组、贴图连接会被它自作主张改掉。所以我的选择是用blender_mmd_tools做导入手动检查结构再用Blender原生FBX导出器输出。这套路多花一点时间但每个环节可控出了问题知道去哪个环节找。工具链选择上我建议的搭配是工具版本建议作用Blender3.6 LTS或4.x中转站负责导入和导出blender_mmd_tools最新release导入PMX保留骨骼/材质/MorphUnity2021.3 LTS或2022.3 LTS最终渲染目标卡通渲染ShaderUTS或自写Ramp/MatCap还原二次元风格这里多说一句版本问题。Blender 4.x的FBX导出器和3.x有一些细微差异如果你用的插件比较老可能不兼容4.x。我这次用的是Blender 3.6 LTS不是因为它最先进是因为blender_mmd_tools在3.6上的表现最稳导出FBX时对Armature的兼容性也最好。追求新版本反而容易给自己埋雷。2. Blender侧的导入与预处理导入只是开始检查才是重头戏2.1 插件安装比想象中容易踩坑的一步Blender装插件这件事本身不复杂但有几个细节会影响后面导入的成败。先在Edit → Preferences → Add-ons里搜索MMD安装blender_mmd_tools。装完之后在File → Import菜单里就会出现MMD Model.pmx选项。很多人在这一步卡住是因为插件装上了但菜单里看不见。这里有两个坑插件没有启用——装完之后需要在插件列表里勾选Enable只下载文件不勾选等于白装。Blender版本太新插件没有被识别为兼容——有些时候插件虽然装了但Blender版本太新插件标记的兼容版本不含当前版本需要在插件列表右上角勾选Show Extensions或者手动修改插件的blender_version属性。具体做法是找到插件的__init__.py把blender_version兼容项改成你当前的版本号保存后重启Blender。导入PMX的时候有几个选项需要勾选Scale默认是0.08这是MMD的单位1单位8cm不准确说是MMD默认模型高度约20单位对应现实1.6米左右0.08是常用缩放系数。导入时先保持默认后面导出时统一处理。Use OpenGL Coordinate System如果勾选了模型导入后会做Y-up到Z-up的转换建议不勾选让Blender按自己的Z-up坐标系处理后面导出FBX时统一转换更干净。我导入之后做的第一件事不是看模型而是检查骨骼层级的完整性。原神的PMX模型骨骼一般分两类一种是做MMD舞蹈用的标准骨骼大部分是日语命名另一种是带物理骨骼的完整骨骼链。如果导入后发现骨骼只剩一层、子级散落那多半是插件选项没开对重新导入一次勾选上Import Bones的所有子选项。2.2 材质球检查卡通渲染的第一步在这里决定把PMX导入Blender之后材质这一块是最需要手动干预的环节。PMX的材质在Blender里会以Principled BSDF节点为基础自动转换但MMD里的一些特殊参数比如边缘色、发光色、阴影色会被折叠成Blender的简易节点信息会丢失一部分。我的习惯是导入后逐个材质球点开看节点树。重点看这几项贴图路径是否指向正确。这是最常出问题的地方。PMX的贴图路径是相对MMD模型的目录存储的如果PMX和贴图不在一个文件夹里导入后贴图会丢失模型会变成灰模。透明材质设置是否正确。头发、刘海、半透明裙摆这些材质MMD里用的是Alpha混合导入后Blender的Blend Mode要手动设置成Alpha Blend或Alpha Hashed不然渲染出来会有黑边。双面着色。卡通模型的脸部翻转面、头发内侧都需要勾选双面显示否则转成FBX进Unity后从背面看会漏肉。材质部位MMD中的设定Blender需要做的处理进Unity后的预期皮肤无特殊通常不透明默认Principled即可阴影柔和接受Ramp光照头发常带环境吸收色/边缘光确认贴图连接正常必要时补Roughness贴图高光不宜过强要有卡通分层感眼睛眼睛高光独立贴图透明Alpha Blend开启确认透明面朝向正确眼睛贴图不发黑高光锐利裙子/布料背面可见双面渲染勾选双面必要时增加厚度透光效果符合二次元习惯一个常见的坑Bledner里看着材质正常导出FBX进Unity后贴图全丢或者错位。这个问题的根源通常不是Blender而是FBX的贴图嵌入方式和Unity导入器的设置。后面第4节会专门讲这里提前做个预防性提示在Blender里把贴图文件整理到统一的一个textures目录里导出时选择Copy模式嵌入贴图能省掉后面80%的贴图丢失问题。2.3 骨骼与姿态T-Pose不处理好后面动画全歪PMX模型导入Blender后一般会保持在MMD的T-Pose实际上更接近A-Pose手部有点微张这是正常的。但要注意原神的模型骨骼提取后有时会带一个默认姿态帧这个姿态可能不是T-Pose而是一个稍微有点奇怪的站姿。如果带着这个姿态直接导出FBXUnity里绑定Humanoid时可能识别不了骨骼或者识别出来的Avatar是歪的。我的处理方法是导入后选中Armature进入Pose Mode全选骨骼然后用Clear Pose TransformAltRAltGAltS把姿态归零。这一步能把骨架恢复到编辑模式下的绑定姿态也就是最干净的T-Pose。但要注意不要在编辑模式下乱动骨骼位置骨骼的相对位置是模型绑定时确定的动了之后蒙皮权重就飞了。另外一个必须提前检查的是骨骼命名。Unity Humanoid Avatar的自动映射依赖骨骼名称如果模型的骨骼不是标准命名比如Mixed/日语命名自动映射会失败。blender_mmd_tools导入时一般会保留日文或英文名称如果发现骨骼名不是Hips、Spine、Chest、Head、LeftArm这类Unity标准名可以在导入后手动批量改名。实际上原神模型提取得比较完整的话骨骼名大概率已经是英文标准命名了但以防万一我每次都会在Blender里用脚本查一遍关键骨骼名称。查骨骼名的小脚本我放在Blender的Scripting工作区里跑的import bpy armature bpy.context.object if armature and armature.type ARMATURE: names [bone.name for bone in armature.data.bones] required [Hips, Spine, Chest, Head, LeftArm, RightArm, LeftLeg, RightLeg] missing [name for name in required if name not in names] print(Missing bones:, missing if missing else None)如果missing返回空说明Humanoid映射大概率没问题如果有缺失得把对应骨骼重命名补上再把骨架的Root节点指向Hips。3. FBX导出的关键设置参数错一个Unity里全盘崩3.1 缩放与世界坐标最容易出问题的地方先说结论Blender导出FBX时最核心的三个设置是Scale、Apply Scalings、Forward/Up坐标轴。这三个参数相互关联牵一发动全身。我推荐的导出参数组合是Export Format: FBX 7.4 Binary Scale: 1.00 Apply Scalings: FBX All Forward: -Z Up: Y Apply Unit: 勾选 Apply Transform: 勾选为什么是Forward: -Z, Up: Y因为Unity是左手坐标系Y轴朝上Z轴朝向屏幕里也就是模型正面朝向-Z。Blender的默认坐标系是Z轴朝上Y轴朝向屏幕里。如果导出时不做坐标转换进了Unity模型会躺倒或者正面朝向不对。我踩过一次坑是觉得Apply Transform这个选项应该勾结果勾了之后模型的旋转虽然归零了但骨骼的朝向全乱了动画进Unity后膝盖反折。后来才明白Apply Transform适合静态网格对带骨骼的模型要谨慎。最稳的做法是在Blender里先选中Armature和MeshCtrlA → Apply Rotation Scale把模型的变换应用掉然后导出时Apply Transform保持默认或按你的插件版本决定不要重复应用导致骨骼变形。Scale这块的坑更隐蔽。MMD模型导入时默认Scale是0.08如果在Blender里不改模型高度大概0.2Blender单位因为MMD模型的1单位等于现实8cm原神角色身高约1.6米导入后就是0.2单位。导出FBX时如果Apply Scalings选择FBX All会把0.2单位放大到1.6米乘以8进Unity后Scale Factor会变成1模型就是正常真实大小。如果选择FBX Units Scale或者NoneUnity里可能得出一个0.2米的模型需要手动改Scale Factor。所以每次导出前我都要做一道算术题来确定Unity那边的最终缩放的[ UnityScaleFactor \frac{模型在Blender中的世界空间高度(m)}{目标Unity高度(m)} ]一个角色模型在Blender里看到的高度大约是0.22单位目标Unity高度是1.6米那Unity的Scale Factor就是0.22/1.6≈0.1375。记下这个数导入Unity后填在FBX导入器的Scale Factor里。3.2 骨骼与动画的导出取舍不该带的千万别带FBX导出面板里的Armature选项决定了骨骼的导出方式。对于卡通渲染角色我建议选择Armature Skinned Mesh也就是把骨骼和蒙皮网格一起导出。下面是几种情况的分析只导出Mesh不导骨骼进Unity后模型是静态的不能做动画不能换Avatar基本废了。Mesh Armature但没勾Add Leaf Bones骨骼链条会不完整Unity的Humanoid映射链条断在末梢。把所有辅助骨骼、IK目标骨骼全导出去骨骼数量爆炸Unity里Avatar配置也复杂了。这里有个操作细节原神PMX模型的附带物理骨骼如裙摆物理建议导出时选择性屏蔽。PMX的物理骨骼是通过MMD的物理引擎计算的Blender里没有对应的物理引擎导入时这些骨骼会变成普通骨骼存在。如果全部导出Unity里它们没有任何物理行为但是会占用骨骼数量影响Avatar映射的准确性。我通常是把这些物理骨骼层放到一个单独的骨骼层里导出时只导出我们需要的骨架层。顺便说一个很多教程不爱讲的操作导出前把模型摆成一个干净的T-Pose。不是只归零姿态而是确认手臂和身体之间有足够的间距不要让手臂贴住躯干。太贴的话蒙皮权重在导出-导入过程中可能转移进Unity后抬手时手臂会带出一块躯干的面。T-Pose不要求绝对标准但至少手臂和躯干之间有一个拳头的距离。贴图嵌入方面FBX导出时会在Path Mode里选择贴图路径处理方式。我推荐选择Copy这样导出时会生成一个贴图副本目录FBX里记录绝对路径或相对路径都能找到贴图。选Reference的话如果之后移动了贴图文件夹Unity导入时就找不到贴图了。这里宁可多占一点存储也不要让材质丢贴图。3.3 一个容易被忽略的检查法线与平滑组卡通渲染对法线方向极其敏感。原神的模型面数不高但它的法线经过优化边缘较硬的部分比如头发、裙褶有明显棱角感。从Blender导出FBX时法线会原样保留但要检查模型是否有翻转法线的面。Blender导入PMX后有些面会因为坐标转换出现法线反转表现是模型上有黑色的斑块。检查方式Blender的Viewport Overlays里勾选Face Orientation面朝上的会显示蓝色反的会显示红色。如果发现异常面进入Edit Mode选中它们Mesh → Normals → Flip修正后再导出。平滑组Smoothing Group在FBX里也有讲究。Blender的FBX导出器默认会把角度大于30度的相邻面自动生成硬边这个逻辑导出去。但卡通模型恰恰不需要过多硬边否则渲染时光影梯度会很碎。如果你导出后发现Unity里模型看起来棱角分明得过分多半是这个选项导致的。解决办法是导出前选中网格Mesh → Shade Smooth全部平滑FBX导出器的Smoothing选择Normals Only这样它是守着法线导出的不会自作主张重算。4. Unity端导入与卡通渲染衔接模型进来了不等于渲染能看4.1 FBX导入器的关键设置FBX拖进Unity Project窗口后需要检查两个地方Model面板和Rig面板。Model面板里最关键的是Scale Factor就是我们上面计算出来的那个数。如果导入时发现模型大小不对先别急着改Transform的Scale应该改这里。Scale Factor设正确后Transform里的Scale应该是(1,1,1)这样后续做动画、加组件、做物理都不会被非均匀缩放坑到。Read/Write Enable这个选项要开启。不开的话运行期间如果脚本要读取网格数据比如做Mesh合并、描边抽取轮廓会报错。卡通渲染经常要做后处理或者Mesh操作这个勾选是必须的。Legacy Blend Shape Normals不用管保持默认。Rig面板里把Animation Type设成Humanoid然后点Configure进Avatar配置界面。如果前面骨骼命名检查做得好这里自动映射基本一次成功。有几个容易误映射的骨骼需要手动确认Shoulder肩膀偶尔会被映射到锁骨附近的骨骼Upper Chest上胸部在有项链骨骼的模型上可能识别错。确认无误后Apply。这里提一个大多数新手会忽略的**导入的模型带不带原本的材质**FBX导出时如果材质球的节点树不太干净进Unity后每个材质槽可能会生成一个默认的Standard Shader材质球但不是我们想要的卡通渲染效果。这时候的应对策略是后面讲的通用做法——忽略FBX自带的材质直接按名字匹配到我们自己的材质库。4.2 恢复二次元质感卡通Shader的衔接与材质重映射原神的卡通渲染在业内算是很有代表性的它的核心构成可以拆成三块Ramp光影受光面与背光面的色阶过渡、MatCap/高光点缀模拟皮肤和头发的材质感、描边外轮廓与内部结构线。FBX导入后自带的是Standard Shader是PBR物理渲染完全不沾二次元的边必须换成专门的卡通Shader。我之前用的有两个方案方案一用Unity Toon ShaderUTS这是日本开发者开源的方案对MMD转过来的模型兼容性极好。UTS提供三个颜色通道Base Color、1st Shade Color、2nd Shade Color配合Ramp贴图能做出原神那种两段式/三段式的光影过渡。皮肤、头发、衣服分开调。方案二自己写Ramp MatCap采样如果不想依赖第三方Shader可以写一个Unlit风格的Shader用主贴图加上一张Ramp贴图横向从左到右是暗部到亮部通过NdotL法线点积光照方向采样Ramp的横坐标颜色的渐变就会呈阶梯状二次元感就出来了。配合边缘光Fresnel项再叠加一层效果不输UTS。不管用哪个方案材质重映射的思路都是一样的按FBX导入后生成的材质名字去匹配我们预先准备好的卡通材质库。写个编辑器脚本遍历导入的FBX子物体把MeshRenderer或SkinnedMeshRenderer上的材质换成对应名字的卡通材质就能一键完成替换。using UnityEditor; using UnityEngine; public class MaterialMapper : EditorWindow { public Material targetMaterial; [MenuItem(Tools/Material Mapper/Map Selected)] static void MapMaterials() { foreach (var go in Selection.gameObjects) { var renderers go.GetComponentsInChildrenSkinnedMeshRenderer(); foreach (var renderer in renderers) { var mats renderer.sharedMaterials; for (int i 0; i mats.Length; i) { // 按名称模糊匹配原神的材质通常是Body、Face、Hair等命名 if (mats[i] ! null mats[i].name.Contains(Body)) mats[i] AssetDatabase.LoadAssetAtPathMaterial(Assets/Materials/Cartoon_Body.mat); // 其余槽位同理可根据实际需要扩展规则 } renderer.sharedMaterials mats; } } } }这个脚本本质是做个演示实际项目中替换规则会更复杂比如一个角色可能有几十个材质槽不同部件精度不同这时候最好维护一个模型名称 → 材质映射表的配置文件把替换规则外置省得每次改代码。4.3 阴影、描边与后处理让画面活起来模型换好卡通Shader只是第一步原神那种整体画面质感还需要配合灯光、阴影和后处理。先说阴影问题。UTS里在Step Offset和Feather里调阴影边缘硬度数值越小阴影过渡越锐利二次元的切边阴影感越强。但有个大坑是Unity的Shadow Cascades如果开太高阴影边缘会被虚化卡通感就没了。我实测下来方向光的Shadow Type设为Hard Shadows加上小范围Cascade2 Cascades在PC上基本能得到接近原神PC版的阴影效果。再说描边。原神模型中外轮廓线是通过反转法线制作的背壳模型Inverted Hull实现的但PMX转FBX后这个背壳模型不会自动生成需要自己处理。有两种做法在Unity里用Shader做轮廓顶点法线方向挤出一定厚度背面渲染用纯色或带渐变色的描边。优点是简单高效缺点是头发等小平面的挤出效果可能不理想。在Blender里先做好背壳模型把原模型法线翻转往外扩大一圈材质换成一个纯色描边材质随FBX一起导出进Unity。这是最还原原神做法的路径但要处理好顶点焊接和贴图缩放的对应关系。我个人的体感是外轮廓用Shader挤出方案1内部细节线比如衣服褶皱、发丝分界用贴图自带结构线来表现两者结合效果更好。纯粹靠物理轮廓会显得塑料感太重。后处理这一层主要是Bloom和色彩分级。原神在PC端的画面有轻微的泛光和柔和的色彩对比可以在Unity的Post Processing Stack里加一个BloomIntensity调低0.3左右再加一个Color Adjustments把饱和度略微拉高一点。这样整体画面质感会贴近原游戏又不至于糊成一片。5. 全流程实测踩过最深的几个坑和排查链路5.1 模型导入Unity后黑得看不清排查出来的三个原因走完全流程后我第一次把模型拖进场景里发现模型几乎是全黑的灯光打在脸上只能看到轮廓。这个问题的排查过程比较典型我把链路写出来供参考。第一步先排除灯光问题。我把场景里的平行光强度拉高方向对准模型正面发现脸部还是黑的但是背部高光正常。这说明背面法线有反转光照方向反了。第二步去Blender里复查法线。用Face Orientation检查发现整个模型的面朝向和我想象的相反。顺手把所有面的法线统一翻转Mesh → Normals → Recalculate Outside再导出一次到Unity问题解决。类似的黑面问题还有几种可能一并列出来材质球里的Albedo贴图Alpha值太低模型整体半透明变暗。平行光没有启用Shadow卡通Shader里的阴影色块覆盖了整个模型。模型的Scale是负数某个轴翻转了导致法线方向全局反转。排查原则就一条先看网格数据对不对再看材质通道正不正常最后才动灯光。5.2 骨骼错位Humanoid映射成功但动画播放时模型拧成麻花有一次我导入后Avatar映射非常顺利但播放Unity自带动画时模型的胳膊和腿像橡皮糖一样扭来扭去。查了半天最后发现是Blender导出时我为了图省事勾了Apply Transform导致骨骼在FBX里的旋转值被烘焙成了全局旋转Unity的Humanoid解析时把模型的T-Pose理解成了错误姿势一做动画就全崩了。这个问题的修复方法是回到Blender选中ArmaturePose Mode里把姿态归零前面提过的Clear Pose Transform。在Object Mode里选中Mesh和ArmatureCtrlA → Apply Rotation Scale。导出FBX时不勾Apply Transform。这样导出的FBX骨骼旋转是局部的干净值Unity识别起来没歧义。5.3 表情Blend Shape在Unity里不生效或错乱PMX的表情形态键在导入Blender后会转化成Blender的Shape Key形态键导出FBX时只要勾选了Apply Modifiers或者相应的Shape Keys选项就能带进Unity的Blend Shape里。但这里有个原神模型特有的坑原神的眼睛、眉毛、嘴巴表情很多是通过贴图切换实现的不是几何变形。也就是说模型的网格没有变化只是换了一张脸的贴图。这种表情在PMX里叫Tex Morph或者Material Morph转换成FBX后Unity的Blend Shape不支持这种基于贴图的形态表情自然就不动了。处理方案有两条路如果是骨骼动画驱动的表情比如眨眼通过上眼皮骨骼转动那没问题骨骼导出后Unity能识别。如果是贴图切换表情就得把每个表情单独做一张纹理图集在Unity里通过脚本动态切换材质的主贴图来模拟。实际操作时我通常是在Unity里写一个表情管理器把一个角色的所有表情贴图打包成图集通过一个0到1的Float参数控制混合这样实现的表情切换比Blend Shape更扣细节卡通角色的表情表现力反而更强。5.4 破面与穿模T-Pose导出前的最后一道检查最后说一个材质之外的问题模型的破面。原神模型的裙摆、头发末端有很多小碎片Blender里看着正常导出FBX后某些小面片会消失或者反转。这个问题的根源通常是相邻面的法线索引在转换时发生了错误或者网格有非流形边。排查办法是在Blender里进入Edit Mode选择Mesh → Clean Up → Degenerate Dissolve把退化的面片清理掉然后Mesh → Normals → Recalculate Outside。如果还是出现破面检查模型的Scale是否应用了因为非均匀缩放会导致某些面上的点重合看起来像破面。6. 最后的心得这套流程的适用范围和进一步扩展做完这个流程之后我其实还想了很多。PMX转FBX本质上解决的是一个格式壁垒的问题。原神模型只是PMX生态中的一个例子MMD模型库里有大量优质的二次元角色模型只要掌握了这套转换逻辑从Blender到Unity的通路就打开了。你可以在Unity里做动作演出、做游戏Demo、做VRChat类似的社交虚拟形象、甚至把转换后的模型接到AI动作驱动上做实时动画。但我必须提醒一句如果是用别人提取的游戏模型务必注意版权边界。个人学习、技术验证没问题但商用和公开发布前必须确认模型的授权条款。这是一个经验丰富的从业者必须有的基本素养。关于卡通渲染的思路多说两句。很多人觉得卡通渲染就是把Shader换成UTS就完事了其实真正的质感差在细节阴影色阶的过渡曲线、高光的形状、描边的粗细变化、后处理的泛光强度。这些东西没有统一的正确答案跟模型的贴图风格、场景的光照设计都有关。我建议拿到一个模型后先在Maya或Blender里用它的原始材质观察一遍光影关系再在Unity里调Shader参数这样不至于凭感觉乱调。从PMX到FBX这个转换链路我目前的设计是blender_mmd_tools导入 → 法线/材质/骨骼检查 → 导出时精调坐标与Scale → Unity导入器配置 → 材质重映射 → 卡通Shader细化。每一步都有它的逻辑每一步都能单独展开讲很多。如果后面有机会我还想再写一篇关于原神风格卡通Shader参数调优的文章把Ramp贴图绘制、MatCap采样、描边Shader的挤出逻辑这些细节掰开揉碎讲清楚。那这次就先分享到这里希望这条全流程对正在被PMX模型折磨的你有点帮助。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。