可以通过各种方式装配角色的手部。本教程将介绍如何装配手部,以便可以分别弯曲各个手指,并为手部创建可信的动画。
手部可以实现许多复杂的运动,在设置需要适应各种运动的手部装备时,一定要加以注意。本教程使用一种脚本,该脚本除提供内置工具外,还提供用于创建自定义属性并为其设置动画的其他选项。
本教程还使用修改器脚本,以便自定义属性可以保存在修改器中,而不必以对象的基础级别保存。这样,可以存储自定义属性的预设值,以便在动画过程中可以容易地随时反复使用手部姿势。
虽然没有脚本的帮助也可以装配手部,但如果使用本教程中的脚本,则可以更快、更容易地获得最终结果。通过使用 MAXScript 工具装配角色,可以提供其他选项,同时生成更适合用户使用的角色,供动画师使用。
安装自定义修改器:
将该修改器添加到控制对象:
打开 \tutorials\character_animation\character_rigging 文件夹中的文件 tut_handrig_start.max。
此文件中包含一个名为 Gonzo 的角色。除手部外,已经对他全身进行了装配。Gonzo 只有两个手指和一个拇指。对此类手部使用的方法可以扩展到用于包含两个以上手指的手部。
对控制对象应用修改器 PEN_Attribute_Holder_2。
为了进行装配,将角色手部的手指称为食指、小指和拇指。除了手指数目较少外,该手部的使用很像人类的手部。为了最充分了解装备的工作原理,可以将旋转限制与您自己的手进行比较,看一下您自己的食指、小指和拇指。
食指有三个关节。基础关节有两个旋转轴,上下和左右。中间关节和末端关节只有一个旋转轴。小指的关节也非常相似,但是其基础关节开始旋转的位置在手部以内较远的位置。
拇指有可能的运动的最复杂组合。其基础关节有三个旋转轴,这样拇指的运动范围比其他手指要大。拇指的另外两个关节均只有一个旋转轴。
若要创建一个可以适应手部大多数运动范围的界面,将需要两个微调器用于食指的旋转,三个微调器用于小指的旋转,一个微调器用于张开食指和小指,三个微调器用于拇指的运动。
编辑脚本:
第一个函数 fn getDefFn 不需要编辑。该函数用于在添加了自定义属性并希望将其更新时,获取该自定义属性。此函数只返回任何选定对象的第一个修改器上包含“Hand Controls”名称的定义。
parameters mainP rollout:mainR ( Index01 type:#float ui:index01 ( ) rollout mainR "Hand Controls" spinner index01 "Index 01:"range:[-30,100,0] fieldWidth:50 ( )
参数部分添加可以在卷展栏上使用的变量。卷展栏部分创建包含参数 Index 01 的卷展栏。若要添加更多的微调器,将编辑脚本的此部分。对于每个微调器,在 parameters mainP rollout:mainR 和 rollout mainR "Hand Controls" 下添加一行。
将 spinner index01 “Index 01:”range:[-30,100,0] fieldWidth:50 一行复制并粘贴到下一行。
删除 --redefine:handDef 一行开头的两个连字符。此操作将删除注释标记,允许对此行求值。在第一次运行该脚本时,应对此行进行注释,每当再次运行该脚本时,应运行此行。
添加其他自定义属性:
对于以下列出的每个自定义属性,将 Index 02 更改为自定义属性的名称。在输入新的变量名时,使用的大小写和空格应与要替换的变量相同。例如,对于列出的第一个变量,用 baby01 替换 index02,用 Baby01 替换 Index02,用 Baby 01 替换 Index 02。
将 spinner index02 “Index 02:”range:[-30,100,0] fieldWidth:50 一行复制并粘贴 7 次。
对于上面列出的每个自定义属性,将 Index 02 更改为自定义属性的名称,空格和大小写应匹配。
parameters mainP rollout:mainR ( Index01 type:#float ui:Index01 Index02 type:#float ui:Index0 Baby01 type:#float ui:Baby01 Baby02 type:#float ui:Baby02 Thumb01 type:#float ui:Thumb01 Thumb02 type:#float ui:Thumb02 ThumbRoll type:#float ui:ThumbRoll Cup type:#float ui:Cup Splay type:#float ui:Splay ) rollout mainR Hand Controls ( spinner index01 “Index 01:”range:[-30,100,0] fieldWidth:50 spinner index02 “Index 02:”range:[-30,100,0] fieldWidth:50 spinner Baby01 “Baby 01:”range:[-30,100,0] fieldWidth:50 spinner Baby02 “Baby 02:”range:[-30,100,0] fieldWidth:50 spinner Thumb01 “Thumb 01:”range:[-30,100,0] fieldWidth:50 spinner Thumb02 “Thumb 02:”range:[-30,100,0] fieldWidth:50 spinner ThumbRoll “ThumbRoll:”range:[-30,100,0] fieldWidth:50 spinner Cup “Cup:”range:[-30,100,0] fieldWidth:50 spinner Splay “Splay:”range:[-30,100,0] fieldWidth:50 )
如果在使脚本生效时遇到困难,可以加载并运行 handDefFinal.ms 脚本。
提示:使用此脚本,所有自定义属性都有相同的值范围 -30 到 100。此范围适合手指弯曲,但是对于 Splay(张开手指)等其他动作则过大。不必花时间计算每个自定义属性的准确范围,将使用表达式限制某些骨骼轴的旋转。例如,在关联属性时,可以将自定义属性乘以 0.5 或 0.4,以减小传递给骨骼旋转轴的值。此方法更加灵活,因为可以很容易地试用不同的表达式为角色的手部获取正确的关联。在此课程后面关联自定义属性时,将看到此方法的工作原理。
在 MAXScript 窗口上,选择“文件”菜单 >“另存为”,将脚本另存为 my_handDefFinal.ms。
可以将此脚本进行更改以供其他项目使用。第一次运行该脚本时,一定要在 redefine:handDef 一行的前面输入两个连字符,注释掉该行。
使用脚本创建自定义属性时,可以使用任意 MAXScript 命令和界面项。这在为角色设置复杂控制时提供了更多灵活性,随后可以使用内置的“参数编辑器”工具来实现。
将骨骼的旋转归零:
列表控制器是对变换进行分层的一种方法。列表控制器将列表中的所有控制器累加在一起,为对象创建最终的变换。
将列表控制器应用于对象时,列表上的第一个控制器存储变换的初始值。然后可以使用随后的控制器与变换值相加。
例如,应用于旋转变换的第一个控制器包含对象的原始旋转值,例如在为确定对象姿势时应用的旋转。第二个控制器从值 [0,0,0] 开始。此控制器将包含任何与原始姿势不同的动画。
将列表控制器应用于骨骼时,第二个控制器提供了一组值,您可以将参数与这组值关联,而不会影响当前的姿势。若要了解关于列表控制器的详细信息,请学习角色装配简介教程中的使用列表控制器一课。
可以使用“运动”面板上的命令手动为每块骨骼添加列表控制器,但是使用脚本执行此任务速度会更快。
for x in selection do (x.rotation.controller = rotation_list())
for x in selection do (x.rotation.controller.available.controller = euler_xyz())
for x in selection do (x.rotation.controller.setActive 2)
如果要检查脚本行如何影响骨骼,选择一块骨骼,然后转到“运动”面板。在“指定控制器”卷展栏中,可以看到“旋转列表”控制器已添加到骨骼,下面包含两个控制器,均为 Euler XYZ 控制器。第二个 Euler XYZ 控制器当前处于激活状态。
关联手指弯曲:
现在将骨骼的旋转值与自定义属性关联。关联会连接场景中的两个参数,以便可以使用一个参数的值控制另一个参数的值。
注意:如果不熟悉该过程或参数关联,请学习角色装配简介教程中的关联自定义属性一课。
当装配角色时,通常需要一段时间确定每个自定义属性最佳的旋转轴。为实现此目的,可以将“参考坐标系”更改为“局部”,然后旋转每块手指骨骼,确定受每个手部姿势影响的轴。
使用 Gonzo 角色后,当围绕 Y 轴旋转时,手指向手掌方向弯曲,围绕 Z 轴旋转时,手指张开。
注意:不需要对 Gonzo 角色执行这些测试;本课程中为您提供了旋转关联。不过,如果愿意,也可以这样做。如果旋转任意骨骼来检查旋转轴,一定要撤消任何创建的旋转,然后再继续此课程,或重新加载 my_handrig_03.max 或 tut_handrig_03.max。
将先关联食指骨骼的旋转。您将使用三个微调器来控制食指:Index 01、Index 02 和 Splay。在每个例子中,可将骨骼的第二个 Euler XYZ 控制器的一个轴与手部控制的一个自定义属性关联。
右键单击该骨骼,然后从四元菜单中选择“关联参数”。从弹出式菜单中选择“变换”>“旋转”>“Euler_XYZ”(列出的第二项)>“Y 轴旋转”。
单击 Gonzo_CNT_Rhand(控制对象),然后选择“修改对象”>“Pen_Attribute_Holder 2”>“Hand Controls”>“Index01”。
在“参数关联”对话框上,将左侧的 Index01 替换为 degtorad(Index01)。
此表达式将 Index01 由度转换为弧度,弧度是对象用于计算旋转的角度单位。关于 degtorad 函数的用法信息,请参见角色装配简介教程中的关联自定义属性一课。
若要测试连接,选择 Gonzo_CNT_Rhand 并转到“修改”面板。更改微调器 Index 01 的值。
现在将关联食指的其他部分和小指骨骼,以进行弯曲运动。对于指导您关联参数的所有步骤,一定要从骨骼 >“变换”>“旋转”>“Euler_XYZ”(列出的第二项)> 指定的旋转值关联到“Gonzo_CNT_Rhand”>“修改对象”>“Pen_Attribute_Holder 2”>“Hand Controls”> 指定的自定义属性。在每个例子中,将 degtorad 函数添加到“参数关联”对话框左侧的表达式,然后单击向左箭头,并单击“连接”。
将 Gonzo_Bone_RIndex04 的 Y 轴旋转关联到 Index02。
现在微调器 Index02 控制食指上最后两个关节的旋转。可以创建两个微调器,用于控制手指的最后两个关节,但是通常没有必要这样做。
对小指骨骼重复上述步骤,将 Gonzo_Bone_RBaby02 的 Y 轴旋转关联到自定义属性 Baby01,将 Gonzo_Bone_RBaby03 和 Gonzo_Bone_RBaby04 的 Y 轴旋转关联到 Baby02。
通过选择 Gonzo_CNT_Rhand 并更改 Index 01、Index 02、Baby 01 和 Baby 02 的微调器值来测试关联。将所有微调器重置为 0,然后再继续操作。
关联手指张开:
将 Gonzo_Bone_RIndex02 的 Z 轴旋转关联到“Splay”参数。将表达式更改为 degToRad(Splay * 0.5)。
此操作将“Splay”参数的旋转值减小一半,然后再传递给小指基础骨骼。使用表达式减小传递给骨骼的值与将范围缩小到 -15 到 50(而不是 -30 到 100)类似。使用表达式减小传递给骨骼的值比明确设置范围要更加灵活,因为如果发现需要手指张开更大的角度,可以很容易地将倍增 0.5 更改为其他值。
将 Gonzo_Bone_RBaby02 的 Z 轴旋转关联到“Splay”参数。将表达式更改为 -degToRad(Splay * 0.5)。
通过选择 Gonzo_CNT_Rhand 并更改“Splay”值来测试关联。“Splay”增大时,食指和小指应向相互远离的方向旋转。
关联小指弯成杯状的动作:
使手弯成杯状以便抓住物体时,拇指向手掌旋转,小指下面的手部骨骼稍微旋转,使手掌形成杯状。在此步骤中,将小指的手部骨骼关联到“Cup”微调器,因此当增大“Cup”参数值,手部的此部分可以完成杯状动作。
关联拇指控制:
手掌中的拇指骨骼运动范围最大,移动的方式也最复杂。此关节几乎可以伸展到腕部,并且可以围绕所有三个旋转轴进行旋转。因此,拇指可以向手掌旋转以便抓住物体,或向外移动,使手可以完全平展开。
为了实现此运动范围,将关联手掌中的拇指骨骼,使其可以围绕所有三个轴进行旋转。其他拇指骨骼只能围绕 Y 轴旋转。
总共将使用三个不同的自定义属性关联拇指:Thumb 01、Thumb 02 和 ThumbRoll。Thumb 01 将保持手部内拇指骨骼的 Y 轴旋转,而 Thumb 02 将保持最后两块骨骼的 Y 轴旋转。ThumbRoll 自定义属性将保持手部内拇指骨骼的 X 轴旋转和 Z 轴旋转。
使用表达式 degtorad(Thumb02) 将 Gonzo_Bone_ RThumb03 的 Y 轴旋转关联到 Thumb02。
使用表达式 degtorad(Thumb02) 将 Gonzo_Bone_ RThumb04 的 Y 轴旋转关联到 Thumb02。
将 Gonzo_Bone_ RThumb01 的 Y 轴旋转关联到 Thumb01。确保将左下角输入区域中的表达式更改为 degToRad(Thumb01),然后再连接关联。
可以保持“参数关联”对话框打开,以关联 Gonzo_Bone_ RThumb01 上的其他轴,因为此时这些轴全部显示在“参数关联”对话框上。
使用表达式 -degToRad(ThumbRoll) 将 Gonzo_Bone_ RThumb01 的 X 轴旋转关联到 ThumbRoll。
使用表达式 degtorad(ThumbRoll) 将 Gonzo_Bone_ RThumb01 的 Z 轴旋转关联到 ThumbRoll。
Gonzo_Bone_ RThumb02 不需要自身进行任何旋转,因此它不会关联到任何自定义属性。只是跟随 Gonzo_Bone_RThumb01 的旋转。
通过选择 Gonzo_CNT_Rhand 并更改“ThumbRoll”值来测试关联。拇指应围绕其 X 轴和 Z 轴旋转。
更改拇指的旋转计算顺序:
如果增大 ThumbRoll 和 Thumb01,您会发现,当这两个值增大到超过 30 或 40 时旋转将开始变得不自然。
对于 Euler XYZ 控制器,先计算围绕 X 轴的旋转。然后再按照顺序加上 Y 轴旋转和 Z 轴旋转。如果先计算 Y 轴旋转,基础拇指关节的旋转效果会更好。这样可以确保基础拇指关节始终以可预料的方式向手掌弯曲。
“ThumbRoll”参数只影响 Z 轴旋转和 X 轴旋转。如果 X 轴旋转(将拇指向下方远离手部的方向摆动)在 Z 轴之前进行计算,此参数的效果会更加自然。
通过在“运动”面板上更改参数,可以更改 Euler XYZ 控制器计算轴旋转的顺序。在本例中,将先计算基础拇指关节的 Y 轴旋转,然后再分别计算 Z 轴和 X 轴。
创建点指姿势:
使用当前的装备可以使手部创建许多姿势,例如点指、抓取和握拳。
不必在每次要为手部设置动画时都为各个自定义属性设置动画,可以为每个常用的手部姿势设置自定义属性。在选择预设姿势时,相应的自定义属性会自动更改。