您好我是一名新的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属性,有人可以在这件事上启发我,还是指出我正确的方向?
一定要赞赏!
戴夫
答案 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一样,它表现得同样快:)