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

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

发布时间:2019-09-02 13:17:54

Maya脚本的重要性不言而喻,可以说它是Maya的核心和灵魂。而MEL作为Maya的核心脚本语言,对于每一个学习Maya的小伙伴们来说,都是必须要掌握的,今天我们就一起来了解一下MEL这个脚本语言吧!

1.脚本

MEL的全称为Maya Embedded Language ( Maya内置语言),Maya的用户界面是使用MEL创建的,MEL提供了一种非常简单的方式来扩展Maya功能。可使用MEL来自动完成并扩展Maya图形界面的一切功能,可以说Maya的每一步 操作都是在执行MEL并且Maya的任何一个功能和操作都可以添加到我们自己的MEL程序中。在Script Editor (脚本编辑器)中可以看到相对应的代码,如下图所示。通过熟悉MEL,可以加深对Maya的了解和掌握。

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

1.1 MEL脚本语言概述

作为一一个功能强大的三维设计软件,Maya有一个巨大的优越性就是开放的拓展空间。MEL命令对用户是完全开放的,用户可以编写自己的界面而不必使用类似C+ +这种较为底层的外部开发工具。用户可以像搭积木一样随意拼装自己的工具,比如自己开发Maya默认状态下不能提供的功能,或重新组织Maya的功能组合等。

同学们无需学习编程知识即可使用MEL。例如,可在Maya中使用图形界面轻松执行一些操作,然后将Script Editor (脚本编辑器)生成的命令拖动到工具架中以创建一个按钮, 单击这些按钮就可以执行相对应的操作了,从而提高了工作的效率。然而,MEL也会引入新的知识,可用于制作图形界面无法实现的效果并节省时间。

1.2 MEL要点

MEL的用途可分为如下几点。

01 使用MEL可以定制自己的用户界面,建立快捷菜单和编写插件等。

02 使用MEL可以跳过Maya用户界面,快速创建快捷方式并访问高级功能。

03 使用MEL可以自定义Maya界面并根据场景更改默认设置。

04 使用MEL可以创建用于自定义建模、动画、动力学和渲染任务的程序和脚本。

我们可以在下图(左)所示的位置输入脚本命令,如果界面中未显示该输入栏,可以通过在主菜单中执行Display>UI Elements>Command Line (显示>UI元素>命令栏)命令,如下图(右)所示。单击输入栏左侧的MEL或Python按钮可以在二者之间进行切换。

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

1.3 MEL语言、 MEL命令与MEL脚本

MEL语言的语法结构与C语言接近,它的基本结构单位是MEL命令。

Maya中的所有操作都是通过MEL命令实现的,只不过用到的MEL命令通常被隐藏在操作面板之下,用户不能直接看到这些命令。一般来说,Maya操作界面上的命令很少直接调用MEL命令,而是调用MEL脚本。虽然MEL命令是MEL语言的基本单位,但单独使用一条MEL命令的机会很少,这是因为每个MEL命令都能完成多种简单任务,究竟要完成哪项任务取决于该命令的修饰词。

因此,要正确地使用一个MEL命令就需要正确地选择其修饰词,要做到这一点通常需要其他MEL命令的帮助,将一系列MEL命令放在一起,根据当前的情况来完成一项独立的任务,这-组命令就是一个脚本。如果将这一组命令保存为一 一个独立的文件,就成为一个脚本文件。这个脚本文件可以通过一个由开发者指定的单词在Maya的任何位置调用,这个单词也形成一个命令,叫做脚本命令。在-一个脚本中,可以调用其他脚本命令。

1.4 脚本的基本书写规则

MEL脚本必须按照一定的基本格式书写。

01 脚本文件的基本形式。

格式一

global proc命令()

{

命令内容

}

格式二

globalproc命令(变量类型变量名)

{

命令内容

}

格式二中命令可以指定使用某种类型的变量,每次执行命令时都可以使用不同的参数值,提高命令的交互能力,命令中的变量可以有多组。

格式三

global变量类型proc 命令(变量类型变量名)

{

命令内容

}

格式三中命令可以返回指定类型的变量,提高命令的交互能力。

02 脚本文件名的基本形式。

脚本命令必须保存成mel后缀的文件,文件名必须是命令名,即global proc后的命令。在实例中,脚本命令为mysp;文件名也是mysp,如果两者不一致,在Maya中不能正确执行。

03 脚本注释语句。

在脚本中可以加入一些注释, 帮助自己或其他开发人员理解该脚本的工作方式。注释语句有两种书写方式:单行注释和注释段。

单行注释用双斜线“/" 开始,例如:

//这段脚本生成一个新的NURBS球体

//This Part Create a New NURBS Sphere

注释行可以是一一个整行,也可以从一行的中间开始。从双斜线起一直到这一行结束,Maya都会认为是注释,不执行这一部分。

注释段用“/*”开始,用“*/”结束,例如:

/*

这一段全部是注释。

*/

注释段没有行数限制,只要出现“/*”,Maya会认为注释开始,一直到出现“*/”为止,Maya会跳过这对符号中间的所有语句。

04 一般规则。

语句用分号分开。

严格区分大小写。

执行语句中(非注释语句中)严禁出现中文字符、标点。

虽然在显示内容上允许出现中文,如菜单项、按钮显示、选择项显示标签,但在编辑脚本时使用中文是一件很危险的事,设想一个300行的脚本因为一个中文全脚分号而执行失败后的状况,真正的困难不在于找到那个惹事的中文分号而在于不知道错误是由个中文分号引起的。

1.5 数据变量

无论是表达式还是脚本,其中心任务就是处理各种数据,整个处理过程的主体部分由程序代码的基础元素一变 量和操作符构成。通常情况下,运算过程中需要处理的数据及处理后的结果数据都是保存在各种变量中的。

01 变量的类型。

Maya允许用户使用4种类型的数据:浮点数、整数、向量和字符型数据。对应保存这4种类型数据的变量分别用float、int、 vector和string来标明。

02 变量的定义。

在Maya的表达式或脚本中,所有要用到的变量在使用前应首先声明。

例如,下面的8行表达式内容:

float $Iwx = ocean.waveDistX;

float $lwz = ocean.waveDistZ;

float $spx = ocean.speedX;

float $spz = ocean.speedZ;

float $spb = ocean.fraqBas;

float $amp = ocean.amplitude;

float $offset = ocean offset;

vector $p1= oceanParticleShape positionO;

就是对整个表达式中用到的变量进行声明。变量声明的常用格式有以下两种。

格式一:变量类型名变量名[,变量名2] ;

格式二:变量类型名变量名=值;

无论采用哪一种格式, 都必须以变量类型名开始。

所有的变量名必须以美元符“$"开始。变量名中不能包含空格或特殊字符,可以使用下划线、字母和数字,变量名的长度没有限制。另一个限制是变量名不能以数字开头,即变量标志“$”后不能直接跟数字。变量名对字母的大小写很敏感,即$temp与$Temp是两个不同的变量。

请仔细对比下列合法或非法变量名的区别:

int $radical7Mark ;                                 //合法变量名

int$_ pai .cc__ jiatT_ ;                           //合法变量名

vector $ nine ;                                       //非法变量名(变量名中包含空格)

string $howdyYa'l;                                //非法变量名(变量名中包含特殊字符)

float HEYchief ;                                    //非法变量名(没有以$开头)

int $1cell;                                             //非法变量名(变量名以数字开头)

变量声明是一一个完整的命令,要以分号结束。

上面已经介绍了声明变量的两种基本格式,第1种格式只是说明变量类型;第2种格式在说明变量类型的同时还为变量赋值。使用格式一可以同时声明多个同类变量,多个变量要用“,”(逗号)分开。例如:

int $temp, $buffer ;

格式二在“等号”右边可以是一个数据,也可以是一个算式。如果是一个算式,则变量中保存的数据为算式计算的结果,以下是一-些合法的变量声明。

int $temp= 4;

float $buf= 4*3.2;

//$buf的值为12.8

string $word =”Hellow World ";                 //字符串用引号说明

vector $pos= <<1.32,3.2.4.4>>;               //向量用双尖括号说明

字符型的数据要放在双引号中,向量型数据放在双尖括号内,并且3个分量要用逗号隔开。

03 变量的匹配。

变量的4种基本类型中,有3个是数字类型的,向量型明显区别于其他两类,但整数型与浮点数的区别似乎并不明显。因为如果从数学角度讲,4与4.0是一 样的。 实际上整数型变量与浮点型变量在计算机的内部计算中是有严格区别的,这种区别有时会对表达式和脚本的运行结果产生严重影响。

04 变量的表示。

在使用变量的过程中,变量及变量数据的表示也有一定的规则。

确保运算符两边的数据类型一致。

字符型数据放在引号中,如Who are you?、3.14159等, 要注意中英文引号的区别。

数字型数据不能使用引号,否则会被当作字符型数据。例如“3.14” 不是一一个可以参与数学计算的数字,只能被当作字符串来处理,因此“3.14" *2就是一个非法算式,系统会提示"Error:Cannot mix string and numeric data types in arithmetic expressions." ( 错误:数学计算中不能混合使用字符型数据和数字型数据)。

将带小数点的数字赋予一个整数型变量,小数部分会被去除。

向量型数据要用双尖括号引起来,尖括号内的3个数字要用逗号分开,如<<1.1,2.3, 4.0>>。

向量型变量的3个分量可以单独表示,3个分量分别用变量名加“.x”、“y”和“.z”表示。

例如$temp.x表示向量$temp的第1个分量; $temp.y为第2个分量; $temp.z为第3个分量,这3个分量可以作为浮点型变量参与数学计算。如果定义$temp= <<1.2, 2.0, 3.2>>, 则$temp.x的值就是1.2, $temp:y的值是2.0, $temp.z的值为3.2。 虽然向量的分量可以单独参与计算,但却不能单独赋值。例如“$temp.z =3.2”就是一个非法语句。

1.6 运算

表达式的重要功能之一是完成各种运算,Maya中的计算包括数学运算、关系运算和逻辑运

算,接下来分别对这3种基本运算进行介绍。

1.6.1数学运算

数学运算包括两大部分:基本数学运算和函数运算。基本数学运算包括加、减、乘、除、求余计算和向量的叉乘,函数运算是利用内部函数进行的运算。

在Maya中,基本数学运算包括加、减、乘、除、求余计算和向量的叉乘共6种运算。在这6种运算中,前5种运算方式既可以对一元数据进行操作,也可以对向量进行操作,而最后一-个只能用于向量的计算。当然,前几种运算方式对于一元数据(单数)的处理方式与对向量(或三元参数)的处理方式是完全不同的。

01 加法(+)。

加法运算的操作对象可以是一元数值型数据(浮点型变量和整数型变量),也可以是向量或者是字符型变量,但对不同的数据类型操作,其结果是不一样的。为了对比结果,从实例1至实例5使用了相同的变量名,如果在Maya中连续完成这些实例操作,系统会提示变量类型错误,因此在操作中需要更改变量名。

实例1:对浮点型数据操作

float $a1 =3.2;

float $a2 = 2.0;

float $res = $a1 +$a2;

运行结果: / Result: 5.2//

实例2:对整数型数据操作

int$a1 = 3;

int $a2 = 2;

int $res = $a1 +$a2;

运行结果: I/ Result: 5//

实例3:对字符型数据操作

string $a1 = "3";

string $a2 = "2";

string $res = $a1 +$a2;

运行结果: Result: 32 /

string $a1 = "Who ",

string $a2= "are You';

string $res = $a1 +$a2;

运行结果: // Result:Who are you /

字符型变量的加法就是将两个字符串连接起来。

实例4:对向量型数据操作

vector $a1 = <<1.1 , 1.5,3.4>>;

vector $a2= < <2.0, 2.5, 1.3>>;

vector $res= $a1 +$a2;

运行结果: I Result:<<3.1,4 4.7>> 11

对向量进行加法运算,其结果也是一个向量,就是将向量的3个分量分别相加作为结果向量的3个分量。

实例5:向量与浮点型数据混合操作

vector $a13= <<1.1,1.5,3.4> >;

float $a1 = 2.0;

vector $res3 = $a13 +$a1;

运行结果: // Result: <<3.1,3.5,5.4>> // 

向量与浮点型数据做混合加法的结果也是一个向量型数据,其计算方法是将浮点数加到向量的每一个分量上,相当于与一个3个分量都与浮点数相等的向量相加,向量与整数型数据相加的算法与此类似。

02 减法(-)。

减法运算不能用于字符型变量的数据处理,其他计算方式与加法相同。

03 乘法(*)。

乘法运算不能用于字符型变量的数据处理。在大多数情况下,乘法运算与加法运算的方式是一致的,只有一种情况例外,那就是两个向量相乘。向量的乘法运算有两种:点乘和叉乘,当两个向量使用“*”运算符时,实际上表示这两个向量之间进行点乘(也叫“点积”)。向量点乘的运算

规则如下:

<<x1, y1, z1>>*<<x2, y2, z2>>=x1*x2+y1*y2+z1*z2

也就是说, 两个向量点乘的结果不再是一一个向量, 而是一个单数。如果没有特别定义或处理,这个数是一个浮点数。请看下面的一段表达式:

vector $a1 =<<1.1, 1.5,3.4>>;

vector $a2 = <<2.0,2.5, 1.3>>;

print ( $a1* $a2);

运行结果: 8.37.

其计算过程如下:

1.1*2.0 + 1.5*2.5 + 3.4*1.3=2.2 + 3.75 + 4.42= 8.37

04 除法(/)。

除法运算不能用于字符型变量的数据处理,其他计算方式与加法相同。

05 求余(%)。

求余是一个很有趣的数学运算,它是两个数相除的余数,当两个数可以整除时,会返回0。例如当12除以5时,不能被整除,其余数为2, 所以12%5=2。在中学学习整除、余数的概念时,主要是针对整数进行运算的。在Maya中求余计算并不受此限制,也就是说无论除数还是被除数既可以是整数,也可以是浮点数(小数)。

06 叉乘(”)。

也称为“叉积”,是向量独有的运算方式,与一些语言中用“一”符号完成幂运算不同,在Maya中,“一” 用来完成向量的叉乘。两个向量叉乘的结果仍是一个向量。在空间几何中,向量表示一个方向,因此两个向量的叉乘计算是有几何意义的,叉乘的结果向量和参与叉乘的两个向量都垂直,接下来是一个向量叉乘的简单例子。

实例6:向量叉乘

vector $a1 =<<1.1,1.5,3.4>> ;

vector $a2= <<2.0,2.5,1.3>> ;

print ( $a1^ $a2) ;

运行结果: <<-6.55. 5.37,-0.25>>

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

    2101期学员李思庭作品

  • 2104期学员林雪茹作品

    2104期学员林雪茹作品

  • 2107期学员赵凌作品

    2107期学员赵凌作品

  • 2107期学员赵燃作品

    2107期学员赵燃作品

  • 2106期学员徐正浩作品

    2106期学员徐正浩作品

  • 2106期学员弓莉作品

    2106期学员弓莉作品

  • 2105期学员白羽新作品

    2105期学员白羽新作品

  • 2107期学员王佳蕊作品

    2107期学员王佳蕊作品

专业问题咨询

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

确定