Майя М.Э.Л.: Можно ли хранить массив типов соединений?

Привет, я новый пользователь 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», поэтому я не понимаю, почему значение массива имеет тип соединения, но я не могу получить доступ к атрибутам соединения. , может кто-нибудь просветить меня по этому вопросу или указать мне правильное направление?

Должен оценить!

Дэйв


person the pillow    schedule 24.09.2013    source источник
comment
Ваше название заставило меня посмеяться :) Мел означает встроенный язык Maya, так что вы фактически пишете встроенный язык Maya Maya :D   -  person Shannon Hochkins    schedule 27.09.2013
comment
Извините :D, я просто подумал, что будет понятнее, если я начну с Maya, на случай, если m.e.l может быть чем-то другим где-то еще!   -  person the pillow    schedule 28.09.2013


Ответы (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. позволяет вам делать.

РЕДАКТИРОВАТЬ: забыли идентификатор переменной $ и скобки в первой версии.

person theodox    schedule 24.09.2013
comment
Привет, спасибо за ваш ответ, когда я попробовал это таким образом, я получил сообщение об ошибке: Ошибка: Строка ..: Недопустимое использование объекта Maya i для всех i, используемых в цикле for, поэтому я подумал, что это из-за та же проблема со строкой и пробовал следующее: int $attr1 = getAttr $joints + "[" + $i + "]" + ".rotateX" и int $attr1 = getAttr $joints + "[" + i + "]" + ".rotateX", но оба они не работают, вы знаете, в чем может быть проблема? Я также постараюсь изучить Python! - person the pillow; 25.09.2013
comment
Python намного сильнее стреляет себе в ногу. Мел хорош из-за возможности эха и ограничений, но это все. Да, вы читали, что правильные ограничения являются БОЛЬШОЙ частью того, почему Мел так хорош. - person joojaa; 25.09.2013

Как указал теодокс, 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, он работает так же быстро :)

person Shannon Hochkins    schedule 27.09.2013
comment
Спасибо за ваш ответ ! (очень поздний ответ здесь) - person the pillow; 15.11.2018