当前位置:首页 >教程首页 > Maya >Maya中MEL脚本和表达式的应用解析(二)

Maya中MEL脚本和表达式的应用解析(二)

发布时间:2019-09-02 13:39:32

1.6.2 关系运算

所谓的关系运算,是指对两个操作数的值进行比较,得出它们的关系是否与关系运算符表示的关系一致,比较的双方可以是变量值或属性值。

下图所示为Maya认可的关系运算符。

Maya中MEL脚本和表达式的应用解析(二)

关系运算的结果经常会用作一段程序是 否执行的条件。

1.6.3 逻辑运算

上文中提到的关系运算实际上是一 些简单的判断,这些判断都是单个条件,这是比较简单的一种用法。很多时候可能需要同时满足多个条件,或是满足多个条件中的一个就可以了,这时就需要用到逻辑运算。下图所示为常用的逻辑运算符。

Maya中MEL脚本和表达式的应用解析(二)

逻辑运算主要有两个:“与” 运算和“或”运算。

“与”运算

“与”运算表示同时满足两个条件,即A符合条件1和条件2。

“或”运算

“或”运算表示只需要满足给出的两个条件中的一-个就可以,即A符合条件1或条件2。

例如:

if (time> 5) && (time< 10))

Ball.scaleZ = time;

表示当时间在第5~ 10秒之间时,Ball的scaleZ (缩放Z)属性等于时间。使用的逻辑运算为“与”运算,即时间必须同时满足大于5小于10的条件,Ball的scaleZ (缩放Z)属性才等于时间,当时间小于5秒或者超过10秒后,Ball的scaleZ (缩放Z)属性不再与时间保持致。

试想一下:如果将此条件语句中的“与”运算(&&)换成“或”运算(),会发生什么情况?因为任何时候时间都一定会符合“大于5”或者“小于10”两个条件中的一个,所以Ball的scaleZ属性总是等于时间。

虽然在条件语句中逻辑运算符连接的是两个或两个以上的关系运算,但还是要一起放在if后的小括号中,以表明一起构成一一个判断条件。

1.7 条件语句

在任何一种编程语言中,都有根据逻辑判断的结果选择不同的程序运行过程的结构,这种结构叫做条件语句,也叫条件分支语句、判断语句或选择语句。条件语句的执行过程为先对某一条件进行判断,例如两个数是否相等,某数是否大于另一一个数或小于另一个数,根据判断结果正确与否执行不同的程序段,即当判断结果为“真”时执行一段程序,当判断结果为“假”时执行另一段程序。条件语句的流程如下图所示。

Maya中MEL脚本和表达式的应用解析(二)

条件语句包括: if和switch两种语句。

if语句

常用的if语句有以下3种形式。

●形式1:

if(条件)进程1

如下图所示。

Maya中MEL脚本和表达式的应用解析(二)

●形式2:

if(条件)进程1

else进程2;

如下图所示。

Maya中MEL脚本和表达式的应用解析(二)

形式3:

if(条件1)进程1

else if (条件2)进程2;

else if (条件3)进程3;

……

else进程n;

如下图所示。

Maya中MEL脚本和表达式的应用解析(二)

形式1主要用于表达式运行过程中可能出现的某一特殊情况, 需要进行特殊处理。例如用表达式控制小球从高处落下,并在地面上弹跳的运动过程,整个过程中小球都受到重力的影响,所以重力对小球速度变化的影响是始终存在并且恒定的,即“当前帧小球速度=上一帧小球速度-9.8x单帧时间”始终成立,当小球与地面碰撞时小球会受弹力作用,速度发生反转,也就是说只有这一个时间点小球的速度要进行反向处理,即“小球的速度= -小球速度”(注意,这里的“=”不是数学中的“等于”,而是计算机语言中的赋值)。

将它们一并写成类似计算机语言的形式如下。

if (小球中心距地面小于小球半径且小球速度向下)小球的速度= -小球速度;

小球速度=小球速度-9.8/ 帧率;

形式2主要用于两种并行情况,还以从高处下落的小球为例。在释放小球的前一刻为计时零点,这一刻小球同时受手的握力与重力,而且二者平衡,所以这刻可以视为小球不受力, 即速度为0,加速度为0,除此之外的任何时刻,加速度等于重力加速度。小球运动速度的变化符合规律“当前帧小球速度=上一帧小球速度-9.8x单帧时间”, 将它写成类似计算机语言的形式如下。

if ( time为零)小球的速度=0;

else小球速度=小球速度-9.8/帧率;

形式3主要用于有3种或3种以上的并行情况。

1.8 循环语句

在工作中经常会遇到这样一些任务: 总是对同一个物体重复同项操作,或对不同的物体重复同一项操作,这种情况下可以将所有发生的操作罗列出来,也可以使用循环语句来缩短代码。

循环语句的基本功能是根据预先设置的条件反复执行相同的操作,其中被反复执行的操作称为循环体。

1.8.1 循环语句的基本形式

在大多数计算机语言中,循环语句有两种基本形式: while循环和for循环。

while循环又称为当型循环,其基本结构为:当条件为“真"时重复执行循环体中的指令。根据循环体与循环条件的先后关系,while循环又有两种具体形式: while和do-while。

for循环是较为常用的一种循环语句形式,for循环也有 两种具体形式: for和for-in。 本教程主要介绍for循环和for-in循环。

1.8.2 for循环

For循环的格式

For (设定循环初值;循环条件判定;改变循环变量)

循环体;

实例7: For循环计算

for($t= -5;$t <0;$t=$t+ 1)

{

print("t minus"+ (-$t) + " seconds and counting.\n");

}

print("Houston, we have lift-off!\n");

运行结果如下: 

t minus 5 seconds and counting.

t minus 4 seconds and counting.

t minus 3 seconds and counting.

t minus 2 seconds and counting.

t minus 1 seconds and counting.

Houston, we have lift-off!

1.8.3 for -in循环

for-in循环是由for循环派生出来的一种形式,这种形式专门用于阵列(数组)。for-in循环只需要一个元素,在循环过程中它依次指向阵列(数组)中的每个成员,由此确定循环过程。

实例8: For in循环计算

string $car;

string $cars[3] = {'n NSX",”Porsche", 'n Acura];

for ($car in $cars)

print("Ihavea + $car + ".n");

运行结果如下:

I have an NSX.

I have a Porsche.

I have an Acura.

这个例子也可以写成for循环的形式。

int $carIndex;

string $cars[3] = {n NSX", " Porsche', 'n Acura};

for ($carIndex = O; $carindex < size($cars); $carIndex++)

print("I have a' + $cars[$carIndex] + "\n");

1.9 MEL命令

MEL脚本的基础就是MEL命令,接下来介绍MEL命令的一般形式和几个最常用的MEL命令。

1.9.1 MEL命令的一般形式

几乎所有的MEL命令在使用时都会以下面的形式出现。

command [-修饰词[参数] ]物体名;

command:任意条MEL命令。

[-修饰词[参数]]:用来规定命令操作中的.些具体细节,如操作方式,参数项等。

物体名:用来指定命令的操作对象。它可能是场景中的一一个节点名,也可能是一一个节点的属性或者是一个文件名,有一些命令不需要指定操作对象。

除了以上提到的这3部分以外,MEL命令的格式中还有一项重 要内容是必不可少的,即命令结束符“;”分号。所有的命令都必须以分号结束,对于中国用户来说,还必须注意分号不能是全角分号,而必须是单字节的英文分号。

实例9:张开曲面

(1)在命令行中输入并执行下列命令。

sphere -n mySpmod;

场景原点位置新生成一个轴向与世界坐标系x轴平行的NURBS球体,球体半径为1,如下图所示。

Maya中MEL脚本和表达式的应用解析(二)

(2)在命令行中输入并执行下列命令。

sphere -q -ax mySpmod;

执行结果:

//Result: 100//球体轴向。

(3)在命令行中输入并执行下列命令。

sphere -e -esw 300 mySpmod;

执行结果:球体由闭口状态变为张口状态。

1.9.2 MEL命令的修饰词

在上例中-q、-e、-esw和-ax都是sphere命令的修饰词,它还包含-p、-SSw、 -r、-d、-ut、-tol、 -S、-nsp和-ch等修饰词。

修饰词-q表明当前命令为询问操作,-e表 明当前命令为编辑操作,这两个修饰词指定命令的操作方式。其他的修饰词控制命令操作对象NURBS小球的参数,-p:小球的位置,-ax: 轴向,-ssw:包裹范围的起始角,-esw: 包裹范围的终止角,一r:半径,-d:小球的光滑级别,-s: 径向分段数,-nsp: 纬向分段数,-ch: 是否保留历史等。

不同的命令有完全不同的命令参数修饰词。

1.9.3 Is命令

格式

Is <修饰词> <物体名>

返回值

字符串组

命令说明

该命令会列出场景中各种不同的节点(或物体)名,具体由命令所带的修饰词决定。

1.9.4 select命令

格式

select <修饰词> <物体名>

返回值

字符串组

命令说明

该命令用来控制选择操作,即完成诸如有条件地选择、加选、从选择集中去除部分对象等操作,使用此命令会改变选择集中的内容。

命令修饰词

-all:选择所有最高- -级的可删除物体。

-hi/-hierarchy:选择当前所选物体的所有下级物体,包括子级及更深层级的物体。

-add:加选物体。

-r/-replace:替换选择,相当于清空原来选择集中的内容,重新选择指定物体。

-d/-deselect:减选,从当前选择集中去除指定物体。

-c/-clear:清除选择集中的内容。

1.9.5 getAttr命令

格式

getAttr <修饰词>节点名.属性名。

命令说明

该命令用来查询指定节点属性的有关信息。

命令修饰词

k/-keyable:返回指定属性是否可设关键帧。可设关键帧的transform (变换)属性会显示在主窗口右边的Channels Box (通道盒),如果没有显示在通道盒中,则是不可设关键帧的。

-l/-lock:返回指定属性是否被锁定,即不可更改。

-typ/-type:返回指定属性的数据类别。

-s/-size:返回多值属性阵列的属性值个数,非多值属性,结果为1。所谓多值属性是节点上一个属性名对应许多属性值,如粒子物体的position (位置)属性、NURBS物体的cp (CV点)属性。

-t/-time<time>:返回指定时间的属性值。

1.9.6 setAtr命令

格式

setAttr <修饰词>节点名.属性名属性值<值>

返回值

没有返回值。

命令说明

该命令用来改变属性值或属性状态。

命令修饰词

-k/-keyable Boolean:改变节点属性是否可设关键帧的状态,这个操作通常使用主窗口菜单中的Channel Control编辑器来完成。

-1/-lock boolean:改变节点属性的锁定状态,这个操作通常也用[通道控制( Channel Control) ]编辑器来完成。

-typ/-type string: 确认属性的数据类型,如果不使用-type修饰词,则会假定属性数据类型是数字型的。

M27.2 表达式

表达式动画采用一种数学的方式来控制物体属性的变化,这种方式非常适合制作可以用数学公式精确描述的运动方式。

学员作品赏析
  • 2101期学员李思庭作品

    2101期学员李思庭作品

  • 2104期学员林雪茹作品

    2104期学员林雪茹作品

  • 2107期学员赵凌作品

    2107期学员赵凌作品

  • 2107期学员赵燃作品

    2107期学员赵燃作品

  • 2106期学员徐正浩作品

    2106期学员徐正浩作品

  • 2106期学员弓莉作品

    2106期学员弓莉作品

  • 2105期学员白羽新作品

    2105期学员白羽新作品

  • 2107期学员王佳蕊作品

    2107期学员王佳蕊作品

专业问题咨询

你担心的问题,火星帮你解答
×

确定