写在前面
绑定真的是一门层级约束的艺术啊,很难相信这些人能把简单的层级约束关系玩出千万种花样。作为一名全栈TA怎么能连绑定都不会!(虽然我也是最近才开始系统地看Maya绑定知识)学好绑定做作品简直如虎添翼是不是,模型终于可以动起来了。
可能你会问:为什么是Maya?学Max不好么?其实主要也是个人原因(不会Max)。同时Maya绑定动画模块也确实很强大,且绑定思路其实都很类似,抓住一个开学就完事了。
这篇文章先开个坑,讲下Maya内部绑定相关,后续会继续更新UE相关骨骼动画系统、状态机、ControlRig、ALS、AI等内容。所有文章都会收录到本文所在的专栏:包小猩技术美术碎碎念 - 动画向 中。
本文根据个人学习经历,边学边记,希望能帮你从小白快速进阶到手绑大佬,一脚跨入动作TA大门(理想)。
关于Maya版本,本文使用的是Maya 2023,But Don't Panic,Maya的绑定历史非常悠久,许多操作经典永流传十几年都没有更新过,所以大部分操作新老版本都适用。
打下预防针:这篇文章偏基础些,基本上都是些绑定相关概念的集合,后面会继续写具体的绑定实操技巧(边学边写,现学现卖)。
更新:如果想看其他绑定相关内容,可以看最近更新的文章:
推荐一些绑定相关的网站(期待扩充)
绑定基础概念 - Maya绑定界面和模块介绍
绑定界面切换
Maya绑定界面可以单独在左上角的菜单栏切换,Skeleton、Skin、Deform、Constrain等面板在切换到Rigging后才会显示。

同时你也可以在快捷菜单栏中找到Rigging相关的工具(骨骼、蒙皮、约束器)。

绑定模块有哪些内容?
我们常说的绑定普遍涵盖了三个模块的内容,分别是:骨骼、蒙皮和控制器,下面对这三个分类做出详细描述。
骨骼
在Maya中分为关节(Joints)和骨骼(Skeleton),关节是构建骨骼的基本单位,骨骼会创建在两个具有父子层级的关节中(这里关于骨骼的定义不同软件的定义是不同的,比如Max和Maya就不一样),想要了解更多可看官方文档对骨骼的定义:Maya骨骼定义。
蒙皮
将骨骼和模型关联起来的过程,在Maya中蒙皮可分为三种不同的类型 - 平滑蒙皮(smooth skinning), 刚体蒙皮(rigid skinning)和 间接蒙皮(indirect skinning)。关于具体的蒙皮定义可以浏览官方文档:Maya蒙皮定义。
控制器
控制器可分为两大类:对模型的控制器和对骨骼的控制器。本质上都是基于一定规则对模型和骨骼进行坐标变换达到目标效果。类似IK就是对骨骼的控制器、晶格变形就是对模型的控制器。
绑定基础概念 - Maya的物体组成、层级属性
非常重要 - Transform 和 Shape 节点
Maya中的场景物体一般会有两个节点组成 - Transform节点和Shape节点,其中Transform节点包含了物体在空间中的位移旋转缩放矩阵信息,Shape节点记录了模型本身的点线面UV顶点色等数据。

Outliner窗口
在Maya中记录场景中存在模型的窗口叫Outliner,在场景中创建的物体都会在其中显示(模型、骨骼、样条线、控制器、材质、组等),其中我们需要关注的选项有两个,一个是是否显示Shape节点,一个是是否只显示DAG物体。只有勾上显示Shape节点你才能看到物体的Transform节点和Shape节点的单独显示。
什么是DAG物体
DAG物体是 directed acyclic graph(有向无环图),简单来说可以理解为由Shape和Transform组成的有实体的物体,勾选 DAG Objects Only 就只会显示有实体的物体,隐藏其他内容(材质球、运算节点、层等)。

通过物体层级创建简单的父子关系
如果不考虑约束器的话,最简单的父子级关系就是在Outliner中将一个物体作为另外一个物体的子级,创建这种父子关系的方法有两种:
- 选择物体A,再选择物体B,按P键,就可以将物体A作为物体B的子级。
- 选择物体A,中键移动到物体B上,也可以将物体A作为物体B的子级。
解除父子关系的方法也非常简单,对应创建分为两种:
- 选择作为子级的物体A,按Shift + P可以将A挪到上一层级,取消作为B的子级。
- 选择物体A,中键挪到上一层级,取消作为B的子级。
通过这样简单的操作,你就得到了Maya中最基本的绑定效果 - 层级父子关系,层级父子关系中最重要的概念就是坐标空间的继承 - 即子级的物体的坐标是基于父级坐标系为原点的坐标系统变化而来,在表现上,子级物体会跟随父级物体的运动而运动(旋转、位移、缩放),而子级运动不会影响到父级的运动。

https://vdn6.vzuu.com/SD/07a902ac-c01e-11ed-b06a-aa73a14c00b2-v1_f4_t2_171ZJLjf.mp4?pkey=AAWc7EPtDoX7NDOPIaj8WAhlmlO2fCZ48kAFKxr9m4-O4uNLRTVOVyzfZg04hI-_6xpsB4ZvTJXAW1NxulF2V8MQ&bu=078babd7&c=avc.1.1&expiration=1743459408&f=mp4&pu=078babd7&v=ks6
绑定基础概念 - Maya的空间坐标
Transform的物体与世界空间

Transform节点对场景中的物体记录了三套位置数据,分别是:世界位置、本地空间Pivot坐标和世界空间Pivot坐标。
- 框1:物体在World空间下基于Pivot点的变换数据,我们记为TransWorld。
- 框2:记录物体Pivot点基于物体空间相对物体原始Pivot点的位移,我们记为PivotPosLocal。
- 框3:记录物体位移后Pivot点在世界空间中的位置,我们记为PivotPosWorld。
对于这三个数据满足一个公式:TransWorld + LocalToWorld(PivotPosLocal) = PivotPosWorld。
对于旋转而言,改变了Pivot的旋转会直接在 TransWorld 中进行数据刷新,不会记录到 PivotPosLocal 和 PivotPosWorld 中。
理解了这里数据的含义后,我们也就顺带理解了有关Pivot相关的操作原理了。
例如 冻结变换 是将当前物体TransWorld坐标清空,并将物体Pivot点挪到World中心,将物体坐标系和世界坐标系对齐,并基于世界空间刷新LocalSpace值。
父级不同,数据不同
当我们将子集物体挪出父级物体层级后,会发现物体在空间中的位置并没有改变,但如果你仔细观察Transform的数值会发现发生了变化。这个主要是因为物体的坐标系发生了改变(物体空间 -> 世界空间),所以记录空间中同一个位置的点的数据也不一样了。
冻结变换
有时候我们在挪动物体的坐标后,需要将位移后的状态保持为物体的默认状态,这时就需要对物体进行坐标冻结操作(Freeze Transform),冻结坐标后所有的坐标数据都会归零,方便再次位移物体后快速回到之前记录的位置,这个操作在绑定中非常常用,尤其是控制器。

修改物体的Pivot点位置
物体旋转缩放和位移的数据都是以Pivot点进行存储的,Pivot点是一个物体上只存在一份的数据,将物体本身抽象成一个点记录在空间中的位置,而Pivot点的位置是可以自行定义的,可以进行以下几种操作修改:
!!技巧(谨慎使用),在修改pivot点后如果出现执行Constrain或者需要读取轴向的操作,发现结果不对的话,说明修改的Pivot结果没有烘焙到模型上,这样执行的所有操作都会基于原始Object轴进行操作。Maya是支持在每次修改Pivot轴后直接烘焙到物体上的,操作就是选择移动、旋转或缩放工具(随便设置一个就好,会同步到另外两个工具),在参数设置面板关闭 Pin Component Pivot,同时打开 Bake Pivot Orientation, 就可以在每次修改Pivot后自动刷新轴的方向(但这会导致Local空间的Pivot数据记录错误

将Pivot点放到物体中心:选择菜单中 Modify - CenterPivot。

将Pivot点放到世界坐标原点:需要先冻结物体坐标再Reset坐标,不然物体会跟着Pivot一起跑到坐标原点。
将Pivot点吸附到物体点上:按住D + V键,中键拖动坐标中心即可吸附到物体点上。

将Pivot点吸附到世界网格上:按住D + X键,中键拖动坐标中心即可吸附到网格上。

将Pivot点和吸附点的平面对齐:按住D + Ctrl键,左键点击需要对齐的点线面即可将坐标进行对齐。

约束控制器(Constrain)
这里主要列举下常用的几种约束的使用方法,没有列举出来的的大家可以自行翻阅相关文档(这里的参数讲解只会收录常用的参数,不会每个参数都讲,如果想要了解的可以看官方帮助文档:Maya约束参考)。
Parent Constrain

Parent Constrain - 父子层级,这个层级和前面讲的 Outliner 中的父子层级不太一样,作为控制器,这个父子层级可以控制更多选项,也更为灵活。
Parent Constrain 的创建方式很简单:选择父级物体 - 选择子级物体 - 点击菜单栏 Constrain\Parent,你会发现在Outliner窗口子级物体下方多出了一个控制器,这个控制器就是父子级的控制器。
父子级控制器的默认表现和 Outliner 中层级父子级差不多,子级可以继承父级的所有空间变换效果,同时子级的变化也不会影响父级。
但作为控制器,父子级可以自定义的内容会更多,点击创建父子级命令右边的正方形按钮即可进入到设定窗口,在这里你可以精细化控制各种约束关系参数。
Point Constrain
可以理解为Parent约束的简化版,只对位移做约束,用法和Parent类似,这里不过多赘述。
Orient Constrain
可以理解为Parent约束的简化版,只对旋转做约束,用法和Parent类似,这里不过多赘述。
Scale Constrain
可以理解为Parent约束的简化版,只对缩放做约束,用法和Parent类似,这里不过多赘述。
Aim Constrain

可以将某个物体基于某个轴向对齐到对应物体。在绑定中非常常用,使用方法也很简单:选择目标物体 - 选择需要做对齐操作的物体 - 执行菜单\Constrain\Aim命令即可,下面我们看看Aim的相关参数。
- Maintain Offset:和Parent控制器一样,如果勾上的话创建父子级会保留两个物体原来的空间关系,不然就会将子物体基于父级坐标空间进行转换(子物体坐标 * 父物体世界到Local坐标矩阵),从而改变位置。
- AimVector:需要朝向目标物体的轴(根据自己的需求,找到物体的哪个轴需要朝向目标物体,需要将轴显示模式切换成Object,按住W左键拖拽就可以切换)。
- UpVector:定义朝上的轴,众所周知你要定义一个新的坐标系至少要确定两个轴才行。
- WorldUpType:可以选择定义向上轴向的方式,一般常用的为使用世界空间的某个轴、或者是使用某个物体的方向作为定义轴的朝向。
- WorldUpVector:定义世界空间朝上的轴。
这里很多朋友会很费解:这些参数好乱啊,我要怎么设置才能达到我想要的效果呢?这里我告诉大家一个设置上的技巧:
- 确定需要朝向目标物体的轴,填写到AimVector中,比如需要将物体的X轴朝向对象就填 (1,0,0)。
- 确定物体朝上的轴和世界朝上的轴分别填入 UpVector 和 WorldUpVector,Maya更新物体的逻辑是将 UpVector 尽可能靠近 WorldUpVector(是不是一下就懂了)。比如这里我想要让物体的Z轴尽可能贴靠世界空间的Y轴,我就需要在 UpVector 中填写(0,0,1),并在 WorldUpVector 中填写 (0,1,0),运行Aim命令后你就能得到以下结果。

Pole Vector
一般用作IK朝向的控制器方向约束,选择IK控制器,选择朝向物体,点击 Constrain - Pole Vector。
骨骼(Skeleton)
什么是关节(Joint)与骨骼(Skeleton)
简单来说:关节是骨骼的基石及其关节点,和前面的介绍一样,Maya的骨骼是基于关节定义的,每两个关节之间形成一节骨骼。骨骼没有节点,它们在您的场景中没有物理或可计算的存在。骨骼只是说明关节之间关系的视觉线索。
Joint 的Transform数据存储模式
Joint 和普通的物体相比,除了记录了自身的 Transform 之外,还保留了控制父级 Transform 偏移的能力,数据记录在OffsetParentMatrix中,在IK控制中,IKEffector会连接到IK控制最后一级骨骼的OffsetParentMatrix,反向控制骨骼父级Transform。
Joint 和 Locator 的区别
一句话概括:Joint不能冻结变换和重置,Locator可以。也就是说,Joint在空间中的位置一定是基于世界坐标原点的世界位置,所以我们才需要使用控制器来间接控制Joint的运动,保证动画师K帧的便捷性。
人体骨点、常见骨骼名称和命名规范
骨骼命名中左右对称的骨骼通过 _R 和 _L 区分,下面是一些常见部位的命名规范。
骨骼摆放注意事项:
- 要做IK的关节不能水平成一条线,必须有弧度,不然w创建IK的时候不好判断朝向,同时模型的腿部也需要有些弧度,保证关节点在模型中而不是边缘。

骨骼层级和模型父子级、父子约束器的区别
一句话解释:骨骼也有父子级关系,但需要通过蒙皮才能控制模型。模型层级父子级和父子约束器都不需要蒙皮,二者区别在前面控制器环节有说明。
创建骨骼
选择菜单中的 Skeleton - Create Joints ,在视图中点击即可创建,按 X 吸附到网格点,按 V 吸附到物体顶点,创建完成后切换工具或按 ESC 退出骨骼创建模式。
如何正确调整骨骼轴向
如果我们想要显示骨骼的轴向,可以选择对应的骨骼,执行菜单栏 Display - Transform Display - Local Rotation Axes 即可。
一般我们设置骨骼轴朝向时,需要将骨骼的X轴朝向下一根子骨骼,Z轴面向骨骼的正前方并垂直于X轴,Y轴面向骨骼的右方并垂直于XZ轴。我们需要用到 Orient Joint 工具来对骨骼的轴向做出修正,下面具体讲下修正步骤。
选择所有需要修正的骨骼(不要只选择父级,展开所有骨骼shift全选),执行菜单面板 Sleleton - Orient Joint(点击后面的小方块,打开参数面板)。
我们先来看看面板中的参数:
Orient Joint to World:打开后关节的轴向会与世界轴向对齐。
Primary Axis:设置朝向下一根骨骼的轴为哪个。
Secondary Axis:设置朝向骨骼链正面的轴为哪个(比如膝盖正前方)。
Secondary Axis World Orientation:设置骨骼轴的正负朝向。
Orient children of selected joints:是否影响当前关节下的子关节(默认我们一般都是选择所有关节执行此操作,所以可以不用勾)。
Reorient the local scale axes:重新确定关节的局部缩放轴方向。
如果执行的时候报错说:
// Warning: Cannot perform joint orientation. Transform joint has non-zero rotations.
可以先将报错的骨骼冻结变换。
蒙皮(Skinning)(TODO)
什么是蒙皮?
蒙皮是一种将可变形模型与骨骼绑定的方法,通过控制蒙皮权重在模型上的分布,可以控制每个关节对模型变形的效果。
三种不同的蒙皮类型
在Maya中蒙皮有三种不同的类型:平滑蒙皮(smooth skinning), 刚体蒙皮(rigid skinning)和 间接蒙皮(indirect skinning)。
平滑蒙皮
平滑蒙皮是指使用多个关节共同影响模型上的同一个顶点,一般在软体角色绑定中使用较多(人、生物)。
刚体蒙皮
刚体蒙皮可以通过骨骼控制一些顶点Set或者CV点、晶格点等,我个人用的不是很多,等后续用到了解下再来补充。
间接蒙皮
比如晶格,就是间接蒙皮,通过少量点控制一堆物体上的点。
蒙皮工具和流程
蒙皮工具一般指菜单栏 - Skin - Bind Skin。选择所有参与蒙皮的骨骼 加选物体,点击BindSkin即可(还没研究很深,后面再来填坑)。
IK - Inverse Kinematics
IK是什么?
IK全称 Inverse Kinematics ,中文名叫反向动力学,是一种常用的多骨骼反向控制器。
我们为什么要使用IK
在绑定人物和角色的时候,我们一般会遇到控制多节骨骼的末端骨骼需求,在实际运用中一般是指控制手、脚等,我们希望在控制手脚运动后手臂和大小腿能跟着一起运动。
那么问题来了,对于骨骼的创建我们一般是使用父子级关系,而在前面的介绍中、父子级关系只允许父级影响子级的变换,而无法让子级影响父级的变换。
IK就是为了解决这种问题而诞生的,IK可以很方便的让我们通过子级骨骼控制父级骨骼的运动,我们可以通过一系列的规则控制IK的运动轨迹,达到目标效果。
IK的种类
常见的IK分为两种:基础骨骼IK和SplineIK,基础IK就是我们最常用的IK,SplineIK可以基于样条线控制骨骼的走向,属于样条线驱动骨骼绑定。
基础IK
基础IK提供了两种解算器以供IK运动解算:Single Chain IK solver 和 Rotate Plane IK solver。
两者的区分方式非常简单,SingleChain的IK Handle旋转可以控制IK的朝向,RotatePlane的IK Handle旋转无法控制IK朝向,需要使用Pole Constrain约束IK朝向。
简单来说:不需要PoleVectorConstrain的IK就选择SingleChain,需要PoleVectorConstrain的IK就选择RotatePlane。
IK在Maya中参与实现的相关组件(IKEffector和IkHandle)
IK在maya中主要通过 IKHandle 和 IKEffector 两个组件共同作用而来,IKHandle内部有IKSolver,可以通过给定的起始骨骼 + 最终Effector计算出所有起始骨骼下的子骨骼变换矩阵。
他们之间的层级关系如下所示(Joint1是起始父级骨骼,Joint4是应用IK的最后一级骨骼)。
需要注意的是,IKEffecter是和最后一级骨骼平级,他会直接拿取最后一级骨骼的Transform和OffsetParentMatrix,OffsetParentMatrix 大致的作用就是控制当前骨骼的上一层级骨骼的位移旋转和缩放(前面有讲到)。
IK的创建方式 - 基础IK
选择菜单栏 - Skeleton - Create IK Handle,然后点击需要参与IK计算的父级 - 子级节点,Maya就会自动创建IK控制器。或者按住Ctrl,点击Outliner中的两根骨骼即可创建IK。
SplineIK
创建一根骨骼链。
应用SplineIK(如下图所示)。
这里如果不想自己创建驱动SplineIK的Spline组件可以直接选择SplineIK中的AutoCreate相关参数,省时省力。
常见问题
问:创建IK的时候好像没办法选择骨骼?
答:这是Maya的Bug,可以尝试 选择父级节点 - 点击IK工具 - Ctrl + Z撤回一步 然后就可以选择了(或者使用Ctrl+左键点击Outliner的节点即可)。