MAYA MEL Programming 2

MSN:nsdavid_lj@hotmail.com

Material

MAYA的数据结构与组织方法与MAX感觉差别比较大,在MAX的数据基本都是列表的慨念,结构层次一般都是平行或树行关系,查询起来相对容易些。MAYA里引用了”connection”这样的慨念,把不同类型不同层次的数据节点连在了一起,感觉更像网状结构,这个关系可以用MAYAHyperGraph功能图形化查看详细的节点信息,每个connection都用线与箭头在上面标识了出来:

 

initialShadingGroup是个着色组,箭头表明了里面的关系,其中的lamber1就是材质球,所有的着色对象都统称为shadershader的类型有很多,可以使用listNodeTypes “shader”来查询。

A.查询材质信息

命令:listConnections listNodeTypes

首先我们要先得到上述的initialShadingGroup对象,因此我们可以使用命令`listConnections -source true -type shadingEngine $objectname`,返回结果是个string数组,默认情况下一个对象应该关联一个ShadingGroup(名字不同)。

每个ShadingGroup下面可以关联很多不同类型的的材质信息,查询时需要指定具体的材质类型,因此我们需要遍历每个材质类型,才能获得所有的材质信息,因此我们需要写一段脚本,对每个ShadingGroup及ShadingGroup下相关联的节点进行遍历:

string $tmp_shapes[];

$tmp_shapes = `ls -type mesh`;

$tmp_shapes = `listConnections -source true -type shadingEngine $tmp_shapes[0]`;

string $tmp_shaders2[] = `listNodeTypes "shader"`;

int $i = 0,$j=0;

while ($i < size($tmp_shaders2))

{

string $tmp_var[] = `listConnections -source true -destination false -exactType true -type $tmp_shaders2[$i] $tmp_shapes[0]`;

if ( size($tmp_var) > 0 )

{

print $tmp_shaders2[$i];

print "\n";

}

 

while ($j < size($tmp_var))

{

print $tmp_var[$j];

print "\n";

$j ++;

}

$i ++;

};

 

B.查询lambert材质信息

命令:getAttr

已经取得材质的唯一名称后,就可以直接查询材质的一般属性,例如查询lambert1.ambientColor,并放入float数组:

float $color0 = `getAttr lambert1.ambientColor`;

如果直接在script窗口显示就getAttr –as lambert1.ambientColor,-as表示转换为字符输出。每个属性的名称在材质窗口上都可以看的到,一般来说属性名字的规则是首字母都是小写,第二个单词首字母大写。

 

C.查询file材质信息

命令:listConnections,getAttr

MAYA里,每个FILE类型都是一种材质,如果lambert1包含了diffuse file这样的信息,diffuse file就会作为一个节点连在lambert1下面:

 

查询这个节点信息的方法也是用listConnections命令,参数就是材质名:

listConnections -source true -destination false -type file lambert1

// Result: file1 //

然后根据获得的节点名,使用getAttr命令查询节点的属性信息:

getAttr file1.fileTextureName;

// Result: C:/Documents and Settings/root/My Documents/voyage.JPG //