对于学习MAYA MEL必须收藏的一篇文章
(2009-04-16 22:51:26)
标签:
it
我经常需要打开这个文本看,推荐LZ也保存成文本,没事翻翻,碰到不懂的也翻翻,当然你若有一定英语基础及C语言基础那更好了
转帖:
mel语言基础知识
1:学maya并不是一定要让你学mel语言,就像建模,材质,动画,你不会mel语言一样可以把软件发挥的淋漓尽致。只能说会mel语言会给你带来很多便捷。像动力学就会涉及到很多mel语言的表达式等等,不过你放心你学maya没必要担心mel语言,因为他本身并没有那么可怕,作为一个初中级者,mel语言很少用到。所以现在别考虑mel语言的事件,因为mel语言本身就是maya的一部分,就像你学maya就不会问学建模是不是很难,学材质会不会很难等等。
2:于C语言,汇编语言有一点联系,会C语言对你学习mel语言帮助很大,但没有学过C语言或汇编语言的也不会妨碍你去学习mel语言。你说你学的不好,证明你还学过,还有点基础,那学mel问题应该不大了。像我们学maya时根本不知道mel语言是什么,还有mel语言这回事。所以你就放心吧,你学mel语言肯定会比别上手更快。
3:mel语言本身就是maya的一部分,不过在你学maya的模型 材质
动画时都不会设计到mel的知识,不过在你学习动力学时,老师会专门花上一段时间来给你们讲解mel语言是怎么一回事。因为动力学涉及到很多表达式的东西。
mel语言是maya自己内部的一套编程语言,mel是maya的灵魂,是maya执行命令的语言。稍有编程基础的话,可以很容易掌握它。我们可以看到除了maya的插件(maya内部很多组件也都是以插件形式存在的)以外,所有的操作都可以在script
editor窗口中有相应的mel语言与之对应。
*表达式的作用:
1,使属性与时间建立关系,来产生动画效果。
2,建立属性与属性的联系,来达到用一个属性控制另一个属性的目的。
/
一:MAYA中的预定义变量(时间)
1,"time"是一个变量,单位“秒”。
2,"frame"是一个变量,单位“贞”。
(*注意*属性的名称一定要写完整,并在写完后加终止符“;”)
例如:nurbsSphere1.translateX = time;
(*注意*属性名称是分大小写的,"aa Aa AA "是三个完全不同的名称)
(其中“=”相当于赋值操作符,顺序是自右向左先计算等号右侧,再把 结果赋给左侧。)
*数学运算符;
“+”(加);“-”(减);“*”(乘);“/”(除);“%”(取余,相当于一个数被另一个数整除后的余数)
二:MAYA中的自定义变量
作用:用来存储表达式中用到的临时结果。
类型:1;浮点型变量:(就是带有小数点的变量)
声明符为“float”;
例如:float $aa = 3.14159;
(*注意* a,所有变量名称前必须加“$”。
b,变量的名称必须以英文字母开头。
c,变量名称中不准许出现特殊符号,例如
“!,@,#,%,^,&,*"但可以出现下划线和数字”float $aa_1"。
d, 变量名称严格区分大小写,例如:“$aa,$Aa”是两 个完全不同的变量。)
2;整数型变量;
声明符为“int”;
例如:int $bb = 10;
3;字符串变量;
声明符为“string";
例如:string $cc = "maya7.0";
4;矢量变量;
声明符为“vector ”;
例如:vector $dd =
<<3.3,4,-5.5>>;
三;MAYA中的语句和运算符
1,条件语句
if (条件)//(“如果”的意思)
{
语句1;
语句2;
}
例如;if (time < 3)
(*注意*条件语句后不能加“;”)
也可以同“else”(当“否则”讲)配合使用;
例如;
if (time < 3)
ball.tx = -6;
else if (time >= 3
&& time <= 6)
ball.tx = 0;
else
ball.tx = 6;
或者不嵌套写,并列写也可以。
if (time < 3)
ball.tx = -6;
if (time >= 3 &&
time <= 6)
ball.tx = 0;
if (time > 6)
ball.tx = 6;
(*注意*多重并列时条件不能冲突,不可同时满足两个以上的条件 。)
2,关系运算符
“〈”(小于)//“〉”(大于)//“〈=”(小于等于)//“〉=”
(大于等于)//“==”(等于)//“!=”(不等于)
(*注意*如果条件后要用等号,一定要用双等号“==”)
3,逻辑运算符
“&&”(并且)(相乘的关系,必须两个条件同时成立)
“||”(或者)(相加的关系,有一个条件成立即可)
“!”(非)
4,快捷操作符
“+=”“-=”“*=”“/=”“%=”“++”“--”
(以上均是在自身的基础上进行)
*“print”(“打印”把变量的数值显示在屏幕上)*
四;MAYA中的函数
1,算术函数
a;“abs( )”(绝对值函数)
例如;abs(5) 5
abs(-5.5) 5.5
abs(0) 0
b;“ceil( )” (返回比括号中数大的最小整数)
例如;ceil(4.3) 5
ceil(-2.3) -2
c;“floor( )”(返回比括号中数小的最大整数)
例如;floor(4.3) 4
floor(-5.6) -6
d;“trunc( )”(取得括号中数的整数位)
例如;trunc(10.39) 10
trunc(-3.14) -3
e;“min(x,y)”(取得括号中两数比较后较小的数)
例如;float $a = 6.3;
float $b = 5.6;
float $c = 4.3;
float $min = min($a,$b);
float $min = min($min,$c);
f;“max(x,y)”(取得括号中两数比较后较大的数)
例如;max(2.1,3.5) 3.5
g;“sign( )”(返回括号中的符号,正数返“1”,负数返“-1 ”,零则返回“0”)
例如;sign(5) 1
sign(-5) -1
sign(0) 0
h;“clamp(min,max,parameter)”(求范围,当parameter小于min 时则返回min,当大于
max时则返回max,在min和max之间时则反回 其自身)
例如;clamp(0,1,time);(只取time“0-1”的部分)
2,指数函数
a;“exp( )”(求衰减系数“e”的多少次方)(e = 2.718);
例如;exp(time);(基于时间递增)
b;“pow(x,y)”(求x的y次方)
例如;pow(2,3) 8
pow(8,1.0/3) 2
c;“sqrt( )”(专用开平方)
例如;sqrt(4) 2
d;“log(x)”(求x是e的多少次幂)
例如;log(1) 0
log(2.718) 1
e;“log10(x)”(求x是10的多少次幂)
例如;log(100) 2
log(1) 0
log(1000) 3
f;“hypot(x,y) (勾股定理)
例如;hypot(3,4) 5
3,随机函数
a;”noise( )”(噪音)
例如;noise(time)
noise(frame)
b;“dnoise( ) (噪音,对矢量进行操作)
例如;dnoise(<<2,3,4>>)
c;“rand( )”(随机函数的一种,针对浮点类型)
例如;rand(5) 在0到5之间随机
rand(2,4) 在2到4之间随机
d;“seed ( )”(固定随机函数)
例如;seed(1) 1
e;“sphrand ( )”(针对矢量的球型随机)
例如;sphrand(5)
sphrand(<<5,1,5>>)
4,三角函数
a;“sin ( )”(正弦函数)
例如;sin(1) (表示1弧度的正弦值)1弧度=180/3.14度
b;“cos ( )”(余弦函数)
例如;cos(1) (表示1弧度的余弦值)
5,转换函数
a;“deg_to_rad”(将角度转为弧度)
例如;deg_to_rad(180) 3.14
b;“ hsv_to_rgb”(颜色转换模式)
例如;hsv_to_rgb(<<360,1,1>>)
<<1,0,0>>
6,曲线函数
a ;“linstep(min,max,parameter)”(线性递增函数,返回值永 远是从0到1)
例如;linstep(3,6,time)
b;“hermite( )”(自定义曲线函数,且返回结果也为矢量,用 法较为复杂)
7,矢量函数
a;“mag ( )”(求矢量大小,求得的结果是一个浮点数)
例如;
mag(<<3,4,5>>
-
<<1,2,3>>)
3.464102
b;"angle ()" (求得两矢量之间的加角,单位永远是弧度,永远取小的角 度,永远取正数)
(以上函数只要知道是干什麽用的即可)
maya的局部变量和全局变量
2007年11月09日 星期五 10:56
一、认识局部变量和全局变量
我们知道,一旦声明了一个变量,就可以在定义这个变量的过程中使用它,或者如果在某个mel文件中的过程之外定义了它,就可以在mel文件中的任何地方使用它。如果在脚本编辑器中定义了一个变量,就可以在脚本编辑器中继续使用它直到退出maya。
举个例子,尝试输入以下的代码:
proc demo_aaa(){
int $aaa=10;
}
print ($aaa);
将它放入脚本编辑器中执行,发现什么?maya告诉你:// Error: "$aaa" is an undeclared
variable. //;
这是为什么呢?通常在一个过程中定义的变量在该过程外是不可见的。大家可以看到,我们上段代码中定义的$aaa是定义在proc
demo_aaa()这个函数的函数体内的,而print则是在它之外的,那么就会出现错误。
这是因为,变量能够被使用的范围被称为它的“作用域”。而不在其作用域中将不被执行。我们再来看一段代码:
int $bbb=34;
proc print_bbb(){
print($bbb);
}
print print_bbb();
我们还会得到同样的错误:// Error: "$aaa" is an undeclared variable. //;
归咎其原因,就是因为这些函数只是“局部变量”,它们只能在声明它们的过程或者脚本中使用,也就是只能在自己的“作用域”中起作用。
我们假设一下,如果你从互联网的某个地方下载了一个maya的mel语言插件,而它定义的变量是“局部变量”,那么我们又怎么能拿来使用呢,唯一的好处就是让人大可不必担心会和自己所定义的变量冲突,因为它们根本“涉及”不到那里。
那么如果想要将自己的成果与别人一起分享,或者同伴之间要共享一个mel资源又该如何呢?聪明的朋友一定已经可以理解为什么会提出“全局变量”这个概念了吧。它最大的优点就是能“共享”。
那么我想办法把上面的那段错误的代码纠正吧:
global int $bbb=34;
proc print_bbb(){
print ($bbb);
}
print print_bbb();
放入脚本代码中,看到了什么?依然不对!那么这又是为什么呢?正如本例所揭示的那样,声明全局变量一次是不够的,事实上,不得不在每一个使用该变量的脚本或过程中声明它。而所有的声明就数据来说也必须是一致的;就本例来说,因为在过程外定义的变量对过程内的代码是不可见的(这些代码不在过程的作用域中),所以在过程内和过程外都需要定义该变量。那么我们再次来修改一下我们的这个例子:
global int $bbb=34;
proc print_bbb(){
global int $bbb;
print ($bbb);
}
print print_bbb();
这样就maya就不会报错了。哈哈~~~因为它在过程内外都可以找到我们定义的这个$bbb。
这时大家就会问了,为什么maya要如此麻烦的要求在每一个变量的作用域中都要重新声明一次呢?我们先不做解释,看一下下面这个例子:
global int $my_int=25;
proc assign_four(){
$my_int=4;
}
assign_four();
print($my_int);
我们来看看输出结果:25!这很让人惊讶,尽管我们已经在函数体中设置$my_int的值为4,但是输出的结果却是25。这是因为,在assign_four()的函数体中,并没有引入$my_int这个我们起先创建的“全局变量”,而是自己重新创建了一个$my_int的“局部变量”,而当执行完这个函数体的时候,这个$my_int的“局部变量”就消失了,我们赋予的值也是赋给了这个函数体中的“局部变量”$my_int。因此,当在函数体外(即过程外)执行输出命令时,当然显示的是我们以前定义过的“全局变量”$my_int,因为它看不到函数体内的$my_int。这样解释,不知道大家是否就能理解为什么maya要如此麻烦的要求在每一个变量的作用域中都要重新声明一次。
二、使用策略
有了上面的认识以后,我想大家可能会问,我们把所有变量都设成全局变量就可以相互调用,而没有这么多的麻烦了。其实这么说是不正确的:
1、因为忘记了声明的全局变量有时就意味着所更改的是错误的数据,正如例子中所看到的:使用局部变量通常会更安全。
2、可以查看那些使用局部变量,并且总是使用参数将数值调入、调出的过程。并准确的知道他们改变了什么。而这时如果使用的是全局变量,该过程就很可能由
于脚本中引入的错误从而错误地更改了数据,而这种错误通常是很难被发现的。
3、很多mel的脚本和函数会有命名相似的变量,在大多数情况下,这些脚本和函数并不要和其他脚本或函数共享这些信息,而只是他们唯一的属于它们的函数。
所以究竟要怎样使用全局变量和局部变量就要自己多多揣摩,在实践中体会了,我就不罗嗦了。
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。