0

嗨,我是一个新的 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" ,所以我不明白为什么数组的值是类型关节,但我无法访问关节的关节.XXX 属性,有人可以在这件事上启发我或指出我正确的方向吗?

必须赞赏!

戴夫

4

2 回答 2

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 让您做的。

编辑:在第一个版本中忘记了 $ 变量标识符和括号。

于 2013-09-24T20:48:03.753 回答
0

正如 theodox 指出的那样,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 更优越,因为它更容易阅读、更容易编写并且从 mel 派生而来,它的执行速度一样快:)

于 2013-09-27T00:07:46.783 回答