Maya M.E.L:是否可以存储一个类型的关节阵列?

时间:2013-09-24 18:01:21

标签: arrays maya mel

您好我是一名新的MEL用户,一直在玩,四处搜索,但无法解决这个问题:

我试图将所有关节变换旋转值移动到关节方位值,以便我可以清理变换的属性而不会失去关节方向,我的mel尝试就是这样:


string $joints[]=`ls -type "joint"`;

//print($joints);

int $jnt_count = size($joints);

for ($i = 0; $i <= $jnt_count; $i++)

{

    int $attr1 = `getAttr $joints[i].rotateX`;
    int $attr2 = `getAttr $joints[i].rotateY`;
    int $attr3 = `getAttr $joints[i].rotateZ`;

    setAttr $joints[i].jointOrientX $attr1;
    setAttr $joints[i].jointOrientY $attr2;
    setAttr $joints[i].jointOrientZ $attr3;
}

我希望使用所有关节(名称)的数组,我可以通过逐个调用它们来改变它们的属性,但似乎我不能这样做

然而!当我做一个objectType $ joints [1]来测试时,它仍然返回一个类型“joints”,所以我不明白为什么数组的值是类型关节,但是我无法访问关节的joint.XXX属性,有人可以在这件事上启发我,还是指出我正确的方向?

一定要赞赏!

戴夫

2 个答案:

答案 0 :(得分:2)

在mel中你只能得到字符串,浮点数或整数 - 它们是场景中对象的名称,而不是对象本身的包装或句柄。

在您的具体示例中,您需要这样:

string $joints[]=`ls -type "joint"`;

int $jnt_count = size($joints);

for ($i = 0; $i <= $jnt_count; $i++)

{

     float $attr1 = `getAttr ($joints[$i] + ".rotateX")`;
     // etc. See how this is done by adding the strings to 
     // create the string "youJointHere.rotateX", periods and all...
     // the parens make sure string is composed before the command is called

     setAttr ($joints[$i] + ".jointOrientX") $attr1;
     // etc.  Same trick
}

如果你是新手,你可以拯救自己一个受伤的世界,直接跳到maya Python - 它比mel更强大。可选的Pymel使其变得更加容易 - 您发布的原始代码或多或少是Pymel允许您执行的操作。

编辑:忘记了第一个版本中的$ variable标识符和parens。

答案 1 :(得分:0)

正如东正教指出的那样,Pymel让这更容易!并且更贴近你的帖子。

joints = pm.ls(sl=1, type='joints')
jountCount = len(joints)
for i in range(jointCount):
    rot = joints[i].r.get()
    joints[i].jointOrient.set([rot[0], rot[1], rot[2]])

在我看来,Pymel更优越,因为它更容易阅读,更容易编写并从api派生出来,就像mel一样,它表现得同样快:)