Maya 蒙皮权重保姆级教程:从绑定到导出,一次刷对

适用版本:Maya 2016.5+(部分功能需 2018+)
目标读者:会基础建模和骨骼、但被刷权重折磨过的角色制作者
最终目标:拿到一套能直接导给 UE / Unity / Blender 使用的干净权重
重要说明:本教程全程只使用 Maya 自带功能,不需要任何第三方插件。比赛、考试、以及禁止第三方工具的项目可以直接照做。


目录


0. 先搞懂:为什么刷权重这么累

新手刷权重的典型姿势:绑定完 → 打开绘制蒙皮权重 → 从头到尾一笔一笔刷 → 刷到一半发现旁边被刷坏了 → 重新刷 → 循环。

问题不在手上,在于这条路线本身就是最慢的。 权重真正的产出逻辑是五段:

flowchart TD
A["1 算法打底<br/>Geodesic Voxel 绑定 + 平滑"] --> B["2 锁定分组作业<br/>锁住其余骨骼,逐组精修"]
B --> C["3 批量复用<br/>镜像 / 复制 / 传递"]
C --> D["4 局部精修<br/>只修极限姿势下的别扭处"]
D --> E["5 后处理兜底<br/>Delta Mush + 限制影响数"]

记住三句话,整篇教程都是在展开它们:

  1. 权重不是”刷”出来的,是”算”出来的 —— 让算法给你 70 分的底子,你只负责最后 30 分。
  2. 管理权重比刷权重更重要 —— 让你改一个部位时不破坏别的部位,靠的是「锁定权重」这把原生武器(第 3 章)。
  3. 不要追求完美权重 —— 剩下的瑕疵用 Delta Mush、修正形态、扭转骨去兜,比继续加笔画划算得多。

第 1 章 准备工作(漏掉这步,后面全是白工)

1.1 版本与工具清单

项目要求说明
Maya 版本2016.5 及以上更低版本没有测地体素绑定,下拉框里只有”最近距离”和”热力图”
Maya 版本(推荐)2018 及以上才有 限制总数、关节标签 等蒙皮收尾功能
第三方插件不需要本教程全部使用 Maya 自带功能。比赛 / 考试规则常禁止插件,所以第 3 章用的是原生替代方案
建模软件无所谓但模型必须经过第 1.2 节的自检

关于插件:ngSkinTools 这类”权重图层”插件确实好用,但比赛和考试通常不允许安装。本教程第 3 章给了一套纯原生的等价方案——锁定分组法,能拿回插件约八成的效率。如果你在自己不受限制的日常项目里工作,装插件当然更快,那部分内容本教程不再展开。

1.2 模型自检清单(6 项,逐项过一遍)

这一步最少花 5 分钟,能省你 5 小时。

#检查项怎么查不合格怎么办
1顶点是否全部焊接显示 > 多边形 > 边界边,如果关节附近出现不属于开口的红色亮边,说明有未焊接的缝编辑网格 > 合并 焊接;确认模型不是由多个分离壳拼接
2关节处是否有足够边环手动观察:肘、膝、肩、胯、手指根,每个关节至少 3 圈完整边环用 编辑网格 > 插入循环边 补。补边环的效果远好于刷一百遍权重
3有没有五边面/多边面网格 > 清理,勾选”非流形几何体””带洞的面””大于 4 边的面”用 编辑网格 > 四边化 或手动切开
4变换是否归零选中模型看属性编辑器,位移/旋转/缩放应该全是 0 / 0 / 0 / 1 / 1 / 1修改 > 冻结变换
5是否居中、朝向正确角色应该站在世界原点,面朝 Z 轴正方向或 -Z(和你的引擎约定一致)移动/旋转模型,然后再次冻结变换
6历史是否清干净编辑 > 按类型删除 > 历史建好骨、绑好蒙皮之前别乱删,但建模阶段的历史要清

特别提醒:如果模型是”躯干 + 手臂 + 头”三块分开的壳,绑定时测地体素算法会把人算废。先用 编辑网格 > 合并 把缝焊起来,或者确认这些壳是故意分离的(比如衣服)。

1.3 骨骼自检清单

#检查项怎么查 / 怎么做
1关节落在网格体积中心这是”怎么刷都别扭”的第一大原因。见 2.1 节
2左右关节命名规范必须用 _L / _R 或 Left / Right 后缀,例如 upperarm_L。镜像权限完全依赖这个
3加了关节标签(2018+)选中骨架根节点 → 骨架 > 关节标签 > 添加关节标签。加了标签后镜像、引擎导入都更稳
4关节朝向统一骨架 > 定向关节,让所有关节轴朝向一致(多数引擎按 X 轴向)
5骨架变换归零并冻结同上,修改 > 冻结变换
6骨骼层级合理前臂、上臂这类会有大扭转的部位,先加好 twist 扭转骨,别指望权重能解决 180° 扭转

1.4 环境准备:界面与快捷键

刷权重前必开的三个窗口:

  • 蒙皮 > 绘制蒙皮权重工具 的工具设置面板(右侧,务必展开”工具设置”)
  • 窗口 > 常规编辑器 > 组件编辑器(Component Editor)
  • 窗口 > 常规编辑器 > 大纲视图(方便快速选骨骼)

必背快捷键(Artisan 笔刷通用):

操作快捷键说明
调整笔刷半径按住 B + 左键拖动比去设置面板拉滑块快 10 倍
调整笔刷强度按住 M + 左键拖动调不透明度/值
临时反向操作按住 Ctrl(Windows)/ Command(Mac)画笔从”相加”变”相减”,不用来回切模式
框选组件Ctrl + 右键圈选快速选出一片顶点做批处理
单独显示选中对象Shift + I隔离当前网格,避免刷到旁边的衣服
显示全部Shift + A退出隔离

强烈建议:先把左侧工具架的 选择蒙版 打开,把相机、骨骼之外的物体锁住,避免误刷。


第 2 章 绑定打底

2.1 把关节对到网格体积里(Interactive Skin Bind)

这是整篇教程里”性价比最高”的一步。 骨骼在网格外面、或者在网格边缘飘着,算法算出来的权重必然是扭曲的,你怎么刷都救不回来。

操作步骤:

  1. 选中蒙皮网格(可以是多个),按住 Shift 再选中骨架根节点。
  2. 菜单:蒙皮 > 交互式蒙皮绑定 > 选项
  3. 在工具设置里:
    • 绑定方法 → 选 测地体素(Geodesic Voxel)
    • 勾选与”体积”相关的选项(不同版本叫 保留体积 / Volume),让关节倾向于保持在网格体积内部
  4. 在视口中,逐个/批量选中需要处理的关节。
  5. 用移动工具把关节拖到网格横截面的几何中心上。肩、肘、膝、胯、指根这几个位置尤其重要。
  6. 确认后点击工具设置里的 绑定蒙皮 / 完成 按钮。

判断标准:把视口切成四视图,关节应该在所有视图里都落在网格体积的中间,而不是贴在某一个面上。

如果你觉得”交互式绑定”一次只处理一部分关节太麻烦,也可以:
先普通绑定 → 再回到绑定姿势(蒙皮 > 转到绑定姿势)→ 手动调关节位置 → 重新绑定。
但必须在绑定姿势下调,否则姿势会跳。

2.2 选择绑定方法

蒙皮 > 绑定蒙皮 > 选项 → 绑定方法(Bind Method) 下拉框:

方法什么时候用什么时候别用
最近距离
Closest Distance
基本淘汰,只在极端简单模型上试默认别用,效果最粗糙
热力图
Heat Map
封闭、干净、单壳的网格;躯干、头部有开放边、穿模、未焊接的网格——经常会直接报错或者整块权重丢失
测地体素
Geodesic Voxel
默认首选。对非流形、开放边、手指、耳朵这类薄壁结构稳得多网格极其庞大(几百万面)时计算慢,可以先减面

结论:无脑先用测地体素。如果它算出来的结果明显不对,再试热力图。

2.3 绑定蒙皮参数逐项解释

蒙皮 > 绑定蒙皮 > 选项 面板里,除了绑定方法,还有这些参数:

参数建议值为什么
绑定到关节层级(Joint Hierarchy)选整个骨架,除非你只绑局部
最大影响数
Max Influences
4UE / Unity 都是 4 骨骼权重。Maya 默认 5,不提前限制就是导出后返工
衰减速率
Falloff Rate
默认 0.5影响权重的过渡速度,先保持默认
移除未使用的影响勾选减掉一堆 0 权重的无用关节,蒙皮更轻
归一化权重
Normalize Weights
交互式(Interactive)避免刷出负权重、避免权重和不为 1。选”无”是最常见的新手坑
锁定权重保持不动后续用锁定功能固定已刷好的关节

归一化权重 的三个值:无 / 交互式 / 后处理。

  • 交互式:每次刷完立刻归一,权重和永远是 1(推荐)
  • 后处理:只在收尾时归一,刷的过程中数值会飘,容易刷出负权重
  • 无:完全不管,几乎必出问题

2.4 绑定后立刻做的三件事

绑定完成、还没开始刷之前,先做这三件事,你的起点会从 0 分变成 70 分:

第一件:Flood 平滑打底

  1. 打开 蒙皮 > 绘制蒙皮权重工具。
  2. 在工具设置的”画笔”区,把 画笔模式 切成 平滑(Smooth)。
  3. 把 不透明度 调到 0.3 左右(别拉满)。
  4. 把笔刷半径调到能覆盖半个身体的大小。
  5. 点工具面板下方的 Flood(填充) 按钮,点 2~3 次。

这一步会把算法算出来的硬边过渡揉开,手感立刻好很多。

第二件:全模型统一平滑(可选但推荐)

选中网格 → 蒙皮 > 平滑蒙皮权重 > 选项:

  • 平滑迭代次数:2 ~ 3
  • 权重固定:如果某几个关节已经刷得很准,先 锁定权重 再平滑

第三件:确认归一化和影响数

  1. 选中骨架,打开属性编辑器,找到 skinCluster 节点(在大纲视图里按类型筛也行)。
  2. 确认 归一化权重 (Normalize Weights) = 交互式 (1)
  3. 确认 最大影响数 (Max Influences) = 4
  4. 确认 遵守最大影响数 (Obey Max Influences) 已勾选

2.5 绑定报错急救

报错 / 现象原因解法
热力图报错 “无法绑定”网格有开放边/未焊接换测地体素;或用 编辑网格 > 合并 焊接后重试
绑定后模型整个塌成一团关节位置严重偏离网格,或骨架有非单位变换冻结骨架变换,用 2.1 节重新对关节
绑定后某几个关节完全没权重移除未使用的影响 把它们当无用影响删了用 绘制蒙皮权重工具 手动 Add 回来
蒙皮后模型形状变了绑定姿势被破坏蒙皮 > 转到绑定姿势 检查;确认在绑定姿势下调的关节
刷权重时出现负权重(数值条跑到负值)归一化设成了”无”改成”交互式”

第 3 章 原生方案:锁定分组法(无插件)

本章是整篇教程里收益最大的部分。 它用 Maya 自带功能实现了插件里”图层隔离”的核心价值。
比赛、考试、以及客户禁止第三方工具的项目,都用这一章。

3.1 先想清楚:真正让你返工的是什么

新手刷权重的痛苦,表面上来自”刷得慢”,实际来自改坏了别的地方:

  • 你调上臂的权重,结果肩膀塌了
  • 你回头修肩膀,结果胸口跳了
  • 你回头修胸口,发现上臂又不对了

所以第一步不是提高刷的速度,而是先建立安全边界——让你当前的每一笔操作,绝对不会影响边界之外的任何东西。有了边界,每一笔都是净收益,不需要回头返工。

3.2 核心武器:锁定权重

蒙皮 > 锁定权重 / 蒙皮 > 解锁权重

这是原生 Maya 里唯一能提供”作用域隔离”的功能:

  • 被锁定的骨骼权重,在绘制、平滑、归一化时都不会被改动
  • 锁定支持两种粒度:
粒度怎么用典型场景
按关节锁定选中要保护的关节 → 蒙皮 > 锁定权重(选项里选”锁定选定关节的权重”)做隔离:处理肩膀时锁住整个下半身
按顶点锁定选中要保护的顶点 → 蒙皮 > 锁定权重(选项里选”锁定选定顶点的权重”)做保护:某一片已经刷得很准,不想再被动到

验证锁定是否生效:在绘制蒙皮权重工具里,对锁定的骨骼点一次 Flood,权重应该纹丝不动。如果变了,说明没锁上。

和插件的差距在哪:锁定只能表达”改 / 不改”,而插件图层能表达”相加 / 相减 / 覆盖 / 相乘”。但实际工作中,你要的 95% 就是”改 / 不改”——所以这个差距远比想象中小。

3.3 把骨骼分成 7 组

花 10 分钟做这件事,后面全程受益。 按”从独立到牵连”的顺序分组:

顺序组名组内骨骼(按你自己的命名替换)备注
1手指finger* thumb* index* middle* ring* pinky*建议每根手指再单独成组
2手部hand* wrist*
3前臂forearm* lowerarm* elbow*需要扭转骨,见 6.3 节
4上臂upperarm* shoulder* clavicle*难点,留足时间
5躯干spine* chest* hip* pelvis*
6腿部thigh* calf* knee* foot* toe*
7头颈neck* head* jaw*

把每一组存成”快速选择集”,这样一句话就能选中整组:

  1. 在场景里选中该组的所有骨骼
  2. 创建 > 集 > 快速选择集,命名例如 SS_上臂
  3. 之后在大纲视图底部的集面板里点一下,就选中了整组

这是原生版的”图层面板”,非常值得建。

3.4 一次完整的作业循环

以”上臂 + 肩膀”为例,每换一组就重复这套动作:

  1. 先解锁全部 —— 蒙皮 > 解锁权重,确保没有残留的锁定状态(保险做法:全选所有关节再解锁)
  2. 选中当前组 —— 点快速选择集 SS_上臂
  3. 反选 —— 选择 > 反转选择,此时选中的就是”除了上臂之外的所有骨骼”
  4. 锁定 —— 蒙皮 > 锁定权重(按关节粒度)
  5. 开始刷 —— 现在随便怎么刷,都只影响上臂这一组。肩膀塌了?胸口跳了?不可能,它们被锁死了
  6. 局部柔化 —— 需要平滑时走 3.5 节的原生遮罩流程
  7. 切姿势验证 —— 用 5.1 节的姿势库,抬臂 90°、前伸 90° 逐个看
  8. 满意后解锁 —— 蒙皮 > 解锁权重,切下一组

顺序很重要:一定要从”手指”往”头颈”走。手指最独立,刷好了不会被后面改坏;头颈和躯干牵连最多,放最后。

别忘了体力活可以脚本化:第 3.8 节的脚本能一键完成”选中当前组 + 锁定其余骨骼”,7 组循环下来能省不少时间。

3.5 原生”遮罩”:只平滑你选中的部分

插件图层的第二重价值是”只在我圈定的范围内操作”。原生 Maya 用**平滑蒙皮权重的”权重固定”**来实现:

  1. 框选你要平滑的那片顶点(Ctrl + 右键 圈选,不需要动的区域就不要选)
  2. 蒙皮 > 平滑蒙皮权重 > 选项
  3. 参数建议:
参数建议值
平滑迭代次数2 ~ 3
扩展比例保持默认
权重固定选与”仅处理选定顶点”对应的那一项(不同版本可能写作 未选定顶点 / Unselected Vertices)
  1. 点 应用。

效果是:只有你框选的顶点被平滑,其余顶点连数值都不动。 这是原生方案里最接近”图层遮罩”的操作,值得单独练熟。

另外,多数版本的绘制蒙皮权重工具会优先只作用在已选中的组件上——先框选顶点再刷,画笔就只影响这些顶点。如果你的版本试了不生效,就用上面的平滑固定法,或者配合 3.2 节的按顶点锁定保护其他区域。

3.6 数值级精修:组件编辑器

画笔刷完之后,总会有几个顶点”就是不对”。这时候别再刷了,直接用数值改:

  1. 选中问题顶点(Ctrl + 右键 圈选)
  2. 打开 窗口 > 常规编辑器 > 组件编辑器
  3. 切到 蒙皮 标签页,勾上”显示所有影响”
  4. 这里会列出每根骨骼在这些顶点上的精确权重值,可以直接输入数字
  5. 改完点右上角的 重新归一化 自动配平

典型用法:

  • 某顶点权重是 0.4999,想改成 0.5 → 直接输入
  • 某顶点同时被 6 根骨头影响 → 把权重最小的两个清零,再归一化
  • 一整片顶点的某根骨骼权重都偏高 → 输入一个正确值,整列粘贴

组件编辑器的 复制 / 粘贴 按钮,是原生方案里批量改数值的唯一途径,用熟了效率很高。

3.7 存档与回滚:原生版版本管理

  • 存档:每完成一组 → 蒙皮 > 导出蒙皮权重 > 选项 → 选 XML → 命名例如 char01_upperarm_v03.xml
  • 回滚:刷崩了 → 蒙皮 > 导入蒙皮权重 → 选对应的 XML
  • 注意:XML 是全量快照,不是差异图层,所以命名一定要带部位和版本号
  • 拓扑必须完全一致才能导入成功(同一版模型、同一套骨架)

养成”每完成一组存一份”的习惯,比赛现场能救命。

3.8 一键分组锁定脚本

手动反选再锁定,做 7 遍也烦。用下面这段脚本,输入组名就自动锁好其余骨骼:

# -*- coding: utf-8 -*-
"""
蒙皮权重分组锁定小工具(纯原生,无插件)

作用:处理某一组骨骼时,把其余骨骼全部锁定,防止刷坏别处。
用法:按自己的骨架命名改好下面的 GROUPS,在脚本编辑器里执行,按提示输入组名。

注意:本脚本使用 skinCluster 的 lockWeights 参数。
若你的 Maya 版本对该参数报错,脚本仍然会帮你选中正确的关节,
手动点一次「蒙皮 > 锁定权重」即可。
"""

import maya.cmds as cmds

# ============ 分组定义:组名 -> 关节名里出现的关键字 ============
GROUPS = [
("1_手指", ["finger", "thumb", "index", "middle", "ring", "pinky"]),
("2_手部", ["hand", "wrist"]),
("3_前臂", ["forearm", "lowerarm", "elbow"]),
("4_上臂", ["upperarm", "shoulder", "clavicle"]),
("5_躯干", ["spine", "chest", "hip", "pelvis", "torso"]),
("6_腿部", ["thigh", "calf", "knee", "foot", "toe"]),
("7_头颈", ["neck", "head", "jaw"]),
]
# ==============================================================


def skin_joints():
"""收集场景里所有参与蒙皮的关节"""
result = []
for mesh in cmds.ls(type="mesh", noIntermediate=True, long=True) or []:
for skin in cmds.listConnections(mesh, type="skinCluster") or []:
for j in cmds.skinCluster(skin, query=True, influence=True) or []:
if j not in result:
result.append(j)
return result


def match(joints, keywords):
return [j for j in joints
if any(k.lower() in j.lower() for k in keywords)]


def set_lock(joints, lock):
"""逐根设置锁定状态,返回成功数量"""
ok = 0
for j in joints:
try:
cmds.skinCluster(j, edit=True, lockWeights=lock)
ok += 1
except Exception:
pass
return ok


def main():
joints = skin_joints()
if not joints:
cmds.warning("场景里没有找到蒙皮关节。")
return

print("---- 可用分组 ----")
for name, keys in GROUPS:
print(" %-8s %d 根" % (name, len(match(joints, keys))))
print(" all 解锁全部")
print("------------------")

if cmds.promptDialog(
title="分组锁定",
message="输入组名(如 4_上臂),或输入 all 解锁全部:",
button=["执行", "取消"],
defaultButton="执行",
cancelButton="取消",
dismissString="取消",
) != "执行":
return

key = cmds.promptDialog(query=True, text=True).strip()

if key.lower() == "all":
n = set_lock(joints, False)
print("已解锁 %d 根关节" % n)
return

target = None
for name, keys in GROUPS:
if key == name or key in name:
target = match(joints, keys)
break
if not target:
cmds.warning("没有匹配到分组:%s" % key)
return

others = [j for j in joints if j not in target]
n = set_lock(others, True)

cmds.select(target, replace=True)
print("已锁定其余 %d 根骨骼;当前可操作:%s" % (n, ", ".join(target)))
print("如果锁定没有生效,请手动执行:蒙皮 > 锁定权重")


if __name__ == "__main__":
main()

3.9 这套方案和插件的差距到底有多大

插件能力原生替代差距有多大
图层叠加 / 混合模式按关节锁定 + 分组作业只能”改 / 不改”,没有相加相乘。实际影响很小
每层遮罩平滑蒙皮权重的”权重固定” + 框选顶点后再刷遮罩不能保存复用,每次要重选
图层版本管理导出 / 导入蒙皮权重 XML只有全量快照,不能对比差异
批量镜像蒙皮 > 镜像蒙皮权重基本等价
批量操作 / 脚本化3.8 节脚本 + 第 7 章脚本自己写,投入换自由度
Delta Mush / 平滑 / 归一化全是原生功能无差别

结论:原生方案能拿回插件约八成的效率。 失去的主要是”混合模式”和”图层版本对比”这两项,而它们在比赛评分标准里几乎不会被考察。


第 4 章 批量复用:不要重刷第二遍

4.1 复制蒙皮权重(Copy Skin Weights)

用于:同一个角色的不同部位、对称部位、拓扑相近的两个网格。

操作步骤:

  1. 先选中源对象(已经刷好权重的),按住 Shift 再选目标对象。
  2. 菜单:蒙皮 > 复制蒙皮权重 > 选项
  3. 参数建议:
参数建议值说明
曲面关联
Surface Association
最近点 Closest Point拓扑一致时用;拓扑差异大改 光线投射
影响关联
Influence Association
名称 Name / 一对一 One to One靠关节名匹配,所以命名必须规范
镜像行为无除非你要跨左右复制
归一化勾选保证复制过去权重和仍为 1
平滑视情况两个网格拓扑不一致时勾上
  1. 点 应用。

常见坑:复制过去的权重是”按空间位置找最近点”映射的。如果两个网格的形状差异很大(比如给胖子模型复制瘦子的权重),结果会歪。这种情况不如重新绑定。

4.2 镜像蒙皮权重(Mirror Skin Weights)

用于:左右对称的四肢、手脚。这是最容易省下 50% 工作量的操作。

操作步骤:

  1. 选中已经刷好左侧的网格。
  2. 菜单:蒙皮 > 镜像蒙皮权重 > 选项
  3. 参数:
参数建议值
镜像方向(Mirror Across)一般选 YZ 平面(取决于你的角色朝向)
镜像空间(Mirror Space)世界 World 或 对象 Object,取决于骨架位置
镜像侧(Direction)从 正 → 负 或 负 → 正,看你刷好的是哪边
  1. 点 应用。

前提条件(很重要):

  • 关节必须有正确的 _L / _R 后缀,或者有正确的关节标签。
  • 模型本身要真正左右对称。
  • 先刷好左边,再镜像到右边,不要两边都刷一半然后镜像。

4.3 把权重传递到其他网格(衣服 / 配件 / 替换件)

一个角色往往有:身体、内衣、外衣、护甲、头发、武器挂件……所有这些都绑在同一套骨架上,但只有身体需要你手工刷。

做法:把身体当源,其他网格当目标,用 4.1 的”复制蒙皮权重”。

要点:

  1. 先把衣服等网格用同一套骨架普通绑定(算法打底即可,不用管质量)。
  2. 选身体(源)→ 选衣服(目标)→ 蒙皮 > 复制蒙皮权重。
  3. 曲面关联 用 最近点,影响关联 用 名称。
  4. 对厚外套、裙摆这类离身体较远的部位,复制完再局部修一下。

这是实际项目里最大的时间黑洞。一套资产如果有 8 件衣服,不传递的话你要刷 9 遍。

4.4 导出 / 导入蒙皮权重(存档与回滚)

  • 导出:蒙皮 > 导出蒙皮权重 > 选项。可选 XML 或 权重贴图。
    • XML 精度高、文件小、要求拓扑完全一致,适合存档。
    • 权重贴图 存成图片,可跨拓扑,但精度受分辨率影响。
  • 导入:蒙皮 > 导入蒙皮权重,选同名关节的目标骨架。
  • 用途:
    • 大改动前的存档
    • 版本之间对比回滚
    • 把权重从 A 版骨架搬到 B 版骨架(前提是关节名一致)

第 5 章 极限姿势精修

5.1 先建测试姿势库(别对着 T-Pose 刷权重)

这是新手最致命的错误:T-Pose 下看着完美的权重,一动起来全是糖纸扭曲。

用时间轴搭一个姿势库(纯原生做法):

  1. 把时间轴范围设到 200 帧以上(窗口 > 设置/首选项 > 首选项 > 时间滑块,或直接在时间轴上拖)。
  2. 每隔 10 帧放一个姿势:第 10 帧摆”抬臂 90°”→ 按 S 打关键帧;第 20 帧摆”前伸 90°”→ S;依次类推。
  3. 把关键帧切线设成”台阶”,避免姿势之间出现插值过渡:全选关键帧 → 窗口 > 动画编辑器 > 曲线图编辑器 → 切线 > 台阶。
  4. 建议至少存这几个:
部位测试姿势
手臂上举 90°、前伸 90°、后摆 60°、肘弯 120°
手腕上下各 60°、左右各 45°、扭转 90°
腿抬腿 90°、屈膝 120°、外展 45°
躯干前弯 45°、侧弯 30°、扭转 60°
头颈低头 45°、仰头 30°、转头 75°、侧倾 45°
手指每根手指逐个屈伸、握拳
  1. 刷权重时,直接拖时间滑块切换姿势,一边切一边刷。给”上一帧 / 下一帧”设个顺手的快捷键(窗口 > 设置/首选项 > 快捷键编辑器),点一下就能换姿势。

为什么不用姿势库插件?因为比赛环境装不了。而时间轴姿势库的体验其实差不了多少——你本来就是在连续切姿势看变形,一键换帧比打开面板翻姿势还快。

5.2 分区作业顺序

不要从躯干开始。 推荐这个顺序(从”影响范围小、确定性高”到”影响范围大”):

  1. 手指 —— 最独立,刷好了不会被后面改坏
  2. 手掌 / 手腕
  3. 前臂 / 手肘
  4. 上臂 / 肩膀(难点)
  5. 腿 / 膝 / 脚
  6. 胯 / 髋(难点)
  7. 脊柱 / 胸腔 / 腹部
  8. 脖子 / 头 / 下颌

每完成一个部位,用 4.2 节镜像到另一侧(对称部位)。

5.3 画笔参数怎么设

蒙皮 > 绘制蒙皮权重工具 > 工具设置:

参数建议说明
画笔模式先用 替换,接缝处用 平滑相加 用在从零加权重时,缩放 用在整体加减强度
值(Value)0.9 ~ 1.0只在”相加”模式下有意义;不用调太小,靠不透明度控制
不透明度0.2 ~ 0.4宁小勿大。透明度大了刷出来的边是硬的
笔刷半径用 B + 拖动 实时调越大越平滑,越小越精确
轮廓(Profile)默认软笔刷,别用硬边
影响 列表只勾选当前要调的 2~4 根骨骼这是新手最常忽略的。同时只调少几根,结果才可控
切换显示影响打开让当前骨骼的权重以颜色显示在模型上

色卡记忆法:Maya 权重显示中,白色 = 权重 1(完全受该骨骼控制),黑色 = 权重 0(完全不受控制),红色/蓝色是过渡区。刷的时候你追求的是平滑的灰阶过渡,任何突变的白/黑边界都会导致折断。

5.4 组件编辑器精修(数值级微调)

画笔刷完之后,总会有几个顶点”就是不对”。这时候别再刷了,直接改数值——具体操作见 3.6 节。

在精修阶段特别有用的两个用法:

  • 成片拉平:某根骨骼在一片区域上的权重忽高忽低 → 在组件编辑器里框选整片,输入一个统一值,再单独柔化边缘
  • 清掉多余影响:某顶点同时被 6 根骨骼影响(会拖慢引擎、也容易出现抖动)→ 把权重最小的两根清零,再点 重新归一化

组件编辑器是原生方案里批量改数值的唯一途径,值得在练手模型上专门熟悉一遍。

5.5 各部位高频问题对照表

部位现象原因解法
上臂 / 前臂糖纸扭曲(扭转时中间变细成麻花)只有一根骨骼控制整个圆柱段加 twist 扭转骨,把扭转均匀分摊;或让上臂/前臂权重沿长度线性过渡
手肘内侧夹面、外侧鼓包权重过渡太陡 / 边环不够平滑过渡带拉宽;补 1~2 圈边环;用修正形态兜
肩膀抬臂时腋下穿模肩胛/锁骨骨骼权重不足加权重给 clavicle 和 shoulder;腋下用修正形态
肩膀抬臂时肩部体积塌陷上臂权重过早覆盖了肩膀把 upperarm 的权重起点往手臂方向推
胯 / 大腿抬腿时裆部拉伸大腿权重越过了中线把 thigh 权重严格限制在同侧;中线交给 hip/pelvis
膝盖弯曲时膝盖变成尖角权重过渡太陡拉宽膝部过渡带,让 thigh 和 calf 在膝关节两侧各延伸一段
手指弯曲时指节鼓成球指根权重给太多指节处减小权重、增加下一节指骨的权重
脖子转头时脖子下半段跟着拧脖子骨骼权重过高延伸到了胸腔把 neck 权重上限压在颈椎范围内
下颌张嘴时下巴变形下颌骨权重分布不均只让 jaw 控制下巴和嘴唇下部,别越界到脸颊
全模型权重显示正常但一动就破归一化没开检查 skinCluster 的归一化权重设置

第 6 章 后处理与导出

6.1 Delta Mush(必用)

这是”省力神器”。 它会在蒙皮变形之后再跑一次平滑,把糖纸扭曲、尖角、边缘锯齿一类的瑕疵整个抹掉,等于把”为了平滑而疯狂补权重”这一步删除了。

操作步骤:

  1. 选中要处理的蒙皮网格(skinCluster 已经在上面了)。
  2. 菜单:变形 > Delta Mush。
  3. 在属性编辑器里调参数:
参数起始建议说明
平滑迭代次数
Smoothing Iterations
5 ~ 15越大越平滑,也越损失细节。从 5 开始往上加
平滑步长
Smoothing Step
0.5每次迭代移动多少,一般不动
权重
Weight
1.0混合原始变形和 Delta Mush 结果
固定边界顶点视情况有开口的面片(如裙子)勾上,防止边缘被拉进来

代价与取舍:Delta Mush 会轻微损失体积感(关节处的”肌肉鼓起”会变平)。所以:

  • 日常姿势:权重刷得差不多就行,Delta Mush 迭代次数开大,让后处理帮你平滑。
  • 需要保持体积的部位(胸、臀、二头肌):Delta Mush 权重调低,或者配合修正形态。

6.2 修正形态(Corrective Shape)

用于:Delta Mush 也救不了的局部问题。典型场景是肩膀、腋下、髋部。

思路:把模型转到那个”破掉”的姿势,用建模手段(雕刻、晶格、位移)手动把模型修回正确形状,然后把这步操作记录下来,让它只在那个姿势下生效。

两种做法:

做法怎么操作优点
混合变形 + 姿势驱动1. 复制一个模型,转到问题姿势,修好形状
2. 用 变形 > 混合变形 建立目标
3. 用 动画 > 创建动画层 或 设置受驱动关键帧,让骨架旋转角度驱动混合变形的权重
直观,容易控制
姿势空间变形用 变形 > 创建姿势空间变形器,让骨架在指定姿势时自动叠加修正形态更适合量产、可以脚本化

判断标准:如果某个部位你已经刷了 3 遍还是不对,停下来用修正形态。继续刷是沉没成本。

6.3 辅助扭转骨

前臂和小臂在旋转 90°~180° 时,单靠权重必然糖纸扭曲。正确解法是加扭转骨:

  1. 在前臂上按一定间距复制 2~3 根关节,命名 forearm_twist_01 等。
  2. 用 设置受驱动关键帧 或直接连接属性,让扭转骨跟随手腕的旋转按比例旋转(比如每根转 1/3)。
  3. 把前臂的权重按长度均匀分配给这些扭转骨。

同样适用于大腿、上臂。这是”治本”的手段,比加多少平滑都有效。

6.4 导出前最终检查清单

逐项过一遍,全部打勾再导出:

  • 限制影响数为 4 —— 在皮肤簇属性里把 最大影响数 改成 4,勾选 遵守最大影响数
  • 移除微小权重 —— 蒙皮 > 移除小权重,阈值设 0.001(UE 默认是 0.01,可以按引擎要求调)
  • 归一化权重 —— 蒙皮 > 绘制蒙皮权重工具 → 点一次 Flood 并在归一化模式下重新归一;或直接把 skinCluster 的归一化权重设成”后处理”再切回”交互式”
  • 验证左右对称 —— 把姿态设成左右对称的极限姿势,看两边表现是否一致
  • 检查所有极限姿势 —— 用 5.1 节的姿势库逐个过一遍,没有明显穿模/塌陷
  • 检查所有服装/配件 —— 别只检查身体,衣服也要过姿势
  • 清理无用节点 —— 编辑 > 按类型删除 > 未使用节点
  • 骨架和模型命名规范 —— 导出到引擎后改名的成本很高
  • 导出测试 —— 先导一份 FBX 到引擎里,把动画跑一遍看有没有异常

关于 FBX 导出的一个坑:如果 Maya 里皮肤簇的影响数是 5,即使导出前在 FBX 选项里找不到相关设置,权重也会原样带过去,UE 会在导入时按自己的规则截断,导致结果和 Maya 里看着不一样。所以必须在 Maya 里先限制成 4。


第 7 章 一键收尾脚本

把下面这段存成 .py 文件,在 Maya 的脚本编辑器里执行。注意:先看代码里的参数区,按你的项目改。

# -*- coding: utf-8 -*-
"""
Maya 蒙皮收尾一键脚本
功能:限制影响数 -> 移除未使用影响 -> 归一化 -> 给所有蒙皮网格加 Delta Mush

用法:
1. 打开 Maya 脚本编辑器,切到 Python 标签
2. 粘贴本段代码,或点"打开脚本"载入本文件
3. 选中要处理的网格(不选则处理场景里所有蒙皮网格)
4. 执行

建议:执行前先做一次 蒙皮 > 导出蒙皮权重 存档,方便回滚。
"""

import maya.cmds as cmds

# ============ 参数区(按项目改这里) ============
MAX_INFLUENCES = 4 # 最大影响骨骼数:UE / Unity 用 4
NORMALIZE = 1 # 1 = 交互式归一化,2 = 后处理,0 = 无
ADD_DELTA_MUSH = True # 是否自动添加 Delta Mush
DM_ITERATIONS = 8 # Delta Mush 平滑迭代次数
DM_STEP = 0.5 # Delta Mush 平滑步长
DM_WEIGHT = 1.0 # Delta Mush 混合权重
# ================================================


def log(msg):
print("[蒙皮收尾] %s" % msg)


def pick_meshes():
"""返回要处理的蒙皮网格列表"""
sel = cmds.ls(selection=True, long=True) or []
if sel:
shapes = cmds.listRelatives(sel, shapes=True, noIntermediate=True, type="mesh") or []
# 用户可能选的是 shape 或 transform,这里统一回推到 transform
meshes = []
for node in shapes:
parent = cmds.listRelatives(node, parent=True, fullPath=True)
meshes.append(parent[0] if parent else node)
if meshes:
return sorted(set(meshes))

# 没选任何东西 -> 找场景里所有带 skinCluster 的网格
all_shapes = cmds.ls(type="mesh", noIntermediate=True, long=True) or []
meshes = []
for shape in all_shapes:
if cmds.listConnections(shape, type="skinCluster"):
parent = cmds.listRelatives(shape, parent=True, fullPath=True)
meshes.append(parent[0] if parent else shape)
return sorted(set(meshes))


def get_skin_cluster(mesh):
clusters = cmds.listConnections(mesh, type="skinCluster") or []
# 只保留真正挂在这个网格上的簇
for c in clusters:
geo = cmds.skinCluster(c, query=True, geometry=True) or []
if mesh in geo or mesh.split("|")[-1] in geo:
return c
return clusters[0] if clusters else None


def process_skin(mesh):
skin = get_skin_cluster(mesh)
if not skin:
log("跳过 %s:没有找到蒙皮簇" % mesh)
return False

short = mesh.split("|")[-1]
n_inf = len(cmds.skinCluster(skin, query=True, influence=True) or [])
log("处理 %s(皮肤簇 %s,绑定 %d 根骨骼)" % (short, skin, n_inf))

# 1) 限制影响数 + 移除未使用影响
try:
cmds.skinCluster(
skin,
edit=True,
maximumInfluences=MAX_INFLUENCES,
obeyMaxInfluences=True,
removeUnusedInfluences=True,
)
log(" · 影响数已限制为 %d" % MAX_INFLUENCES)
except Exception as err:
log(" ! 限制影响数失败:%s" % err)
log(" 请手动执行:蒙皮 > 限制总数(选 %d)" % MAX_INFLUENCES)

# 2) 归一化
try:
cmds.skinCluster(skin, edit=True, normalizeWeights=NORMALIZE,
forceNormalize=True)
log(" · 权重已归一化")
except Exception as err:
log(" ! 归一化失败:%s" % err)

# 3) 可选的 Delta Mush
if ADD_DELTA_MUSH:
existing = cmds.listConnections(mesh, type="deltaMush") or []
if existing:
log(" · 已存在 Delta Mush,跳过")
else:
try:
node = cmds.deltaMush(
mesh,
smoothingIterations=DM_ITERATIONS,
smoothingStep=DM_STEP,
weight=DM_WEIGHT,
)
log(" · 已添加 Delta Mush:%s" % node[0])
except Exception as err:
log(" ! 添加 Delta Mush 失败:%s" % err)
log(" 请手动执行:选择网格 > 变形 > Delta Mush")
return True


def main():
meshes = pick_meshes()
if not meshes:
log("没有找到可处理的蒙皮网格。请先绑定蒙皮,或手动选中网格。")
return

log("共 %d 个网格待处理" % len(meshes))
done = 0
for mesh in meshes:
if process_skin(mesh):
done += 1

log("完成:成功处理 %d / %d 个网格" % (done, len(meshes)))
log("下一步手动收尾建议:")
log(" 1) 蒙皮 > 移除小权重(阈值 0.001)")
log(" 2) 用极限姿势逐个验证,再看是否需要修正形态")
log(" 3) 导出前导出一份蒙皮权重 XML 存档")


if __name__ == "__main__":
main()

脚本里没有做的两件事,需要你手动补上:

  • 镜像权重:蒙皮 > 镜像蒙皮权重。镜像依赖关节命名/标签,不同项目规则不一样,脚本硬编码容易出错,建议用 UI 操作。
  • 移除小权重:蒙皮 > 移除小权重,阈值按引擎要求设(UE 常用 0.01,Maya 默认视图常用 0.001)。

第 8 章 故障排查速查表

现象最可能的原因第一步该做什么
怎么刷都不顺,总觉得别扭关节没落在网格体积中心回到 2.1 节,重新对关节
关节处永远是一条硬折线拓扑缺边环编辑网格 > 插入循环边,至少 3 圈
热力图绑定直接报错网格有开放边/未焊接换测地体素,或焊接顶点
刷权重时权重值跑到负数归一化设成了”无”改成”交互式”
一动就破面、出现尖锐突起权重过渡区太窄用 平滑 模式 Flood 几次,拉宽过渡
某一组骨骼怎么刷都没反应忘了解锁,或切换分组时锁定状态残留蒙皮 > 解锁权重,全选关节后解锁一次
想做局部平滑,结果整条腿都被抹平了平滑的「权重固定」选项没设成”仅选定顶点”回到 3.5 节,先框选顶点再平滑
一组刷完切下一组,发现上一组变了切组时没有重新锁定严格执行 3.4 节的 8 步循环,每次从”解锁全部”开始
组件编辑器里数值改了但模型没变改了没做归一化,或该骨骼被锁定点 重新归一化;检查是否有锁定残留
扭转时模型变麻花(糖纸)缺少扭转骨加 2~3 根 twist 骨
抬臂时腋下穿模锁骨/肩胛权重不足加权重给 clavicle,配合修正形态
抬腿时裆部被拉长大腿权重越过了中线严格限制 thigh 在同侧
复制权重后目标网格变形怪两网格形状差异过大重新绑定,别指望复制
镜像权重没反应关节没有 _L/_R 命名或标签补关节标签或改名后重新绑定
衣服跟着身体走但穿插严重只做了复制没有局部修复制后在腋下、胯部、肘部补刷
引擎里看着和 Maya 里不一样影响数超过 4,被引擎截断在 Maya 里先限制成 4 再导出
Delta Mush 后模型变”软趴趴”平滑迭代次数过大降到 3~5,或把权重参数调到 0.5 左右
导出 FBX 后权重全丢了场景里存在多个骨架/命名冲突检查大纲视图,确保只有一个 skinCluster 和一个骨架

第 9 章 提速路线怎么选

路线成本提速幅度适合谁
裸刷(只靠画笔逐根骨骼刷)零基准谁都不适合——本教程存在的意义就是让你别这么干
原生全套
(第 2 + 4 + 5 + 6 章:测地体素 + 镜像/复制 + Delta Mush)
零成本,看完本教程就能用约 2 倍所有人,尤其是比赛 / 考试环境
原生 + 锁定分组法
(第 3 章)
花 10 分钟划分组,或跑一次 3.8 节脚本约 3~4 倍比赛 / 考试的唯一正解
插件图层化
(ngSkinTools 之类)
装插件,学 1~2 天约 4~5 倍日常项目里不受插件限制的人
引擎端自动蒙皮
(UE 的 ML Deformer、MetaHuman 类标准化资产)
需要搭管线,可控性差视资产标准化程度而定有流水线、资产高度规范化的团队

给你的具体建议(按顺序做,不要跳步):

  1. 第 2 章 2.1 节:把关节对到网格体积里。这 10 分钟能顶掉后面两小时的无用功。
  2. 第 3 章:把骨骼分成 7 组,用锁定权重建立安全边界。这是原生方案里收益最大的一步。
  3. 第 4 章:镜像 + 复制权重,直接省掉一半工作量。
  4. 第 5 章:搭好时间轴姿势库再动手刷,别对着 T-Pose 刷。
  5. 第 6 章:Delta Mush 收尾,把剩余瑕疵一次抹平。
  6. 养成三个习惯:先对关节再绑定、先刷左边再镜像、每组完成导出一份权重存档。

附录 A 菜单路径速查

功能菜单路径
交互式蒙皮绑定蒙皮 > 交互式蒙皮绑定
绑定蒙皮蒙皮 > 绑定蒙皮 > 选项
分离蒙皮蒙皮 > 分离蒙皮
转到绑定姿势蒙皮 > 转到绑定姿势
绘制蒙皮权重蒙皮 > 绘制蒙皮权重工具
平滑蒙皮权重蒙皮 > 平滑蒙皮权重
镜像蒙皮权重蒙皮 > 镜像蒙皮权重
复制蒙皮权重蒙皮 > 复制蒙皮权重
导出蒙皮权重蒙皮 > 导出蒙皮权重
导入蒙皮权重蒙皮 > 导入蒙皮权重
限制总数(影响数)蒙皮 > 限制总数
移除小权重蒙皮 > 移除小权重
锁定 / 解锁权重蒙皮 > 锁定权重 / 解锁权重
反转选择选择 > 反转选择
创建快速选择集创建 > 集 > 快速选择集
曲线图编辑器(设台阶切线)窗口 > 动画编辑器 > 曲线图编辑器
添加关节标签骨架 > 关节标签 > 添加关节标签
定向关节骨架 > 定向关节
Delta Mush变形 > Delta Mush
混合变形变形 > 混合变形
组件编辑器窗口 > 常规编辑器 > 组件编辑器
删除历史编辑 > 按类型删除 > 历史
冻结变换修改 > 冻结变换
显示边界边显示 > 多边形 > 边界边
网格清理网格 > 清理
合并顶点编辑网格 > 合并
插入循环边编辑网格 > 插入循环边

附录 B 术语中英对照

中文英文备注
蒙皮 / 蒙皮簇Skin / skinCluster权重的容器节点
权重Weight0~1,表示该骨骼对顶点的影响程度
绑定姿势Bind Pose静止姿势,调关节必须在此时
测地体素Geodesic Voxel推荐的绑定方法
热力图Heat Map对封闭网格好,对破面敏感
最近距离Closest Distance已基本淘汰
影响数Influences每个顶点受几根骨骼影响
归一化Normalize保证权重和为 1
糖纸扭曲Candy Wrapper扭转时的典型瑕疵
修正形态Corrective Shape姿势驱动的形状修正
混合变形Blend Shape形态过渡
传递蒙皮权重Copy / Transfer Skin Weights跨网格复制
关节标签Joint Label镜像和引擎识别的依据

最后三句话

  1. 权重是算出来的,不是刷出来的。 算法打底、批量复用,你只做最后那 30 分的精修。
  2. 管理比刷更重要。 锁定、分组、遮罩、存档,这四样让你不做无用功。
  3. 够用就好。 剩下的瑕疵交给 Delta Mush 和修正形态,别在画笔上死磕。

而且这三条一分钱不花——不用装任何插件。