Как повернуть контроллеры во всех выбранных клавишах на 90 градусов по оси Y в мире при повороте [5,6,7]?

У меня есть анимация, которая работает от 1 до 50 клавиш. после 50-го ключа я хочу, чтобы ключи поворачивались на 180 градусов

Я могу использовать приведенную ниже команду, чтобы повернуть 1 контроллер в 1 выбранном ключе.

//mel
rotate -y 50 -ws -p 5 6 7;

но это очень много времени, как я могу сделать это для всех выбранных контроллеров и клавиш?

так что это прямой способ выполнить команду mel на клавишах. и как продолжить делать что-то подобное?


person Gkills    schedule 26.02.2016    source источник
comment
Здравствуйте, не могли бы вы рассказать нам, что вы уже пробовали? Вы здесь не новичок, возможно, вы знаете, что SO - это не фабрика кода. Дайте нам немного ваших исследований, даже если они неубедительны.   -  person DrHaze    schedule 26.02.2016
comment
Я новичок в Maya и mel, чтобы выполнить команду, я пробовал различные способы выбора объектов и ключей, но, похоже, это не сработало, я все равно искал в Интернете, не мог найти, я могу выбрать все объекты с помощью mel и повернуть, но это не повернется их на клавиши, я хотел знать, есть ли какой-либо простой процесс выбора, с помощью которого я могу выполнить команду поворота для всех выбранных клавиш. мне нужно только указать в правильном направлении, я могу сам разработать код   -  person Gkills    schedule 26.02.2016
comment
Я бы посоветовал вам переключиться на Python, прежде чем вы слишком углубитесь в это - фактический код не будет слишком сложным, но версии Mel всегда будут более многословными и сложными в обслуживании, чем эквиваленты Python.   -  person theodox    schedule 26.02.2016


Ответы (2)


Я делаю это на питоне, так как это гораздо проще решить на питоне, чем на меле. Это довольно голые кости, но это должно быть хорошей отправной точкой:

import maya.cmds as cmds        # cmds is the python version of mel's api
obj = 'rig:rig:Root'            # your obj..  in real code you'd make a 
                                # function and ask for an object name
attributes = 'rx', 'ry', 'rz'   # need to ask where the keys for on each channel
rotation_keys = set()  # this avoids duplications of key times

# collect a list of all the frames which have any rotation key
for attrib in attributes:      
    for key in cmds.keyframe(obj, attribute = 'rx',  q=True, tc=True):
        rotation_keys.add(key)

# sort them by time, you now have a list of every rotate key time        
keyframe_list = sorted(rotation_keys)

for key in keyframe_list:
    if key > 50:
        # scrub to the right time
        cmds.currentTime(key)

        # apply the rotation relatively
        cmds.xform(obj, rotation = [0,180,0], ws =True, relative = True)

        # get the channel values and make sure they are all keyed
        for attrib in attributes:
            new_value = cmds.getAttr(obj + "." + attrib)
            cmds.setKeyframe(obj, attribute = attrib, time = key, value = new_value)
person theodox    schedule 26.02.2016

Простое решение — сгруппировать анимированный узел и установить ключ для поворота группы после 50-го кадра.

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

  1. Создайте локатор в начале координат.
  2. Выберите свой узел и Shift выберите локатор.
  3. Выберите Ограничение->Ориентация
  4. Выберите Constrain->Point (не обязательно, но визуально полезно)
  5. Выберите только локатор.
  6. Выберите Edit->Keys->BakeSimulation [] (ключи из окна канала, выборка по 1, отключить неявное управление)
  7. Выделите перевод и поворот каналов в поле канала и нажмите кнопку Bake.

Теперь локатор перемещается и вращается вместе с вашим узлом. Значения ключей могут отличаться, если ваш узел находится в какой-то иерархии, но движения должны совпадать. Теперь вы можете изменить движение и передать его обратно с помощью того же процесса:

  1. Сгруппируйте локатор, установите точку поворота группы и анимируйте группу, пока локатор не приобретет желаемое движение.
  2. Удалите ключи на вашем узле.
  3. Выберите локатор и Shift выберите свой узел.
  4. Выберите Constrain->Orient, затем выберите Constrain->Point.

Теперь ваш узел движется с измененным движением локатора. На этом этапе вы можете изменить анимацию локатора, настроить, добавить больше групповых преобразований и так далее. Ваш узел будет обновлен.

Наконец, выберите свой узел и выберите Keys->BakeSimulation с теми же параметрами, что и выше, и удалите группу локаторов.

person Julian Mann    schedule 29.02.2016