浅谈三维动画中绑定工具的开发

2022-10-08 01:46刘德新
现代电影技术 2022年8期
关键词:命令控制器界面

刘德新

中影动画产业有限公司,北京 101400

三维软件中的几何体 (Geometry)是依据三维空间中不同位置的点 (Vertex)组成的。三个点形成一个可见面,相对平滑的表面需要的点少,结构复杂的表面需要的点多。这些表面最终通过着色系统生成可视化的图形图像。在现实生活中通常称之为 “三维模型”。动画制作中的资产概念是指包含了模型、材质和绑定三种数据的综合型文件,所谓绑定 (Rig),就是在三维软件中通过对三维模型添加变形器 (Deform)、骨骼 (Skeleton)、动态模拟(Dynamic)(其中的一部分功能),从而影响模型上局部的点或全部的点,使其可以按照绑定师的意图变成新的形态,再通过控制器 (Controller)链接到以上几种不同的影响方式上,最终达到通过控制器可以自由地控制模型形态来完成各种动画动作的一系列操作。只有在绑定工作完成后才被视为 “可用的资产”,才会被批准上传给动画部门使用。Maya的绑定文件是一种对技术和规格要求都很严谨的文件形式,有明确的技术标准来处理以上几种类型组件间的逻辑关系,并且提供保护其绑定组件不被随意篡改的功能。绑定的内容根据制作难度又可细分为场景、道具、角色三种情况,是整个动画工业中规范化和自动化需求最高的工作。以道具绑定为例,由于每个道具模型都需要使用同样的绑定规格,为了减少重复劳动最大幅度的简化道具的绑定工作,是本次笔者着手编写绑定工具箱的初衷。(下文中提到的绑定工作均默认在Maya中进行)

1 根据绑定的工作内容和流程规范收集基本需求

1.1 几何体的命名和绑定文件的层级结构

在一个模型文件中会包含几何体 (Geometry)和用于分类和管理这些几何体的组 (Group)。绑定文件会在此基础上将添加其他用途的内容,为了方便文件管理和规范制作标准,这些 “组件”通常在命名时会使用前缀或者后缀来区分不同物体的类型,并且会被放置在某种固定的层级结构 (Hierarchy)中,这就是所谓的 “绑定的规格”。

1.2 为复杂绑定添加更多的控制器

如果遇上结构复杂或者运动复杂的模型,往往需要添加更多的控制功能。比如汽车的绑定通常会为车身和四轮添加单独的控制器以实现在颠簸时每个部分都可以进行单独的表演。为方向盘添加控制器时需要注意控制器和模型的倾斜角度要保持一致。车门、座椅、挡位、后视镜每个可以动的部分都可能会在考虑的范围内。从更丰富绑定的功能上来说,还可以在车辆向前或向后运动时添加车轮根据移动的距离自行转动的功能,甚至是车辆发生碰撞时车身出现的凹损变形等。

每添加一个控制效果几乎都需要添加相应的控制器,然后与模型匹配中心点和轴向,最后链接属性到模型。控制器一般使用曲线来制作,由于在Maya中提供的曲线类型非常单调,为了动画师在使用绑定文件时更直观,绑定师经常需要花费时间根据模型手动制作形状更加贴切的控制器 (方形、立方型、圆形、球形、箭头指向形等),以及设置控制器的颜色,也经常会发生替换更合适的曲线形状的情况。由于几乎每个绑定文件都会添加很多控制器,因此在控制器方面的需求也是需要进行程序化的重点内容。

图1 汽车模型和控制系统

1.3 整合常用的绑定命令

绑定师在使用Maya时会根据自己的工作需求经常使用到一些在不同模块不同菜单里的命令,按照类型来划分,冻结 (Freeze)、删除历史 (Delete History)、中心点 (Center Pivot)是第一类。常用变形器比如融合变形 (Blend Shape)、晶格 (Lattice)、簇 (Cluster)、曲线变形 (Wire)是第二类。骨骼相关的命令是第三类。如果能把这些命令集成在一个工具面板里,使用起来会方便得多。最后还有一种特殊类型的命令,以拷贝蒙皮权重命令(Copy Skin Weights)为例,在两个蒙皮物体间拷贝权重效果通常都是正常的,但是将一个物体作为基础向多个物体同时拷贝权重时则无法正常工作,这时需要把此类命令用Python改写成循环语句才能够达到预期的结果。

1.4 简化链接方式

Maya中提供的链接方式主要有约束 (Constrain)、属性链接 (Attribute Connection)、驱动关键帧 (Set Driven Key)三种。约束命令在Maya中操作简单,只要选择相应的物体点击命令就可以了。但是属性链接的操作会稍显复杂,需要使用属性链接编辑器 (Connection Editor)或者节点编辑器(Node Editor)来完成操作。对于物体最外层的移动节点 (Transform Node)的链接操作来说还是有值得用Python语句优化的必要,这样可以免去打开属性链接编辑器或节点编辑器的必要。

1.5 最终化绑定文件

绑定文件在功能性上制作完成后,为了保护其不被篡改,可以对文件中的某些指定内容予以锁定或者隐藏。

2 制作类道具绑定工具箱的开发

2.1 Python程序的架构

Maya的内置脚本类型为MEL,此外它也支持C、C++、Python等多种语言类型。

制作类程序的开发主要是依托Maya已有的命令和绑定的制作规范,是功能相对单纯的程序。这种形式的程序将所有的功能 (Function)和界面(UI)编写在一个脚本内,最后通过界面中的按键(Button)调取各自需要的功能 (Function)以达成既定目标。由于几乎不会涉及到其他部门和影响整体流水线,编写和调整十分灵活,缺点是承载的内容有限。

另一种是为了配合生产线,并且会涉及到各个部门间协同工作的结构复杂的程序。这种程序可能是Maya内部的,也可能是与其他软件相链接的。形式上通常会把每个功能写成单独的程序存放在固定的路径中,然后编写一个更大的框架程序来调用这些子程序。界面程序的按键命令会调用路径下单独存放的功能程序。在强调流程的前提下,这种方式更便于程序的管理和维护。

2.2 实现功能 (Function)

与其说在Maya中使用Python,不如说是在Python编译器中使用Maya的命令。在使用Maya的脚本编辑器 (Script Editor)中的Python编辑器开始写作前,需要将Maya的命令导入Python编辑器,以帮助Python理解Maya命令。

通过整理流程规范和收集工作中的需求我们已经明确了此次需要程序化的工作内容,接着我们来逐个分析,找到适用于编写它们的Python命令和语法。

本文 “1.1”创建绑定层级 (Hierarchy)的工作大致可以归纳为以下内容:添加一个立方体形状的曲线 (Curve)作为主控制器,调整曲线匹配模型的范围。添加一些组,修改这些组和曲线的名字。把模型、组、曲线 (此时已变成控制器)按照绑定规范放置到适当的层级位置。最后再添加一些基本功能,比如杯子重心的切换 (从杯底到杯子间),为防止模型被误碰还需要添加控制显示模式切换的属性。

在人工操作的情况下这是一种线性不重复的工作流。每个步骤只操作一次,且步骤非常多。当换作用Python程序的方式来进行描述时是这样的:工作类型一:各种和创建相关的命令,负责创建整个绑定过程中需要的所有必要的组件。如用于基本结构的空组 (Null)、标准比例主控制器线条 (空间比例1∶1∶1的CV曲线)、定位器 (Locator),以及各种运算节点 (Node)。也可以将为物体添加自定义属性 (Add Attribute)看作是一种子级的创建工作。工作类型二:属性的获取 (Get Attribute)和赋予 (Set Attribute),负责获取不同物体中必要属性的数据并将其保存到变量中,在其后的工作中根据需要将这些变量赋给其他物体的属性。如通过提取模型体积范围的数据赋予到标准控制器,使控制曲线得以匹配任何模型的体积范围。工作类型三:负责属性连接 (Connect Attribute),通过控制器将不同物体或者计算节点的可用属性连接起来,最终达到预期的可控效果。最后一种工作类型是调整层级结构的命令 (Parent),用于将各部件按照既定规格放置到标准的绑定架构中。这样便实现了所有的工作目标。经过考虑还特意增加了Deform Reor和JointReor两个按钮,可以把选中的内容快速放置到变形器组或者骨骼组的层级结构中。

图2 右图的绑定文件在层级结构 (Hierarchy)上发生的变化

图3 钢琴按键批量创建的控制器

本文 “1.2”提到的控制器一般使用曲线圆环(NURBSCircle)来制作。钢琴可以作为一个既常见又极端的绑定案例,由于无法预知在动画制作阶段具体会按到哪些琴键,为所有的琴键都添加控制器是权宜之计,是重复劳动的典型案例。此时工作需求进一步提升了,从最开始的为单一物体创建控制器变成为很多物体批量创建控制器 (Controller)。对应的方法是使用Python语言的ls命令生产列表来判断当前选择了的物体,然后通过for循环语句为列表中的物体依次创建曲线圆环,匹配中心点和轴向,修改圆环名称,添加约束到物体。修改控制器颜色 (彩色按钮)或替换控制器曲线形态 (Replace)的情况是一种对已有对象的 “修改”行为。最初的做法只考虑了对当前物体 (Select)进行一对一的修改。为了方便工作也都将程序改写成批量处理的形式。

曲线 (Curve)是通过空间中不同位置的点来形成的,控制器曲线是通过程序自定义了曲线上每个点的位置来实现的。曲线可以单独当作控制器来使用,也可以通过Replace按钮替换到其他的控制器形态。

图4 多种形态的控制器

本文 “1.3”中的Maya常用命令整合仅仅是把需要的命令逐个罗列在程序里即可。为了区分命令种类,特意把它们分成了上下两个部分。本文“1.4”需要实现的是用第一个选择的物体对第二个选择的物体进行移动旋转缩放三种属性的链接(Connect)或者约束 (Constraint),同样使用列表命令来判断选择的物体,然后对列表中的两个物体需要的属性进行链接。此外还使用for循环语句添加了前文提到的批量拷贝权重 (Copy Weight)的功能。

图5 在Outliner中隐藏掉不想被意外改动的内容

本文 “1.5”最终化面板提供两种锁定方式,一种是锁定物体的基础属性,一种是最终化锁定。两种功能针对的内容是不同的,同样也提供对应的解锁功能。需要说明的是为已完成的绑定文件进行最终化的需求并不常见,实现这一功能方式是对绑定架构中已有的且固定的组件名称进行拾取,并将其信息在大纲视图 (Outliner)内进行隐藏操作。使得非绑定人员在打开文件后看不到控制器以外的绑定信息,从而达到保护绑定文件的作用。

2.3 可视化界面

通过以上的介绍可以发现,大部分的程序是以基本的命令和简单的逻辑语句来完成编写的。要注意的是Python语句的特点是每行只能执行一个命令。在Maya中执行Python语句只要是格式正确都可以被执行。但是为了能够把这功能性命令通过可视化的界面来执行,需要把每个完整的命令序列封套进def函数并指认到特定的按钮命令中才能被调用。Maya的Python命令中提供非常丰富的界面编辑类型,通过在Maya帮助文件的命令检索中查询Layout一词,可以得到非常多关于界面布局的命令,笔者使用的第一个UI就是基于Maya提供的帮助文件。但是随着功能的增多,后续的版本改为了混合型的Layout布局。

2.4 逐步完善和最终版本的完成

工具的开发是一个循序渐进的过程,也许最开始只是单纯为了减少某项重复劳动。作为编程的起点,很多Maya用户会通过复制脚本编辑器中已经执行好的MEL命令,就可以有效地减少重复工作了。如果能有目的地对这些程序进行筛选并去掉不需要的部分,工作效率会提高地更多。在Maya中使用Python命令有两个基本前提:一是需要专门学习Python的编译方式,二是学习Maya帮助文件中的Python命令和借鉴其提供的脚本范例。从单行的命令开始逐步掌握循环语句 (for语句)、条件语句 (if语句)、函数 (def)等编写形式。建议把界面看作一个独立的部分去学习掌握。笔者在完成最初几个小功能的代码时完全没有考虑会为其编写界面程序,随后逐渐开始乐此不疲,几乎将以往累计下的所有需求逐个进行了程序化,并最终整合到同一个脚本中。

从图6来看,V01版本中最初的想法只是为了完成需求1.1道具绑定的层级 (Props Puppet Create)和需求1.5绑定文件的最终化 (Props Rigging Finalize)。在V04版本中加入了1.2为物体添加控制器和调整控制器颜色的功能,由于新按钮是接在上个版本的下面,导致这个版本过于浪费界面空间,布局和颜色都是默认参数,不够美观。第V06版本在界面布局做了较大调整,选择了新的Layout布局命令,并重新规划了功能分区。根据工作需求分为层级创建 (Hierarchy)、控制器 (Controller)、属性链接 (Connection)、最终化 (Finalize),可以算得上是最终版的雏形了。在V10版本中添加了控制器形态参考 (ShapeRef)用于创建形态各异的控制器,并将原来的控制器颜色设置按键 (Color)的字母显示去掉,改为了以不同色块形式表现的按钮,使其更加直观便于使用。在最终的版本V13里添加了常用的需求1.3的Maya常用命令集合 (Maya Command),随着经验的累积,能力的提升,还添加了以前并没有考虑过的重新命名工具 (Rename),并按照工作流程和使用习惯确认了最终的布局。

图6 不同时期的版本演变

2.5 经验与收获

和所有学习Python的初学者一样,从在Python编译器中打出“Hello Python”开始,到在Maya中执行第一条Python命令。从390行代码三个功能按键的V01版本,到最终版976行代码五十一个功能按键的V13版本。现在回头想想,最重要的感受还是工作需求是第一学习动力,经验都是在摸索中实践,在实践中摸索,慢慢积累而来的。笔者从2019年1月开始接触各种学习资料,5月尝试写完了第一个功能创建绑定层级 (Hierarchy)的基础部分后,不仅由于工作太忙,自己对Python的掌握程度也不足以支撑写下去,绑定工具开发的事情就戛然而止了。直到10月习得界面的写法,11月每周更新一次,12月更新了一次然后又被有限的知识卡住了。最终在2020年4月更新了6次后完成了功能上的定稿,最后在5月和8月各更新了一次界面。总体上看花在写脚本上的时间只有两个多月,但收获这一成果花费将近一年半的时间。此间,笔者翻阅了大量的Python书籍和网络教程,经常是一手查资料一手看帮助文件,逐字模仿逐句揣摩。面对各式各样的教材,笔者发现基础的教材不足以解决当前遇到的实际问题,高级教材又晦涩难懂,因为自身的能力和经验都不足无法将其转化为实际生产力。最困难的一步是如何将自己丰富的工作经验和有限的编程知识结合起来,最终写出可以解决具体需求的工具来。

3 结束语

正所谓 “不积跬步无以至千里”,如果您也像笔者一样,发现工作中存在大量的工作都有待被提炼、被规范,那么就值得花些时间来学习编程语言。此工具箱早已投入到生产当中,在不同的项目中发挥了积极的作用,可以明显感受到工作效率的极大提升。原本工作中需要几个、几十个的操作步骤,几分钟到几十分钟才能完成的工作,现在只需要在绑定工具箱中点击相应的按钮,很多工作只需要零点几秒就完成了,真正实践了以科学技术为第一生产,解放生产力,提高生产力。动画行业的技术工作在诸多方面都对流程开发或者技术开发有着庞大的需求,希望有更多的同仁能关注中国动画工业的发展,并能有兴趣参与其中,在不同的领域里为业界提供优质的解决方案,共同促进行业的发展。❖

猜你喜欢
命令控制器界面
共沉淀引发的溶解性有机质在水铁矿/水界面的分子分馏特性*
南京溧水电子3款控制器产品
管理Windows10的PowerShell命令行使用记录
从零开始学用智能手机
水泥生料立磨压差变参数二型模糊控制器设计
基于NFV的分布式SDN控制器节能机制
命令操作Windows 10回退的秘密
解析Windows10的内部命令
宝箱4
智能液位控制器在排水系统中的应用