2013-07-15 3 views
0

Мне нужно исправить мой скрипт, просто написал функцию grab_animation, функцию save_animation и, наконец, мою restore_animation.нужно исправить мой скрипт - cmds.setKeyframe error

Вот оно.

def restore_animation(path, animation_dictionary=None): 
    dict_file = open(path, 'rb')   
    dict_anim_pkld = pickle.load(dict_file) 
    dict_file.close() 

    for each_frame in dict_anim_pkld: 
     cmds.currentTime(each_frame) 

     for each_obj in dict_anim_pkld[each_frame]: 
      for each_attr in dict_anim_pkld[each_frame][each_obj]: 
        cmds.setKeyframe('{0}.{1}'.format(each_obj,each_attr)) 
        cmds.setAttr ('{0}.{1}'.format(each_obj,each_attr), dict_anim_pkld[each_frame][each_obj][each_attr]['value']) 

Проблема заключается в том, функция отлично работает, но только восстановить значения анимации, но она не устанавливает ключи для каждого ключевого кадра. Я знаю, что команда, которую я должен реализовать, это cmds.setKeyframe, но после многих тестов она пока не работает. Кто может мне помочь?

ответ

0

Ну, одна проблема может заключаться в том, что вы передаете как объект, так и имя атрибута в cmds.setKeyframe(). Обычно атрибуты объекта возвращают полное имя. т. е. «polyCube1.translateX», поэтому, когда вы трудитесь в cmds.setKeyframe('{0}.{1}'.format(each_obj,each_attr)), это действительно говорит об этом cmds.setKeyframe('polyCube1.polyCube1.translateX'). То же самое для вашего cmds.setAttr().

+0

ммм на самом деле, как я его написал, он отлично работает, но он устанавливает только значения. Я хочу, чтобы для каждого ключевого кадра он устанавливалKeyframe с соответствующим значением – user2375723

+0

Возможно, обращение к клавишам и набор команд могут оказаться полезными. Я просто попытался воссоздать его, и возникла проблема, о которой вы говорили, затем я перевернул их, и все получилось. Я просто проверил его на кубе. Ваш код выглядит довольно прочным, кроме этого, поэтому, если это не работает, это может быть просто проблема ввода данных из вашего файла. –

0

Я думаю, что вы не устанавливаете значение в своем вызове setKeyframe. Причина, по которой работает решение @ argiri, заключается в том, что он устанавливает атрибут, а затем вызывает setKeyframe без аргументов, который указывает текущее значение. Я думаю, что вы хотите:

cmds.setKeyframe('{0}.{1}'.format(each_obj,each_attr), 
    v=dict_anim_pkld[each_frame][each_obj][each_attr]['value'], 
    t=each_frame) 

предполагая dict_anim_pkld [each_frame] [each_obj] [each_attr] [ 'значение'], как вы храните старое значение и each_frame это время значение Maya может распознавать