1. 骨骼名对不上,动作就白套了:先把PMX这套命名规则摸清
如果你碰过MMD(MikuMikuDance)的模型,大概率遇到过一个很烦的场景:手里有个精修过的模型,想把另一个模型的动作数据(VMD)套上去用,结果一导入,人是站着的,胳膊腿全拧成了麻花,甚至头飞出去了。多数时候这不是模型坏了,也不是动作文件有毛病,而是两台模型的pmx骨骼名称根本对不上号。
PMX是MMD生态里最主流的模型格式,可以理解成一套"骨架说明书":它规定了角色身上有哪些骨头、每根骨头叫什么、谁连着谁、哪根可以旋转哪根只能位移。而VMD动作文件里记录的也不是"第几根骨头转了多少度",而是直接用骨骼的名字去找骨头。名字对上了,动作就精准落位;名字差一个字,动作就找不到目标,要么不动,要么被塞进另一根结构相似的骨头里造成扭曲。
这篇东西写给三类人看:一是刚开始玩MMD、被套动作搞崩溃的新手;二是做模型移植、想把多套动作复用到同一个模型上的爱好者;三是用Blender的mmd_tools做二次创作、需要批量处理骨骼名的作者。我会把PMX标准骨骼的命名体系拆开讲,给一份可以直接抄的骨骼名对照表,再把改名、映射、排查的实操流程完整走一遍。看完你至少能自己判断:这次动作套歪了,到底是哪几根骨头在捣乱。
2. 从センター开始:PMX标准骨骼体系的层级拆解
2.1 躯干主干链,为什么センター是一切的原点
PMX的骨骼是一棵树,每根骨头有个"亲骨骼"(父级)。整棵树最顶上的通常是全ての親(全ての親,读作subete no oya),意思是"所有骨骼的父级",一般用来做整体位移,比如让角色在场景里走一圈。但真正驱动日常动作的根节点是センター,中文圈习惯叫"中心骨",英文对应 Center。
为什么是センター而不是全ての親?因为绝大多数的VMD动作,位移信息是写在センター上的,身体的重心起伏、前后移动、转身带位移,全靠它。全ての親在标准动作里通常一动不动,只是给模型留一个整体操控的接口。如果你把模型的根骨骼命名搞错了,比如把センター错写成Center或者中芯,动作一播,角色就杵在原地不动,上半身只在原地扭。
往上走是グルーブ(Groove,可译作"骨盆摆动"),它是介于センター和上半身/下半身之间的过渡骨,负责腰部的整体扭动。再往上分两条:一条是上半身(Upper Body),一条是下半身(Lower Body)。这两根是躯干的核心,上半身带动胸、肩、头,下半身带动两条腿。
上半身2是MMD标准里后来加的扩展骨,位置在胸腹部,专门用来做更细腻的呼吸感和胸部摆动。很多早期模型没有这根骨头,如果你拿一个带上半身2动作的VMD套到没有这根骨的模型上,那部分动作会丢失或者叠到上半身去,胸部的动作就变得生硬。往上依次是首(Neck,脖子)、頭(Head,头部),头部再分出左目 / 右目 / 両目三根眼球骨——注意,両目是双眼联动的统合骨,不是"两只眼睛"的重复。
我个人的经验是:主干链这七八根骨头的名字是绝对不能错的,因为它们承载了动作里70%以上的关键帧。改名的优先级永远从センター、上半身、下半身、首、頭这五根开始,其他都可以往后放。
2.2 手臂链与手指链,命名里藏着编号规律
手臂链从肩开始分叉,左右各一套,命名统一带左 / 右前缀。顺序是:肩(Shoulder)→腕(Upper Arm,上臂)→ひじ(Elbow,肘/前臂)→手首(Wrist,手腕)。这里有个中文用户特别容易踩的坑:日文里的"腕"指的是上臂,而我们口语说的"手臂"往往包含小臂。如果你按中文直觉去对应,很容易把"腕"当成整条手臂,改完名动作就全乱。
手指是PMX里最考验耐心的部分。标准命名规律是这样的:親指0 / 親指1 / 親指2,是拇指的三节(0是根部,因为拇指的根部骨在MMD里被特殊处理过);然后人指1/2/3(食指三节)、中指1/2/3(中指三节)、薬指1/2/3(无名指三节,日文"薬指"就是无名指)、小指1/2/3(小指三节)。左手五根指头加拇指的0号,一共16根,左右手合起来32根手指骨。
注意:手指骨的编号必须是阿拉伯数字的半角形式,写成"人指一"或者"人指①"是匹配不上任何标准动作的。这一点非常多人栽过。
手指动作在VMD里出现频率不算高,但一旦模型缺了手指骨或者名字错了,套那些带手势的动作(比如握拳、比心)时,手指会僵直成爪状插在手掌里,视觉上极其出戏。所以做模型移植的时候,手指骨的存在和命名建议一并检查,别只顾着躯干。
2.3 腿脚链、IK骨骼与D骨骼,功能命名的重灾区
腿部的标准链是:足(Upper Leg,大腿)→ひざ(Knee,膝盖/小腿)→足首(Ankle,脚踝/脚掌)→つま先(Toe,脚趾)。注意足在日文里对应大腿,足首对应脚踝,つま先才是脚尖。这三个词的译名和中文直觉的错位程度,比手臂还严重。
除了这几根主链骨头,腿部还有一类"控制用"的骨骼:
- 左足IK / 右足IK:反向动力学控制骨,动作里人物的脚踩地面、下蹲时脚不滑动,全靠它们。IK骨在MMD里是不参与普通旋转、只做位置约束的。
- 左足D / 右足D:D是Dummy(假人/变形骨)的缩写,是一套跟随IK做位移的辅助骨,用来把IK的运动传递给实际渲染的足部。
- 左つま先IK / 右つま先IK:脚尖的IK控制骨。
- 左足首D / 右足首D:脚踝的变形骨。
这套D骨和IK骨的结构,是PMX套动作时最容易被忽略的部分。一个模型如果只有主链骨、没有对应的D骨和IK骨,动作里腿部的表现就会很"飘"——脚会滑,蹲下去膝盖会穿模。很多人以为是自己模型权重没刷好,其实是骨骼结构不完整。
2.4 捩り骨骼、肩P这些辅助骨,缺了不难看、错了很难救
捩り(Twist,扭转骨)是PMX里很有代表性的一类辅助骨,比如左腕捩 / 右腕捩、左手捩 / 右手捩。它们的作用是在手臂做大幅扭转(比如手心朝上)的时候,让上臂的扭转自然地分散到两段上,避免整条手臂像一根麻花一样拧巴。如果模型没有捩り骨,动作里手臂一转,肩膀处的蒙皮就会挤成一团。
还有左肩P / 右肩P(P是Parent的缩写),是一种用于肩膀变形控制的父级骨;以及操作中心这类给MMD界面用的UI骨,一般不参与实际渲染。
这类辅助骨的处理原则是:有对应就映射,没有就丢弃,但绝不能硬塞给主链骨。我见过有人图省事,把り骨的动作合并到腕骨上,结果手臂一扭整个肩膀都跟着转,模型看起来像脱臼了一样。宁可让这部分动作丢失,也不要乱映射。
3. 一张能直接用的骨骼名对照表
3.1 MMD日文名与中文通用译名的对应
下面这张表是我平时改模型时随手维护的对照,中文译名用的是国内MMD圈比较通行的叫法,不是严格翻译,图的是沟通方便。
| PMX标准日文名 | 中文常用称呼 | 英文对应 | 层级位置 |
|---|---|---|---|
| 全ての親 | 总父级 | All Parent | 根节点 |
| センター | 中心骨 | Center | 躯干根 |
| グルーブ | 骨盆 | Groove | 腰 |
| 上半身 | 上半身 | Upper Body | 躯干 |
| 上半身2 | 胸部 | Upper Body 2 | 躯干 |
| 首 | 脖子 | Neck | 躯干 |
| 頭 | 头 | Head | 躯干 |
| 左肩 / 右肩 | 肩 | Shoulder | 手臂 |
| 左腕 / 右腕 | 上臂 | Upper Arm | 手臂 |
| 左ひじ / 右ひじ | 前臂 / 肘 | Elbow | 手臂 |
| 左手首 / 右手首 | 手腕 | Wrist | 手臂 |
| 下半身 | 下半身 | Lower Body | 躯干 |
| 左足 / 右足 | 大腿 | Upper Leg | 腿 |
| 左ひざ / 右ひざ | 小腿 / 膝 | Knee | 腿 |
| 左足首 / 右足首 | 脚踝 | Ankle | 腿 |
| 左つま先 / 右つま先 | 脚尖 | Toe | 腿 |
| 左足IK / 右足IK | 脚IK | Leg IK | 控制骨 |
| 左親指0/1/2 | 拇指三节 | Thumb 0/1/2 | 手指 |
| 左人指1/2/3 | 食指三节 | Index 1/2/3 | 手指 |
| 左中指1/2/3 | 中指三节 | Middle 1/2/3 | 手指 |
| 左薬指1/2/3 | 无名指三节 | Ring 1/2/3 | 手指 |
| 左小指1/2/3 | 小指三节 | Pinky 1/2/3 | 手指 |
| 左腕 / 右腕捩 | 上臂扭转 | Arm Twist | 辅助 |
| 左手捩 / 右手捩 | 手腕扭转 | Wrist Twist | 辅助 |
| 左足D / 右足D | 腿部变形 | Leg D | 辅助 |
这张表不用背,存下来当字典用就行。真正要记住的是那几条主干链,剩下的遇到再查。
3.2 MMD命名与主流软件命名体系的对照
如果你是要把模型导入Blender做动画,或者把Mixamo的动作转过来给MMD用,光有MMD内部的对照表不够,还得跨体系对照。下面是几个常见体系的映射关系。
| MMD日文名 | Blender (mmd_tools) | Mixamo | Unity Humanoid |
|---|---|---|---|
| センター | Center | Hips | Hips |
| 上半身 | Upper Body | Spine | Spine |
| 上半身2 | Upper Body2 | Spine1 | Chest |
| 首 | Neck | Neck | Neck |
| 頭 | Head | Head | Head |
| 左腕 | Arm_L | LeftArm | LeftUpperArm |
| 左ひじ | Elbow_L | LeftForeArm | LeftLowerArm |
| 左手首 | Wrist_L | LeftHand | LeftHand |
| 左足 | Leg_L | LeftUpLeg | LeftUpperLeg |
| 左ひざ | Knee_L | LeftLeg | LeftLowerLeg |
| 左足首 | Ankle_L | LeftFoot | LeftFoot |
| 左つま先 | Toe_L | LeftToeBase | LeftToes |
跨体系对照最容易翻车的地方是脊柱段数不一样。MMD只有上半身和上半身2两段,而Mixamo有Spine、Spine1、Spine2三段,Unity有Spine、Chest、UpperChest三段。你转过去的时候,必然有一段是多余的,或者需要把两段合并成一段。我的做法是:以段数少的体系为基准,把段数多的那边往中间压缩,比如把Mixamo的Spine2和Spine1取平均写进上半身2,这样躯干弯曲的幅度大体对得上;反过来如果目标段数多,就把MMD的上半身2复制到Spine1和Spine2各一份,虽然细节会略生硬,但不会变形。
3.3 真正让对照失效的,往往是看不见的字符问题
前面讲了那么多名字对应,但实际排查时,十个套动作失败里有三四个根本不是名字选错了,而是字符本身长得像但不一样。这几类问题特别隐蔽:
- 全角与半角:日文假名有全角半角之分。半角的 "センター" 和全角的 "センター" 在屏幕上看起来一模一样(尤其在小字号下),但字符串比对时是两个完全不同的东西。
- 大小写:英文名字段里 "center" 和 "Center" 也对不上,部分工具敏感,部分工具不敏感,不要赌。
- 中文汉化残留:有些模型被汉化工具批量改过名,"センター"被替换成了"中心",套日文标准动作时整条主干链全部失联。
- 相似字形:日文的 "ー"(长音符)和中文的 "一"、连接号 "-",肉眼几乎分不出。
- 末尾空格:从网页复制骨骼名粘贴到编辑器里,很容易带一个看不见的尾随空格。
注意:判断两根骨头名字是否一致,最保险的方法不是靠眼睛,而是复制到纯文本编辑器里,打开"显示不可见字符"或者对比字符数。名字长度差1,就是有问题。
4. 实操:用PMXEditor和PmxTailor做骨骼名对照与替换
4.1 动手前的备份与结构确认
改骨骼名前,第一件事永远是复制一份原始文件,命名成 xxx_backup.pmx 放在另一个目录。骨骼改名是不可逆操作,改错了没法一键回退,尤其批量替换的时候,稍不留神就把一堆骨头改成同一个名字,模型直接报废。
第二件事是确认目标动作文件用的是什么命名体系。方法很直接:用PMXEditor打开动作对应的模型,或者用能读VMD的工具打开VMD,看它引用了哪些骨骼名。如果VMD里全是日文标准名,那你的目标就是把模型改成日文标准名;反过来如果模型是VRoid之类的体系,那就得改动作文件或者上映射工具。
第三件事是列两张清单:一张是动作文件需要的骨骼名,一张是当前模型已有的骨骼名。两张清单放在一起比对,缺的、多的、名字不一样的就全部浮出来了。这个比对过程手工做也行,骨头多的模型建议用文本工具做差集,效率高很多。
4.2 PMXEditor里批量改名的具体操作
PMXEditor是PMX模型编辑最常用的工具,骨骼改名就在它的骨骼面板里。流程是这样的:
- 打开PMXEditor,载入你的模型文件。
- 在左侧面板切到"ボーン"(骨骼)标签,这里会列出模型所有的骨头,包含日文名和英文名两列。
- 找到要改的骨头,双击它对应的名字单元格,直接编辑。改完按回车确认。
- 如果涉及大量骨头,PMXEditor支持选中多根骨头后统一处理,但批量替换功能要谨慎,它默认是匹配整个名字还是部分匹配,不同版本行为不一致。
我的习惯是:先改主干链(センター、上半身、下半身、首、頭),改完立刻用MMD载入看一眼模型有没有变形,确认没炸再继续改四肢。分段验证能保证出问题时知道是哪一步捅的娄子。
还有一个细节:PMX里每根骨头有"日文名"和"英文名"两个字段。VMD动作匹配走的是日文名字段,英文名只是给编辑器显示和Blender导入用的。所以改名一定要改日文名那一列,英文名改不改都不影响动作套用。这一点很多人搞反了,改了半天英文名发现没用。
4.3 PmxTailor的映射表写法
如果你的目标模型骨骼名体系是固定的,不想动模型本身,那就用PmxTailor这类映射工具,把VMD里的骨骼名按一张对照表替换成目标模型的命名,再套上去。这种方式的好处是模型零改动,风险低。
PmxTailor的映射表就是一个纯文本文件,一行一条对应关系,用逗号分隔:左边是VMD里原有的骨骼名,右边是目标模型里的骨骼名。
センター,center 上半身,spine 上半身2,chest 首,neck 頭,head 左腕,shoulder_L 左ひじ,elbow_L 左手首,hand_L 左足,hip_L 左ひざ,knee_L 左足首,foot_L写法上有几个要点:
- 左边必须和VMD里的名字完全一致,包括全角半角。不确定的话,先从VMD里把名字原样复制出来。
- 不需要映射的骨头可以不写,工具会原样保留。
- 目标模型里不存在的骨头,右边留空或者直接不写这条,动作会丢弃,总比硬塞给别的骨头强。
- 映射表可以复用,一个模型建好一次映射表,之后所有走这个体系的动作都能套,效率极高。
我强烈建议每个常用模型都存一份自己的映射表,按模型名命名,比如modelA_to_mmd.txt。做过一次之后,以后再遇到同一个模型,直接载入映射表就完事,省掉的重复劳动非常可观。
4.4 Blender mmd_tools路线的处理方式
如果你是在Blender里做二次创作,用的mmd_tools插件,那骨头的命名会走另一套逻辑。mmd_tools导入PMX时,会把日文骨骼名映射成自己的命名规范,通常是 日文名 + 英文名 的组合形式,比如 "腕.L"、"ひじ.L" 这种。
在Blender里改名的思路和PMXEditor类似,但要注意mmd_tools有一份内置的骨骼名翻译字典,可以在插件设置里自定义。如果你导入的模型命名比较特殊,可以在字典里加一条映射,让插件自动识别。字典是以文本格式存在插件配置目录下的,编辑方式参照插件文档。
导出回PMX的时候,mmd_tools会反向把Blender里的骨骼名翻译回日文标准名。如果这个反向翻译在字典里找不到条目,导出后的骨头就会带着Blender的名字,套动作时自然就不认了。所以Blender路线的关键,是保证导入和导出的字典是对称的,加了一条导入映射,最好也补一条对应的导出映射。
5. 排查实录:套动作后模型扭曲、错位怎么救
5.1 症状与原因速查表
套动作出问题时,症状其实能反推出是哪根骨头出了岔子。下面这张表是我排查时最常用的。
| 症状表现 | 最可能的骨骼问题 | 排查方向 |
|---|---|---|
| 模型完全不动 | センター或根骨骼名不匹配 | 检查根骨名字 |
| 上半身扭曲成螺旋 | 上半身/上半身2映射错位 | 检查脊柱段数 |
| 手臂抬起但肩膀不动 | 肩骨缺失或名字错误 | 检查肩骨映射 |
| 手臂像麻花拧紧 | 捩り骨被错误映射到主链 | 检查扭转骨映射 |
| 脚原地滑动 | IK骨或D骨缺失 | 补全IK/D骨 |
| 下蹲时膝盖穿模 | 足D骨与主链骨层级错误 | 检查D骨父子关系 |
| 手指成爪状 | 手指骨命名或编号错误 | 检查手指骨半角数字 |
| 头部飞出去 | 頭骨映射到了别的骨 | 检查头骨与首骨 |
| 动作一半丢失 | 目标模型缺少对应骨 | 补骨或接受丢弃 |
这张表不是万能的,但能覆盖八成的常见问题。遇到症状先查表,比盲目翻骨骼列表快得多。
5.2 几个我真实踩过的坑
坑一:汉化模型的隐雷。早期我图省事,用了一个汉化过的模型,骨骼名是中文的。套日文标准动作时,上半身勉强能对上(因为中文版把上半身就叫上半身),但センター被翻译成了"中心",导致整个动作在原地播放,人物没有任何位移。当时我以为是动作本身就没位移,查了半天才发现是名字问题。
坑二:全角半角假名。有个模型的手指骨用了半角假名 "ヒジ",而标准动作是 "ひじ"。字符数一样、长度一样,肉眼完全看不出来,但匹配就是失败。后来用文本比对工具才发现差别。这类问题建议直接用工具做字符级比对,不要相信眼睛。
坑三:多余骨骼抢占动作。有次我把一根叫 "腕" 的辅助骨和标准的 "左腕" 混在一起处理,映射表写错了顺序,结果动作把整条手臂的旋转全塞进了辅助骨,主链骨一动不动,手臂看起来像断了一样。后来养成习惯,映射表写完先在测试模型上跑一遍,确认没问题再用到正式文件上。
坑四:改完名忘了同步Morph。有些模型的表情Morph是绑定在特定骨骼上的(比如眨眼绑在目骨上),你改了骨骼名,Morph的绑定关系不会自动更新,导致表情失效。改名前建议把依赖骨骼的Morph记录一份,改完逐个验证。
5.3 改名之后的连带检查清单
骨骼改名不是改完就完事,下面几项要顺手过一遍:
- 刚体(刚体)和Joint:PMX的物理刚体是绑定到骨骼上的,改了骨骼名,刚体的绑定关系一般还在(因为绑定的是索引不是名字),但如果你的工具重建了骨骼顺序,索引就乱了,物理会炸。改完名务必载入MMD看一下头发和裙摆有没有乱飞。
- Morph的骨骼绑定:如上文所说,涉及骨骼驱动的Morph要重新验证。
- 显示(表示枠):显示枠是MMD界面上骨骼的显示分组,改完名后分组里的引用可能失效,导致某些骨头在界面里显示不出来,虽然不影响动作,但操作起来很别扭。
- IK链的关联:改过足IK或者脚踝骨名字后,IK链可能断掉,脚踩地面的约束就没了。这个要在PMXEditor的IK面板里重新确认一遍。
6. 我个人在这件事上的几点体会
做了这么多次模型移植,我最大的感受是:骨骼名对照这件事,80%的时间花在排查上,只有20%花在改上。与其拿到文件就急着改名,不如先把两张清单列清楚,把症状先定位到具体哪几根骨头,再动手。盲目全改一遍,往往是把原来的问题改成了新问题。
再分享一个小习惯:每做一个模型,我都会把它的骨骼名清单导出成一份文本,命名成模型名_bones.txt存档。日后再遇到同源模型或者想复用动作时,直接读这份清单,不用再开编辑器翻。攒上十来个模型之后,你会发现很多模型用的是同一套骨骼体系,改名的活儿基本可以复用,效率提升非常明显。
还有一点,遇到名字对不上但差异很小的情况,不要凭感觉判断,一定要用工具做字符比对。这一步多花两分钟,能省掉后面半小时的抓狂。我现在的流程是固定的:提取名字 → 文本比对 → 确认差集 → 生成映射表 → 测试验证,五步走下来基本不会翻车。
最后提一句关于PmxTailor这类工具的用法,它的价值不在改单次,而在可复用。把映射表当资产攒起来,比每换一个动作就手动改一次骨骼名,长期看省下的时间非常可观。