Введение
Python — это мощный язык программирования, который стал неотъемлемым инструментом в индустрии анимации и визуальных эффектов. Благодаря своей универсальности и простоте использования, он пользуется популярностью для автоматизации повторяющихся задач, создания пользовательских инструментов и оптимизации рабочих процессов в различных 3D-программах, включая Autodesk Maya.
В Autodesk Maya скрипты на языке Python позволяют художникам и техническим директорам автоматизировать задачи, манипулировать данными сцены и создавать пользовательские инструменты для улучшения рабочего процесса.
Что такое команда и как строится логика программы
В программировании, каждая команда или инструкция представляет собой определённое действие, выполняемое программой.
Параметры, указанные в команде, позволяют уточнить или изменить результат выполнения этой команды. Например, при создании окружности в Maya с помощью команды cmds.circle() можно указать параметры, такие как радиус окружности (radius) и имя объекта (name). Изменение значений этих параметров приведет к созданию окружностей различных размеров и ориентации.
circle(radius=1, name="circle_1")
Последовательность команд определяет логику программы и порядок выполнения действий. При написании скрипта или программы важно тщательно продумать последовательность команд, чтобы действия выполнялись в нужном порядке и давали ожидаемый результат.
Создание и перемещение объекта в сцене
Рассмотрим пример, в котором мы создадим кривую в виде окружности, переместим ее на две единицы вверх и изменим радиус.
Перейдите в меню ‘Windows’ > ‘General Editors’ > ‘Script Editor’, чтобы открыть редактор скриптов (Script Editor) в Maya. Именно здесь мы будем писать наш Python-скрипт.
После того как ваш Python-скрипт готов, пришло время его выполнить. Для этого выделите весь текст скрипта в редакторе скриптов (Script Editor) и нажмите кнопку «Run» (Запустить). Рекомендую выделить весь скрипт перед запуском, чтобы избежать его случайного удаления при выполнении.
# через имя "cmds" мы получаем доступ ко всем командам Maya, иначе наш скрипт не будет знать, что делает команда circle. import maya.cmds as cmds
# создаем кривую в виде окружности circle_1 = cmds.circle(radius=1, name="circle_1")[0]
В данном случае мы создаем окружность с радиусом 1 и сохраняем имя созданной окружности в переменную circle_1.
Теперь переменная circle_1 содержит имя созданной окружности и может быть использована для выполнения других операций с этим объектом. Например, мы можем переместить окружность по оси Y или изменить ее радиус
# Перемещение окружности circle_1 на 2 единицы вверх по оси Y cmds.move(0, 2, 0, circle_1, relative=True)
# Изменение радиуса окружности circle_1 на 1.5 cmds.setAttr(circle_1 + ".radius", 1.5)
Создание авто-рига выделенного объекта
Давайте рассмотрим пример создания автоматического рига для выделенного объекта в сцене. Это пример крайне полезного инструмента, который незаменим даже на таких крупных проектах, как «Человек-паук: Через Вселенные». Аниматор никогда не должен анимировать объект напрямую. У объектов должен быть хотя бы минимальный риг, с которым будет работать аниматор (например, если потребуется оживить мандаринку в тарелке и анимировать ее падение).
Рассмотрим данный пример по шагам.
1. С чего начинается любой скрипт для Maya
import maya.cmds as cmds # Импортируем модуль команд Maya для доступа к функциям Maya
Это команда добавляет особый модуль, maya.cmds в наш скрипт, через который мы будем выполнять все команды, связанные с Maya. Если мы этого не сделаем, то Script Editor сможет запускать только стандартные Python команды, никак не связанные с Maya
2. Получаем выбранный объект в сцене и запрашиваем его координаты и вращение
# Получаем выбранный объект на сцене selected_object = cmds.ls(selection=True)[0]
# Получаем мировые координаты перемещения (позиции) выбранного объекта с помощью команды xform obj_translation = cmds.xform(selected_object, query=True, translation=True, worldSpace=True)
# Получаем мировые координаты вращения выбранного объекта с помощью команды xform obj_rotation = cmds.xform(selected_object, query=True, rotation=True, worldSpace=True)
3. Создаем Master и Offset кривые (controls), которые аниматор и будет дергать
# Создаем главный контроллер в виде NURBS-окружности с радиусом 1 и нормалью, направленной вдоль оси Y
# Флаг 'name' определяет имя контроллера, а '[0]' извлекает первый элемент из результата master_control = cmds.circle(radius=1, normal=[0,1,0], name="master_ctrl_" + selected_object)[0]
# Создаем дополнительный контроллер в виде NURBS-окружности с меньшим радиусом 0.8, нормалью, направленной вдоль оси Y
# Контроллер называется "offset_ctrl" и пока не привязан к главному контроллеру offset_control = cmds.circle(radius=0.8, normal=[0,1,0], name="offset_ctrl_" + selected_object)[0]
Обратите внимание что к name мы добавили «selected_object», это значит что оба контроллера (и группа которую мы создадим ниже) будут иметь в конце своего имени имя выделенного объекта. Если мы это не сделаем, то уже на втором риге Maya будет ругаться, что объект с именем «master_ctrl» уже существует.
4. Создаем главную группу для нашего рига. Именно ее мы увидим в Outliner (весь риг будет внутри этой группы)
# Создаем пустую группу с именем "master_grp", которая будет служить верхней группой для рига master_group = cmds.group(empty=True, name="master_grp_" + selected_object)
5. Теперь мы зададим иерархию групп и контроллеров
# Привязываем главный контроллер к группе master_group cmds.parent(master_control, master_group)
# Привязываем дополнительный контроллер к главному контроллеру, создавая иерархическую связь cmds.parent(offset_control, master_control)
6. Перемещаем главный контроллер в то место, где находится наш выделенный объект
# Устанавливаем перемещение (позицию) и вращение главного контроллера в соответствии с выбранным объектом
# Флаг 'worldSpace=True' гарантирует, что значения применяются в координатах мирового пространства cmds.xform(master_control, translation=obj_translation, rotation=obj_rotation, worldSpace=True)
7. Помещаем наш выделенный объект в иерархию рига
# Привязываем выбранный объект к дополнительному контроллеру, чтобы завершить настройку риггинга cmds.parent(selected_object, offset_control)
А что дальше?
В заключении хотелось бы подчеркнуть важность программирования в современной индустрии анимации и визуальных эффектов. Овладение навыками программирования на Python позволяет аниматорам и техническим директорам автоматизировать рабочие процессы, создавать индивидуальные инструменты и расширять свои возможности в области 3D-анимации, риггинга и моделирования.
Если вам интересно углубиться в тему программирования в Maya и повысить свой профессиональный уровень, добро пожаловать на мой курс «Основы программирования в Maya». На курсе мы рассмотрим более сложные аспекты создания ригов, написания сценариев и пользовательских интерфейсов и интеграции пользовательских инструментов в Maya. Знания, полученные на курсе, станут ценным ресурсом в вашем творческом арсенале и помогут вам воплощать самые амбициозные проекты.
Буду рад видеть вас на курсе и помочь вам освоить мир программирования в Maya!