MAYA MEL Programming

msn: nsdavid_lj@hotmail.com

M A Y A

MEL

Programming

v0.3

 

(关于MAYA和MEL我就不多说了,直接切入正题)

List/Select

 

脚本编程对我来说是个很麻烦的事,我又懒的记很多东西,就把关键的一些命令整理一下记在这里,写的也比较简单,但应该很容易看懂。       `

 

语法就不多说了,和C有点像,变量前缀要加美元符$,一般来说命令的执行结果都返回到指定的字符串数组中,分号表示语句结尾。

Ex string $temp = `ls –s –type mesh`

 

列出所有的图形对象

命令 ls –s

// Result: frontShape pCubeShape1 perspShape sideShape topShape //

 

-s表示列出所有可见的图形对象,因此如果你要查询像maxmesh那样的类型,就需要指定它的类型,如果你不知道它的类型也没有关系,可以使用命令查询出类型。

 

列出所有图形对象与它的类型

命令 ls -st -shapes;

// Result: frontShape camera pCubeShape1 mesh perspShape camera sideShape camera topShape camera //

 

如果MAYA场景里东西很多,这个命令的结果就会返回一堆东西,因此我们还可以通过指定物体的类型来取列表。

ls -s -type mesh;

 

C.选择指定的图形对象

命令 select –r $object[.property]

 

选择对象的范围比较广,select命令可以选择一个polygon,也可以选择polygon下面的一个面,甚至面下的一个点。

 

Ex.选择面

select -r pCubeShape1.vtxFace[0];

Ex.选择点

select -r pCubeShape1.vtxFace[0][0];

 

vtxFacepCubeShape1的属性,不同的类型有不同的属性,这个属性列表在哪查我现在还不知道,在MAYA MEL主站上的索引列表上反正是没有,谁要是找到了麻烦告诉我一下。

 

Polygon/Mesh

列出所有的POLY/TRIANGLE面的顶点索引

命令 polyInfo -fv

首先用select –r命令选择一个mesh object 选定后使用polyInfo命令查询mesh信息。

Ex `polyInfo –fv`,列出所有facevertex index,或者也可以用`polyInfo –fv $object`来查询指定的对象信息。

如果shape对象是一个Polygon,则每个面包含四个索引数,必须把shape对象triangluate后,才可以查询三角面的索引信息。

 

可以把返回信息存在字符串里,例:string $temp0[] = `polyInfo -fv`;

polyInfo的返回数据一般是这样:

FACE      1:      2      3      5      4

即每一个FACE是一个string,可以看出这个string是有一定格式的,每个元素间都有分隔符,因此我们可以从中分析出所有的索引信息,MEL中有个比较方便的函数直接提供了这个方法。

String $temp1;

tokenize($temp0[0],$temp1);

这样$temp1每个string就是一个单独的元素了。

 

PS:很奇怪的是polyInfo这个命令在master站点的命令集合中居然没有任何说明信息。

B. 查询object的顶点位置

命令 pointPosition –l

l表示本地空间 w表示世界空间,一般我们取本地空间信息,世界空间可以根据节点信息中的其它数据再计算出来,这个命令的语法是我见过最简单和直接的。

Float $vertex_temp = `pointPosition –l $objectname.vtx[$index]`;

因此index可以用上述的方法取出来,然后代到这里面就可以了,但是上面查出来的索引都放在string里,没关系,MEL里的类型转换很自由,直接(int)string这样转就可以了,这个命令返回的类型是float数组或vector 

C. 查询object的顶点法线

命令 polyNormalPerVertex –q -xyz

q表示查询,使用的语法与pointPosition是一样的,将顶点的索引参数传给它就可以了,然后使用tokenize分析里面的数据,转成Vector类型。

 

D. 查询objectUV信息 

命令 polyListComponentConversion, polyEditUV

因为UV的描述比较特殊,所以要用两个命令来完成这个过程。polyListComponentConversion命令用于查询指定$object.vtxFace[$vertex]UVMAP描述信息,polyEditUV是根据描述信息查询UV的具体坐标。

ExpolyListComponentConversion -fvf -tuv $object.vtxFace[$vertex][$face];

// Result: pTorus1.map[0] pTorus1.map[20] pTorus1.map[420] pTorus1.map[440] //

这些就是描述信息,pTorus1.map[0]表示一个单位,对应到一个顶点,我们将这个字符串取出来,就可以直接查询它的UV坐标了。

ExpolyEditUV -q pTorus1.map[0];

// Result: 0 1 //

 

$object.vtxFace[$vertex][$j]其中的$vertex是顶点索引的绝对值,$j代表face的索引,这个与程序中完全不同,开始我也理解错了,后来找了很多资料才纠正过来,是个比较奇怪的语法。因此遍历首先要取得每个面和顶点对应的索引信息,然后再使用这个命令来查询。

 

Ex

string $faceToVertex[] = `polyInfo -fv pCylinder1`;

int $size = `size $faceToVertex`,$size2;

int $i = 0,$j = 0,$k = 0;

 

int $vertice_array[];

 

while ($i < $size)

{

       string $oneFaceToVertex[];

       tokenize($faceToVertex[$i],$oneFaceToVertex);

       $j = 0;

       while ($j < 3)

       {

              int $v = (int)$oneFaceToVertex[$j+2];

              $vertice_array[$i*3+$j] = $v;

              $j ++;

       }

       $i ++;

}

 

$i = 0;

int $count = 0;

while ($i < $size)

{

       $k = 0;

       while ($k < 3)

       {

              string $temp_uv_map[] = `polyListComponentConversion -fvf -tuv pCylinder1.vtxFace[$vertice_array[$i*3+$k]][$i]`;

              $size2 = `size $temp_uv_map`;

              $j = 0;

              while ($j < $size2)

              {

                     //print ( $temp_uv_map[$j] + "\n" );

                     $j ++;

              }

              $count += $j;

              $k ++;

       }

       $i ++;

}

print ($count + "\n")

 

E. 查询objectMult-UV信息

命令:polyUVSet

遍历$objectUV集的方法要使用polyUVSet –q -auv命令来查询,它将返回一个UV名称数组,数组的数量就是$object对应UV集的数量。查询UV坐标的方法与上面过程完全相同,如果不使用这个命令,相当于查询默认的UV集,因此我们在遍历时分别设置不同的UV集默认状态就可以查出我们要的信息。

polyUVSet –q –auv $object – 查询UVset列表

polyUVSet –cuv –uvs $uvname $object – 设置$uvname$object的默认uv

 

Ex

polyUVSet -cuv -uvs map1 pCylinder1;

polyEditUV -q pCylinder1.map[10];

 

File/IO

创建与写文件

这个比较简单,就几个命令,fopen,fwrite, fclose

fopen的参数和C的定义几乎是一模一样的,w表示写,句柄类型是int

Exint $fileId = `fopen "myMaterial.ogl" "w"`;

fwrite $field $var,这里的$var参数类型是自动转换的是,如果int就写intstring就写stringvector就写vector,具体写进去是什么效果,fclose后看一下文件内容就知道了。