【龙渲经验】pythonInMaya_节点的选择(2).docx_第1页
【龙渲经验】pythonInMaya_节点的选择(2).docx_第2页
【龙渲经验】pythonInMaya_节点的选择(2).docx_第3页
【龙渲经验】pythonInMaya_节点的选择(2).docx_第4页
【龙渲经验】pythonInMaya_节点的选择(2).docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【龙渲经验】pythonInMaya_节点的选择(2)【connectionInfo函数的运用】除了特殊的功能,脚本的最大好处就是同时对大量元素执行作用,降低操作量,提高工作效率,还能向外行人炫耀(这个就免了!)。前面介绍了场景物体变形节点(transform)和形节点(shape)的选择方法,接下来将是对其他节点内容的选择。以paintEffect笔刷特效为例,当从visor中选取笔刷,在场景中绘制线条时,每完成一笔,maya会创建一条用于控制笔刷形态的Nurbs曲线,一个笔触节点(stroke)和一个笔刷节点(brush)。假如我们需要将每个笔刷进行动画设置(共享笔刷节点并不能实现丰富的动画设置),那么对于笔刷节点的操作将是十分繁琐的,因为前面所用的函数并不能选择到所选物体的其他相连节点。 接下来,我以较为复杂的辉光生长特效的制作为例进行说明。【例子:笔刷特效批量动画设置插件】【操作过程】1.创建Nurbs曲线。场景中的这个球体NURBS曲线,是我从一个多边形球体上的边转换而得。 2.将笔刷特效附加到曲线上。保持Nurbs曲线的选择,然后在Visor中选择笔刷预设,执行:PaintEffects-CurveUtilities-Attach Brush to Curves。 3.找出相应的节点类别。使用maya2013新增加的NodeEditor节点编辑器,我们可以很直观的看到每个节点所属的类别。例如glowGreen1名称的节点属于brush类型,time1节点属于time的类型。 制作笔刷生长动画的属性位于stroke节点的EndBounds栏,而brush节点则与PF特效的渲染效果有关,包括笔刷大小,颜色,分支,自身动画的设置。 4.制作内容。通过对stroke节点的MaxClip属性设置动画,控制笔刷的生长;控制brush节点的BrushWidth属性,改变笔刷的大小;使用颜色编辑器改变brush节点的Incandescence1属性的颜色值,并设置动画关键帧。 【脚本的编写】【特殊节点的选择-connectionInfo函数的使用】通过listRelatives函数,我们可以获取并编辑stroke形节点的属性,但是brush节点并不会那么轻易就让我们选择。假如使用ls(type=brush)语句,所获取的是场景中所有的笔刷节点,并不是我们所选择的笔触所连接的笔刷节点。*如果你尝试加入sl=True参数(该参数表示载入所选元素),你会发现无法获取有用的信息。 maya中要获取与所选节点相关的其他节点,所使用的方法是:获取所选节点与相关节点连接的属性,然后通过connectionInfo函数,取得相连的上游节点的属性,最后通过函数去掉属性名称,保留上游节点名称,完成节点选择。就好像一个叫“李大头”名字的人,中国人习惯叫他“大头”,美国人会叫他“李”,日本人会叫他“大头桑”所以,从完整的名称中改变称谓来描述个体并不是那么难理解的事。1.属性查看。在NodeEditor节点编辑器内,将鼠标指针放于属性之间的连线上,查看与stroke节点属性相连的brush节点的属性。*如果是maya2013之前的版本,可以在Hypergraph:Connections窗口中查看。 2.编写语句列出属性。如上图可以知道,stroke节点的brush属性被brush节点的outBrush属性所连接。接下来的思路是:获取stroke形节点,利用它的brush属性“顺藤摸瓜”找到相连的brush节点名称。*节点的名称是随机可变的,只有属性是唯一不变,因此通过查找相连的属性来获取节点的名称,是最常用的获取特殊节点名称的有用方式。通过print函数来打印出结果,检查语句的执行结果:import maya.cmds as pysel=py.listRelatives()for sel in sel:print py.connectionInfo(sel+.brush,sfd=True)connectionInfo函数内的sfd参数表示返回属性连接的来源(上游节点的属性),其他参数可以参考maya官方文档的解释。 3.更名。通过以上的语句,我们获得了上游的brush节点的属性。因为我们最终需要的只是brush节点的名称,所以要将“.属性”的字符去掉。在MEL语句中,通常是使用tokenize函数去掉相应字符。如下图所示,通过tokenize将字符“aaa.bbb”进行切分(切分规则是去掉“.bbb”),结果得到“aaa”并保存于$buffer变量中。 不过,python有强大的切片功能进行列表的管理,因此在更名这个步骤,不需要使用maya的函数(tokenize函数仅限于MEL中使用,如果python中要调用,需要使用eval转换函数)。原理也很简单,我们只要减少列表中字符的个数排列即可:使用总数减去右边属性的字符数,就得到了左边节点的名称。至于字符数的计算,用户可自己数数后填入对应数字,也可以使用len函数来自动计算。这里我就使用len函数来完成(好处是自己写一遍输入节点的属性名称,增加一些印象,顺便防止眼花数错)。 python的切片功能之前已经提到过,这里就再次说明一下。语句中:attr0:len(attr)-len(.outBrush)表示的是在attr这个变量中,获取变量第一个字符到“总数减去9(数字9是由len函数计算“.outBrush”的字符个数而得)”个字符之间的字符。【动画关键帧的设置和断开】解决了节点的选择,接下来就是对所需属性的控制。进行常规的软件操作测试,通过脚本编辑器中得到的反馈信息来完成语句编写,这在第一篇中已经说过,这里就不再重复演示。以下是控制笔刷大小和生长关键帧设置的函数语句。def brushSize(arg):sizeInput=float(py.textField(size,q=True,tx=True)sels=py.listRelatives()for sel in sels:attr=py.connectionInfo(sel+.brush,sfd=True)brushName=attr0:len(attr)-len(.outBrush)py.setAttr(brushName+.brushWidth,sizeInput)def grow(arg):minInput=float(py.textFieldGrp(min,q=True,tx=True)maxInput=float(py.textFieldGrp(max,q=True,tx=True)sels=py.listRelatives()for sel in sels:py.setKeyframe(sel,at=mnc,v=minInput)py.setKeyframe(sel,at=mxc,v=maxInput)*语句中预先输入的几个未知变量(sizeInput,minInput,maxInput),是用于存储稍后编写的文本框中的数值。为了还原设置,这里继续加入一个“断开动画关键帧”的函数语句。断开物体属性之间的链接,需要输入两个具体属性的完整名称。此处我继续使用connectionInfo函数获取上游节点属性,是为了预防多个属性连入的情况。例如本例中,如果你对属性设置关键帧,断开连接后再设置关键帧,你会发现maya将不断的生成新的节点,动画节点的名称是在变化的。所以利用唯一的输入属性来寻找输出属性是最安全的方法。def breakGrow(arg):sels=py.listRelatives()for sel in sels:attrConn=py.connectionInfo(sel+.minClip,sfd=True)py.disconnectAttr(attrConn,sel+.minClip)attrConn=py.connectionInfo(sel+.maxClip,sfd=True)py.disconnectAttr(attrConn,sel+.maxClip)出于python允许的规则,以及个人的偷懒,我重复使用了相同名称的变量。毕竟作为临时存储数据的变量而言,我不打算花心思去给它漂亮的命名。这个习惯在下一个步骤中再接再厉。【色彩编辑器的调用】 对笔刷色彩进行控制的语句和上一步骤对笔刷大小的控制是差不多的,只是这里会涉及到色彩编辑器的调用和色彩动画的设置,因此就特别进行说明。colorEditor 是启用maya色彩编辑器的函数,它需要执行两次:第一次用于启动色彩编辑窗口,第二次用于获取设置的颜色结果。def brushColor(arg):py.colorEditor()colour=py.colorEditor(q=True,rgb=True)sels=py.listRelatives()for sel in sels:attr=py.connectionInfo(sel+.brush,sfd=True)brushName=attr0:len(attr)-len(.outBrush)py.setAttr(brushName+.incandescence1,colour0,colour1,colour2,type=double3)需要注意,色彩是一个矢量值,我们需要按顺序赋予RGB的数值。由于色彩信息是按RGB(红绿蓝)的顺序存储在列表中,因此只要在列表名后使用中括号包含元素的索引号即可:,colour0,colour1,colour2。然后是设置关键帧的函数。在对一个矢量属性设置动画关键帧后,maya连入的是三个动画曲线节点,当我们要断开动画时,需要分别对三个动画属性进行,不能直接对属性的总名称进行。打个比方, 你刚建了座房子,觉得不满意要拆掉时,你需要给拆迁方提供一个具体的门牌号,否则一个街区上的房子都要遭殃。def colorAnimate(arg):sels=py.listRelatives()for sel in sels:attr=py.connectionInfo(sel+.brush,sfd=True)brushName=attr0:len(attr)-len(.outBrush)py.setKeyframe(brushName,at=incandescence1)def brushColorAnimate(arg):sels=py.listRelatives()for sel in sels:attr=py.connectionInfo(sel+.brush,sfd=True)brushName=attr0:len(attr)-len(.outBrush)attrConn=py.connectionInfo(brushName+.incandescence1R,sfd=True)py.disconnectAttr(attrConn,brushName+.incandescence1R)attrConn=py.connectionInfo(brushName+.incandescence1G,sfd=True)py.disconnectAttr(attrConn,brushName+.incandescence1G)attrConn=py.connectionInfo(brushName+.incandescence1B,sfd=True)py.disconnectAttr(attrConn,brushName+.incandescence1B)【创建窗体】完成了以上函数的编写,接着就是一一对应的在窗体中建立各种执行按钮和文本输入框。目前编写的功能并不是很丰富,因此我也就没去重新排布界面元素-这和本篇的重点内容也没多大关系。*从textField中获取输入内容,q参数表示查询,tx表示获取字符串,在得到输入内容后,需要使用python函数int或者float将输入内容转为整型或者浮点型,这样才能传递数值到参数中。完整代码如下(复制粘贴到maya脚本编辑器的python栏下直接执行ctrl+回车,或者拖到工具架上快捷执行都可以):import maya.cmds as py#检测窗口if py.window(brushEditor,ex=True):py.deleteUI(brushEditor,wnd=True)#定义笔刷尺寸的方法def brushSize(arg):sizeInput=float(py.textField(size,q=True,tx=True)sels=py.listRelatives()for sel in sels:attr=py.connectionInfo(sel+.brush,sfd=True)brushName=attr0:len(attr)-len(.outBrush)py.setAttr(brushName+.brushWidth,sizeInput)#定义生长范围并设置关键帧def grow(arg):minInput=float(py.textFieldGrp(min,q=True,tx=True)maxInput=float(py.textFieldGrp(max,q=True,tx=True)sels=py.listRelatives()for sel in sels:py.setKeyframe(sel,at=mnc,v=minInput)py.setKeyframe(sel,at=mxc,v=maxInput)#断开生长动画的关键帧def breakGrow(arg):sels=py.listRelatives()for sel in sels:attrConn=py.connectionInfo(sel+.minClip,sfd=True)py.disconnectAttr(attrConn,sel+.minClip)attrConn=py.connectionInfo(sel+.maxClip,sfd=True)py.disconnectAttr(attrConn,sel+.maxClip)#颜色选取def brushColor(arg):py.colorEditor()colour=py.colorEditor(q=True,rgb=True)sels=py.listRelatives()for sel in sels:attr=py.connectionInfo(sel+.brush,sfd=True)brushName=attr0:len(attr)-len(.outBrush)py.setAttr(brushName+.incandescence1,colour0,colour1,colour2,type=double3)#对颜色设置关键帧def colorAnimate(arg):sels=py.listRelatives()for sel in sels:attr=py.connectionInfo(sel+.brush,sfd=True)brushName=attr0:len(attr)-len(.outBrush)py.setKeyframe(brushName,at=incandescence1)#断开颜色的动画关键帧def brushColorAnimate(arg):sels=py.listRelatives()for sel in sels:attr=py.connectionInfo(sel+.brush,sfd=True)brushName=attr0:len(attr)-len(.outBrush)attrConn=py.connectionInfo(brushName+.incandescence1R,sfd=True)py.disconnectAttr(attrConn,brushName+.incandescence1R)attrConn=py.connectionInfo(brushName+.incandescence1G,sfd=True)py.disconnectAttr(attrConn,brushName+.incandescence1G)attrConn=py.connectionInfo(brushName+.incandescence1B,sfd=True)py.disconnectAttr(attrConn,brushName+.incandescence1B)#窗口相关函数py.window(brushEditor,t=笔刷生长动画制作工具)py.columnLayout(adj=True)py.button(en=False,l=the use of connectionInfo,bgc=(0.8,0.6,0.8)py.text(l=请输入笔刷的大小,fn=fixedWidthFont)py.textField(size,tx=1)py.button(l=改变笔刷粗

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论