学习mel必看的文章 下载本文

内容发布更新时间 : 2024/12/28 22:28:17星期一 下面是文章的全部内容请认真阅读。

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,\是一个变量,单位“秒”。 2,\是一个变量,单位“贞”。

(*注意*属性的名称一定要写完整,并在写完后加终止符“;”) 例如: = time;

(*注意*属性名称是分大小写的,\是三个完全不同的名称)

(其中“=”相当于赋值操作符,顺序是自右向左先计算等号右侧,再把 结果赋给左侧。) *数学运算符;

“+”(加);“-”(减);“*”(乘);“/”(除);“%”(取余,相当于一个数被另一个数整除后的余数) 二:MAYA中的自定义变量

作用:用来存储表达式中用到的临时结果。 类型:1;浮点型变量:(就是带有小数点的变量) 声明符为“float”; 例如:float $aa = ;

(*注意* a,所有变量名称前必须加“$”。 b,变量的名称必须以英文字母开头。

c,变量名称中不准许出现特殊符号,例如 “!,@,#,%,^,&,*\但可以出现下划线和数字”float $aa_1\。

d, 变量名称严格区分大小写,例如:“$aa,$Aa”是两 个完全不同的变量。) 2;整数型变量; 声明符为“int”; 例如:int $bb = 10;

3;字符串变量; 声明符为“string\;

例如:string $cc = \; 4;矢量变量; 声明符为“vector ”;

例如:vector $dd = <<3.3,4,-5.5>>; 三;MAYA中的语句和运算符 1,条件语句

if (条件)//(“如果”的意思) { 语句1; 语句2; }

例如;if (time < 3)

(*注意*条件语句后不能加“;”) 也可以同“else”(当“否则”讲)配合使用; 例如; if (time < 3) = -6;

else if (time >= 3 && time <= 6) = 0; else = 6;

或者不嵌套写,并列写也可以。 if (time < 3) = -6;

if (time >= 3 && time <= 6) = 0; if (time > 6) = 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 trunc() -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 = ); 例如;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() 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/度 b;“cos ( )”(余弦函数)

例如;cos(1) (表示1弧度的余弦值) 5,转换函数

a;“deg_to_rad”(将角度转为弧度) 例如;deg_to_rad(180)

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>>)

b;\求得两矢量之间的加角,单位永远是弧度,永远取小的角 度,永远取正数)

(以上函数只要知道是干什麽用的即可)

maya的局部变量和全局变量 2007年11月09日 星期五 10:56

一、认识局部变量和全局变量

我们知道,一旦声明了一个变量,就可以在定义这个变量的过程中使用它,或者如果在某个mel文件中的过程之外定义了它,就可以在mel文件中的任何地方使用它。如果在脚本编辑器中定义了一个变量,就可以在脚本编辑器中继续使用它直到退出maya。 举个例子,尝试输入以下的代码: proc demo_aaa(){ int $aaa=10; }

print ($aaa);

将它放入脚本编辑器中执行,发现什么?maya告诉你:// Error: \is an undeclared variable. //;

这是为什么呢?通常在一个过程中定义的变量在该过程外是不可见的。大家可以看到,我们上段代码中定义的$aaa是定义在proc demo_aaa()这个函数的函数体内的,而print则是在它之外的,那么就会出现错误。

这是因为,变量能够被使用的范围被称为它的“作用域”。而不在其作用域中将不被执行。我们再来看一段代码: int $bbb=34; proc print_bbb(){ print($bbb); }

print print_bbb();

我们还会得到同样的错误:// Error: \;

归咎其原因,就是因为这些函数只是“局部变量”,它们只能在声明它们的过程或者脚本中使用,也就是只能在自己的“作用域”中起作用。

我们假设一下,如果你从互联网的某个地方下载了一个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;