Урок из книги: "Освоение Autodesk Maya 8.5". Встроенный язык Maya (MEL)


Отрывок из книги
Освоение Autodesk Maya 8.5
Джон Кундерт-Гиббс, Майк Ларкинс, Дариус Деракшани, Эрик Кунзендорф
Компьютерное издательство "Диалектика"

Глава 16

Встроенный язык Maya (MEL)

В этой главе...

Основные принципы языка MEL

Что такое язык сценариев?

Редактор сценариев

Что такое атрибут?

Справочная система MEL

Практика: постановка света при помощи MEL

Переменные, циклы и переходы

Отладка сценариев MEL

Комментарии

Создание GUI

Применение процедур и сценариев

Резюме

В этой главе рассматривается встроенный язык сценариев Maya MEL (Maya Embedded Language). Здесь описано, как язык MEL используется в Maya для повышения производительности, автоматизации выполнения часто повторяемых задач. Кроме того, здесь рассматриваются основы программирования MEL, а также указано, как продолжить самостоятельное изучение этого мощнейшего компонента Maya.

Хотя применение MEL требует некоторых навыков программирования, для его применения вовсе не обязательно обладать глубокими познаниями в этой области (по крайней мере не на данном этапе изучения). Тем, никогда не занимался программировали прежде, язык MEL может показаться сначала немного сложным, однако не стоит расстраиваться: эта глава содержит вполне достаточную информацию, чтобы начать использовать язык MEL, а также применять его для управления Maya, практически без единой собственноручно написанной строки кода. Для тех, кто имеет некоторый опыт программирования, синтаксис языка MEL окажется довольно простым, а для тех, кто знаком с языками C или C++, еще и очень знакомым.

Maya 8.5 поддерживает также язык программирования Python; опытным разработчикам сценариев MEL будут интересны разделы, описывающие интеграцию этих языков.

     Основные принципы языка MEL и сценариев

     Редактор сценариев

     Справочная система языка MEL

     Методы программирования языка MEL

     Отладка сценариев MEL

     Создание процедур и сценариев

     Изучение работ других разработчиков

Основные принципы языка MEL

Встроенный язык Maya (MEL — Maya Embedded Language) является основным уровнем взаимодействия пользователя с Maya. При запуске Maya, фактически выполняется несколько сценариев MEL, которые и формируют все окна. На самом деле Maya никакого интерфейса не имеет. Запустить Maya можно даже из командной строки операционной системы, достаточно ввести команду Maya -prompt! Практически все, что делается в Maya, выполняют сценарии MEL.

Но что же это означает для среднего пользователя Maya? Упрощенно, он имеет возможность сделать все, что уже сделали разработчики исходного интерфейса. Пользователь может создавать окна с ползунками, вкладки, текстовые поля и кнопки для них; может создавать атрибуты в панели каналов; может даже добавлять пункты в меню и новые панели. Тот факт, что Maya построена на языке MEL — уже является одним из наиболее существенных преимуществ этой программы.

Поскольку синтаксис языка Maya подобен синтаксису языков программирования C, C++ и C#, это является хорошим подспорьем для тех, кто знаком с этими языками. Авторы рекомендуют ознакомиться с такими первоисточниками, как изданиями, как Beginning Programming (издательство Wrox, 2005 год), С для “чайников”, Второе издание (издательство Wiley, 2004 год) и С# 2005 для “чайников” (издательство Wiley).

Что такое язык сценариев?

MEL — это язык сценариев (script), а полноценный язык программирования (как Java или C++). Программа, написанная на языке программирования, компилируется и становится независимой программой (как базова программа Maya), для выполнения который необходима только операционная система компьютера. Язык сценариев, напротив, существует внутри другой программы, в данном случае Maya. Его код интерпретируется построчно, а не компилируется. Поскольку сценарий интерпретируется “родительской” программой, выполняется он немного медленнее, чем откомпилированная программа, однако и дополнительных затрат они требуют намного меньше, чем откомпилированные программы.

Те, кому нравится программировать, вполне могут создавать дополнения для программы, используя такие языки программирования как C или C++. Maya имеет свой собственный интерфейс прикладных программ (API — Application Programming Interface), имеющий соответственно название Maya API. Язык MEL прекрасно подходит для выполнения почти 95 процентов всех задач, этого вполне хватает большинству, а кроме того делает язык не слишком трудным в изучении. Хотя изучение API выходит за пределы этой книги, вполне можно связаться с компанией Autodesk выяснить подробности применения SDK Maya для разработки дополнений Maya.

Редактор сценариев

Лучше всего изучать язык MEL при помощи редактора сценариев (Script Editor). MEL — довольно обширный язык (более 600 команд и приблизительно 75 функций), однако редактор сценариев способен проконсультировать пользователя о том, как использовать эти команды, а также “копировать и вставлять” в код готовые сценарии, без единой строки собственного кода. Для ввода команд MEL не нужно даже использовать командную строку. Все операции, выполняемые в интерфейсе Maya, написаны в редакторе сценариев как команды MEL. Даже не умея программировать вовсе, здесь можно копированием и вставкой создавать довольно сложные сценарии.

Командная строка (Command line), обсуждавшаяся в главе “Интерфейс Maya”, является только одной строкой ввода редактора сценариев. При вводе команды в командной строке, она отображается в окне истории редактора сценариев, а также в строке вывода (output line), которая расположена справа от командной строки и является, фактически, последней строкой окна истории редактора сценариев.

Редактор сценариев можно открыть двумя способами: можно выбрать пункт меню Window => General Editors => Script Editor (Окно Общие редакторы Редактор сценариев), или щелкните на кнопке Script Editor (Редактор сценариев), расположенной в нижнем правом углу экрана. Открытый редактор сценариев выглядит как на рис.  16.1.

Рис. 16.1. Редактор сценариев

Обратите внимание, редактор имеет две панели. Верхняя панель называется панелью истории (history pane); а нижняя — панелью ввода (input pane). Давайте рассмотрим редактор сценариев в действии. Открыв редактор сценариев, создайте полигональный куб (выберите пункт меню Create => Polygon Primitives => Cube q (Создать => Полигональные примитивы => Куб q)). Теперь посмотрите на панель истории. Последние строки в ней должны выглядеть примерно так:

setToolTo CreatePolyCubeCtx;
polyCube -ch on -o on -cuv 4;
// Result:pCube1 polyCube1//

Представленная в верхней панели команда — это выбранная в меню инструкция Maya создать куб. Команда setToolTo — это новая возможность Maya 8, реализующая интерактивный инструмент создания примитивов (но это только по умолчанию, в группе флажков примитивов он может быть установлен в не интерактивное состояние). Затем команда polyCube создает полигональный куб в том месте на сцене, где пользователь дважды щелкнул. Все символы, которым предшествует знак - минус), т.е. -ch, -o, -cuv и т.д., называются флагами (flag). Они уточняют, как именно команда polyCube должна создать куб. Например, флаг -ch отвечает за историю создания, когда он установлен, запись истории создания разрешена, флаг -cuv указываем Maya как создать точки UV для куба (4 в данном случае означает, что следует создать такие точки UV, текстура которых не будет искажаться при наложении на куб). И наконец, точка с запятой в конце строки уведомляет Maya о том, что команда закончена. (Почти все строки кода MEL должны завершаться точкой с запятой.) Здесь есть также строка результата (result line), начинающаяся символами //. Она обеспечивает обратную связь, свидетельствуя об успехе выполнения команды (более подробная информация об этом приведена далее).

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

Измените значения некоторых из атрибутов куба (масштаб, поворот, положение и т.д.) и посмотрите, как это отобразится в панели истории редактора сценариев. Как можно заметить, каждое действие, выполненное в интерфейсе базовой программы Maya, привела к выполнению некоторых команд MEL. Чтобы команды было проще читать, верхнюю панель можно очистить в любой момент. Для этого выберите строке меню редактора сценариев выберите пункт меню Edit => Clear History (Правка Очистить историю). Это очистит верхнюю панель от всех команд.

Теперь пробуйте открыть одно из окон Maya, например, окно гиперграфа (пункт меню Window => Hypergraph: Hierarchy (Окно => Гиперграф: иерархия). Что появилось в панели истории? Вероятно ничто вообще. Чтобы переключение между окнами не загромождало панель истории, разработчики Maya создали фильтр, который блокирует отображение в панели истории большинство команд MEL, которые обычные пользователи не должны видеть. Но иногда полезно видеть все, что Maya делает в действительности. Закройте окно гиперграфа, выберите в редакторе сценариев пункт меню History => Echo All Commands (История Отображать все команды) и снова откройте окно гиперграфа. Теперь в панели истории должно появиться нечто вроде следующего:

editMenuUpdate MayaWindow|mainEditMenu;
HypergraphHierarchyWindow;
hyperGraphWindow "" "DAG";
addHyperGraphPanel hyperGraphPanel1;
HyperGraphEdMenu hyperGraphPanel1HyperGraphEd;
createModelPanelMenu modelPanel1;
createModelPanelMenu modelPanel2;
createModelPanelMenu modelPanel3;
createModelPanelMenu modelPanel4;
buildPanelPopupMenu scriptEditorPanel1;
buildPanelPopupMenu hyperGraphPanel1;

Все эти странные строки кода соответствуют действиям, которые Maya предприняла для создания окна гиперграфа. (Практически все слова, такие как buildPanelPopupMenu, являются обращениями к другим сценариям MEL, расположенным в папке ~maya8.5/scripts/others, хотя точный путь зависит от конкретной операционной системы. Чтобы увидеть, как фактически создается окно, эти и другие сценарии можно просмотреть.) Как можно заметить, даже окна в Maya создаются при помощи MEL.

Теперь давайте рассмотрим панель ввода (панель в нижней части окна редактора сценариев). Сначала, освободите сцену от всех объектов и очистите панель истории; поместите курсор в нижнюю панель и введите следующий код (чтобы упростить чтение панели истории, можно сначала выключить функцию Echo All Commands (Отображать все команды)):

polyCube -name myCube;

Нажмите клавишу <Enter> на цифровой клавиатуре (но не на основной клавиатуре), или, в качестве альтернативы, нажмите сочетание клавиш <Ctrl+Enter> на основной клавиатуре. Как можно заметить, код исчез из панели ввода и появился в панели истории. Одновременно, в исходной точке сцены должен появиться куб по имени myCube. Примите поздравления, только что была выполнена первая команда MEL!

Строки кода, подобные // Result: hyperGraphPanel1Window //, называется строкой результата (result line). Две наклонных черты в начале строки — это маркер комментария, который уведомляет о необходимости игнорировать при выполнении остальную часть этой строки. (В хорошо проработанных сценариях MEL комментарии встречаются очень часто, подробно они обсуждаются далее.) Так MEL отображает результат операции (в данном случае, это отчет о создании запрошенного окна). Если при создании окна гиперграфа произойдет проблема, строка результата вместо сообщения об успехе будет содержать сообщение об ошибке.

Использовать клавишу <Enter> на вспомогательной числовой клавиатуры (или сочетание клавиш <Ctrl+Enter>) приходится потому, что клавиша <Enter> на основной клавиатуре зарезервирована для перехода на новую строку. Другими словами, нажав клавишу <Enter> на основной клавиатуре можно перейти в окне редактора на новую строку. Чтобы запустить на выполнение код, набранный в окне редактора, необходимо воспользоваться одной из двух других возможностей, либо даже просто выделить все команды в панели ввода, а затем нажать клавишу <Enter> на основной клавиатуре.

Теперь проделайте следующее: удалите куб со сцены, а затем трижды щелкните на введенной ранее строке в панели истории (polyCube -name myCube). Выделив всю строку, скопируйте ее в панель ввода или просто перетащите туда средней кнопкой мыши (или удерживая клавишу <Option> на Mac). Теперь нажмите клавишу <Enter>. В результате должен появиться тот же самый куб (по имени myCube), который был создан ранее в исходной точке сцены. Это означает, что в результате копирования команды из панели истории был создан мини-сценарий (называемым макрокомандой или макросом (macro)). Этот небольшой пример демонстрирует мощь такого простого приема как “копирование и вставка”, он позволяет “записать” некую последовательность действий и перетащив ее код из панели истории превратить в макрокоманду MEL (или даже полнофункциональный сценарий). Сохранив этот небольшой сценарий, к нему можно вернуться в любой момент, скопировав и вставив его код (или даже щелкнув на кнопке), а затем запустив его на выполнение.

Номера строк

Тем, кто привык программировать на языке MEL, Maya 8.5 предоставляет новые, улучшенные возможности: панель ввода окна редактора сценариев теперь отображает номера строк с левой стороны. Хоть это все еще относительно слабая система для программирования крупномасштабных сценариев, введение номеров строк серьезно упрощает работу над короткими сценариями непосредственно в окне редактора сценариев. Кроме того, это существенно облегчает отладку.

Для команд MEL можно также без проблем создавать кнопки на любой панели. Достаточно выделить команды, кнопку для которых необходимо поместить на панель, а затем перетащить их средней кнопкой мыши из командной строки на панель (клавишу <Option> на Mac). На рис. 16.2 представлена панель с несколькими кнопками сценариев MEL на ней. Несколько макрокоманд панели будет создано далее, в разделе, “Практика: постановка света при помощи MEL”.

Рис. 16.2. Кнопки сценариев MEL на панели

Maya 8.5, MEL и Python

Нововведением Maya 8.5 является внутренняя поддержка для языка Python версии 2.4.3, включая способность выполнять команды MEL внутри кода Python, если окружение установлено правильно. Язык Python — это автономный язык сценариев (не зависящий от системы Maya), весьма популярный в области визуальных эффектов. Обычный разработчик может вполне безопасно игнорировать язык Python, поскольку обычно он используется в больших компаниях, рабочий процесс которых зависит от сценариев Python. Но это новое дополнение означает, что теперь Maya может быть полностью интегрирована в рабочий процесс больших компаний. Фактически, поскольку все команды MEL (за исключением совпадающих с командами Python, подобно математическим функциям) доступны внутренним функциям языка Python, программисты могут теперь использовать исключительно язык Python, вызывая команды MEL внутри сценариев Python.

Теперь в панели ввода редактора сценариев есть две вкладки: MEL и Python. Вкладка MEL (выбранная по умолчанию) позволяет вводить текст, рассматриваемый редактором сценариев как код MEL и интерпретировать его согласно синтаксису MEL. Вкладка Python позволяет ввести текст интерпретируемый редактором сценариев как код Python. Командная строка также имеет переключатель (слева), позволяющий ввести одну строку кода MEL или сценария Python, в зависимости сделанного выбора.

Поскольку синтаксис языка Python совершенно отличается от синтаксиса MEL, вызовы придется переписывать с учетом соответствующего синтаксиса. Например, команда MEL sphere –radius 5 –name ball для языка Python должна быть переписана следующим образом:

maya.cmds.sphere (radius = 4, name = 'ball')

Префикс maya.cmds уведомляет Python о том, что ему передается команда MEL. Затем флаги radius и name передаются команде sphere как аргументы, а не как флаги, согласно стандартному синтаксису Python.

Для запуска языка Python в редакторе сценариев, необходимо сначала ввести следующий строку во вкладке Python панели ввода:

import maya.cmds

Эта команда загружает модуль команды MEL в Python, позволяя использовать код MEL в любом сценарии Python. Чтобы меньше нажимать клавиши при вводе команд MEL в языке Python, можно прибегнуть к импорту в альтернативное пространство имен. Например, команда import maya.cmds as mc позволяет ввести следующий код, экономя нажатия клавиш:

mc.sphere (radius = 4, name = 'ball')

Для автоматического импорта команд MEL в Python после запуска Maya, можно сначала создать в стандартной папке сценариев (путь ~home/Autodesk/maya/8.5/scripts) текстовый файл userSetup.py, содержащий команду import maya.cmds. После запуска, Maya “увидит” этот файл и автоматически импортирует команды MEL в систему сценариев Python.

Описание языка сценариев Python выходит за пределы этой главы. Более подробная информация об использовании языка Python в Maya приведена в документации интерактивной справочной системы. Для изучения языка Python существует множество книги, включая Beginning Python от Питера К. Нортона (Peter C. Norton) и других (Wrox, 2005).

Что такое атрибут?

Как уже вероятно стало понятно из прежних глав, под атрибутом (attribute) подразумевается любой элемент узла Maya (в языке MEL для обозначения атрибутов используется термин Attr). (Узел Maya (Maya node) — это то, что можно просмотреть в гиперграфе или на вкладках верху редактора атрибутов.) Это звучит немного непонятно, но само действительно довольно простое: за исключением заголовков, каждый элемент в панели каналов (например rotateX, transformY или scaleZ), является атрибутом объекта, который называется узлом (node). Имя узла и указано в заголовке панели каналов.

Узлами базовой сферы NURBS являются: nurbsSphere1, nurbsSphereShape1 и makeNurbsSphere1. Атрибутами являются все остальные доступные поля (как с числовыми, так и с логическими полями справа). Фактически, узел имеет намного больше атрибутов, чем отображено в панели каналов по умолчанию. Чтобы увидеть их все, выберите объект и откройте окно Channel Control (Управление каналами) (пункт меню Window => General Editors => Channel Control (Окно => Общие редакторы => Управление каналами)).

При создании, изменении или анимации объекта, создается или изменяется один либо несколько атрибутов одного или нескольких узлов, которые составляют объект. Безусловно, все эти изменения — не более, чем команды MEL, поэтому вполне можно заставить Maya сделать эту работу автоматически. В этом разделе коротко рассматривается работа языка MEL с атрибутами, а создание сложных сценариев, использующих атрибуты, несколько позже.

Корректируя в предыдущем разделе некоторые из атрибутов объекта myCube можно было заметить, что редактор сценариев заполнен операторами, начинающимися со слова setAttr. Оператор setAttr инструктирует MEL о необходимости присвоить казанному атрибуту некоторое значение. Аналогично, оператор getAttr возвращает (читает) значение атрибута указанного объекта, позволяя использовать его в другом операторе MEL. Оператор addAttr добавляет атрибут к некоторому элементу, а оператор listAttr позволяет получить список атрибутов узла. По существу, использование оператора setAttr аналогично открытию окна редактора атрибутов для выделенного объекта и изменению значения в одном из его полей. (Попробуйте изменить значение в редакторе атрибутов и убедитесь, что в панели истории редактора сценариев появился соответствующий оператор setAttr.) Оператор setAttr имеет следующий синтаксис:

setAttr [флаги] имяОбъекта.имяАтрибута значение;

Флаги, как уже упоминалось, являются набором специальных запросов, выполняемых языком MEL; имяОбъекта.имяАтрибута — это имя атрибута элемента, которому предстоит присвоить значение (например myCube.translateX); значение — это значение, присваиваемое атрибуту. Операторы getAttr и addAttr имеют подобный синтаксис. Например, куб по имени box можно переместить по оси X на 10 единиц, введя в редакторе сценариев следующий код:

setAttr box.translateX 10;

Выполнение этой команды приведет к перемещению куба из его текущего положения к десятой единице по оси X. (Безусловно, если на сцене нет узла объекта по имени box, последует сообщение об ошибке.)

Таким образом язык MEL (и Maya) обращаются к атрибутам, подобно языку C++ и другим объектно-ориентированным языкам. Т.е. сначала указывают узел, затем следует точка и имя атрибута: Объект.Атрибут. Если не указать узел, об атрибуте которого идет речь, последует сообщение об ошибке. Например, ввод команды setAttr translateX 10; приведет к сообщению об ошибке, поскольку Maya не знает, что следует перемещать.

Установка значения атрибута translateX очень похожа на команду перемещения: move 10 0 0. Однако в отличии от команды move, установка значения атрибута translateX не повлияет на два других атрибута (translateY и translateZ). Кроме того, оператор setAttr гораздо гибче, чем команда move, которая может только перемещать объект.

Улучшение рабочего пространства при помощи панелей

Хотя панели коротко обсуждались в главе  “Интерфейс Maya”, они могли показалось малополезными. Что делает панели действительно полезными, так это не только то, что на них присутствует уже, а то, что на них можно добавить. Например, любой пункт меню можно сделать кнопкой панели или поместить на нее сценарий MEL в панель, что позволит выполнять довольно сложные задачи одним щелчком мыши. Кроме того, возможность создавать и использовать несколько панелей, позволяет создать отдельную панель для каждой задачи. Например, одну панель можно посвятить сценариям MEL, а другую общим задачам для определенного проекта. Чтобы создать новую панель, выберите пункт меню Window => Settings/Preferences => Shelves (Окно => Параметры/Предпочтения => Панели), перейдите на вкладку Shelves (Панели) и щелкните на кнопке New Shelf (Новая панель).

Чтобы переключиться на новую панели (например панель Surfaces (Поверхности)), достаточно выбрать ее из раскрывающегося меню панелей (серая кнопка с изображением папки слева от панели). (Параметры панели можно также настроить при помощи раскрывающегося меню, черный треугольник чуть ниже вкладки меню панели.) Maya предоставляет большое количество заранее созданных панелей, что повышает их ценность. Чтобы создать новую кнопку панели из пункта меню, выберите его удерживая клавиши <Ctrl> и <Shift> в строке меню (но не в окне оперативного доступа). Новая кнопка появится на активной панели. Щелчок на этой кнопке будет аналогичен выбору соответствующего пункта меню.

На панели можно создать столько кнопок, сколько необходимо (хотя если их будет слишком много, ее придется прокручивать), или удалить любую из них. Так панели Maya можно полностью настроить по своему усмотрению. Например, на панель General (Общие) имеет смысл поместить кнопки для вызова таких элементов как гиперграфа и гипершейдер.

В качестве простого примера применения оператора setAttr, давайте вручную создадим куб и присвоим значения некоторым из его атрибутов. Введите в панели ввода редактора сценариев следующий код.

polyCube -n box;
setAttr polyCube1.sw 3;
setAttr polyCube1.w 5;
setAttr box.rotateY 45;
setAttr box.translateX -2.5;
setAttr box.translateY .25;
setAttr box.scaleY 0.5;

Можно ли уже предположить, что делает каждая отдельная команда? Пробуйте выделять каждую строку и нажимая клавишу <Enter> на числовой клавиатуре выполнять ее.

Выделение и выполнение строк кода по одной — это прекрасный способ выявления ошибок в сценарии.

Чтобы изменить способ создания куба, необходимо обратиться к узлу формы (polyCube1), а не к узлу положения, который после создания был переименован в box.

Первая строка кода создает куб. Остальные строки изменяют некоторых из его атрибутов, в том числе узла формы куба (узел polyCube1) или узла положения (узел box). После команды polyCube следует два оператора setAttr, они изменяют размер куба по ширине, а затем собственно ширину куба (теперь параллелепипеда). Четыре последние строки изменяют поворот, позицию и масштаб узла трансформации куба (по имени box). Конечный результат должен выглядеть как на рис. 16.3.

Рис. 16.3. Сплюснутый куб

Если, по некоторым неизвестным причинам понадобится создавать много сплюснутых кубов на различных сценах, эти команды достаточно будет просто перетащить средней кнопкой мыши (с удержанием клавиши <Option> у Mac) на панель, и создавать объекты щелкая на полученной кнопке, сэкономив таким образом много времени.

Справочная система MEL

Прежде, чем переходить к дальнейшему изучению языка MEL, давайте рассмотрим мощнейшую справочную систему Maya, доступную для языка MEL, и убедимся, насколько она проста в использовании.

В первую очередь имеет смысл рассмотреть внутреннюю функцию Maya Help. Поскольку язык MEL имеет так много команд и функции (приблизительно 700), функция Help представляет собой самый быстрый и удобный способ доступа к информации о них. (Можно даже ввести команду help help, чтобы получить информацию о работе команды Help.) Давайте рассмотрим пример доступа к информации при помощи команды Help. Откройте редактор сценариев и введите в панели ввода (либо просто в командной строке ниже главного окна) команду help, сопровождаемую именем команды, справку о которой необходимо получить, например имя команды setAttr:

help setAttr;

Выполните команду (нажав клавишу <Enter> на числовой клавиатуре или сочетание клавиш <Ctrl+Enter> на обычной). В панели истории редактора сценариев появится следующий результат:

Synopsis: setAttr [flags] Name[...]
Flags:
    -e -edit
    -q -query
    -av -alteredValue
    -c -clamp
    -ca -caching       on|off
    -cb -channelBox    on|off
    -k -keyable        on|off
    -l -lock           on|off
    -s -size           UnsignedInt
    -typ -type         String

Полученный результат позволяет быстро узнать все необходимое о команде setAttr: краткое описание (синопсис) ее синтаксиса (т.е. как ей пользоваться) и список флагов, которые можно использовать с этой командой.

Для опытного программиста этой информации вполне достаточно, чтобы применить команду. Однако начинающему разработчику вероятно понадобится более подробное описание. В этом случае попробуйте ввести в панели ввода следующее:

help -doc setAttr;

При выполнении этой команды Maya автоматически откроет броузер и найдя соответствующую страницу HTML в документации (содержащейся на локальном жестком диске) отобразит подробную информацию об искомой команде. В случае оператора setAttr будет отображена следующая страница. (Это просто отрывок, настоящая страница содержит намного более подробную информацию.)

Synopsis
    SetAttr [flags] object.attribute value [value..]
ReturnValue
    None.
Description
    Sets the value of a dependency node attribute. No value for the
    attribute is needed when the -l/-k/-s flags are used. The -type
    flag is only required when setting a non-numeric attribute.
    The following chart outlines the syntax of setAttr for
    non-numeric data types:
{TYPE} below means any number of values of type TYPE, separated by a space
[TYPE] means that the value of type TYPE is optional
A|B means that either of A or B may appear

Examples
sphere -n sphere;
   
    // Set a simple numeric value
    setAttr sphere.translateX 5;
   
    // Lock an attribute to prevent further modification
    setAttr -lock on sphere.translateX;
   
    // Make an attribute unkeyable
    setAttr -keyable off sphere.translateZ;
   
    // Set an entire list of multi-attribute values in one command
    setAttr -size 7 "sphereShape.weights[0:6]" 1 1 2 1 1 1 2
   
    // Set an attribute with a compound numeric type
    setAttr "sphere.rotate" -type "double3" 0 45 90;
   
    // Clamp the value of the attribute to the min/max
    // Useful floating point math leaves the value just
    // a little out of range - here the min is .01
    setAttr -clamp "anisotropic1.roughness" 0.0099978;
   
    // Set a multi-attribute with a compound numeric type
    setAttr "sphereShape.controlPoints[0:2]" ~CA-type "double3" 0 0 0 1 1 1 2 2 2;

Как можно заметить, пара примеров вполне способна объяснить, как пользоваться командой.

Для более глубокого изучения самого языка сценариев и его структуры, вполне можно обратиться и к оперативной документации MEL. Чтобы открыть справочник по языку MEL в Web-броузере, выберите в меню Maya пункт Help => MEL Command Reference (Справка => Справочник команд MEL), как показано на рис. 16.4. Эта Web-страница содержит информацию о всех командах языка MEL, отображаемую в алфавитном порядке или по категориям. Внутренние файлы справочной системы и оперативная справочная документация на жестком диске позволят быстро обратиться к информации по любой команде.

Рис. 16.4. Справочная документация по командам MEL, открытая в Web-броузере

Еще один хороший способ изучения языка MEL — это исследование сценариев, написанных другими разработчиками. При желании можно даже копировать и вставлять части их сценариев в собственные. (Перед этим правда следует получить разрешение автора.) Для изучения сценариев MEL можно исследовать примеры находящиеся на прилагаемом CD, в разделе “Maya Gems” оперативной справочной системы и на Web-сайте highend3d.com, который содержит многочисленные сценарии MEL, разработанные разными пользователями.

Практика: постановка света при помощи MEL

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

1. Откройте новую сцену в Maya и очистите панель истории редактора сценариев (выберите Edit => Clear History (Правка => Очистить историю)). Чтобы лучше видеть результат постановки света и наблюдаемые при этом эффекты от источников, имеет смысл создать наземную плоскость и объекты на ней. Если это сделано, историю следует очистить снова.

2. Создайте прожектор (направленный источник света) с углом конуса (Cone Angle) 40, интенсивностью (Intensity) 1, полутенью (Penumbra) 10 и при включенном параметре Cast Shadows (Приведение теней). Поместите его в позицию основного источника света, выше справа от сцены, с точи зрения перспективной камеры. Этому источнику света можно присвоить какое нибудь осмысленное имя, например keyLight. Установив прожектор, скопируйте на панель ввода все строки кода, созданные в панели истории. Полученный в результате код будет выглядеть примерно так.

defaultSpotLight(1, 1,1,1, 0, 40, 0, 10, 1, 0,0,0, 1, 0);
rename "spotLight1" "keyLight";
move -r 0 0 9.028994;
move -r 11.075382 0 0;
move -r 0 3.945165 0;

Код будет выглядеть изящней, если объединить все операторы move -r в один. Для этого достаточно просуммировать значения в каждом столбце и использовать полученные результаты в одной команде.

3. Теперь создайте второй прожектор, отключите приведение тени, установите интенсивность 0.5, переименуйте его в fillLight и переместите в левую нижнюю часть сцены (если смотреть со стороны камеры). Этому источнику света можно придать небольшой синеватый оттенок. По завершении скопируйте полученный код в панель ввода.

4. Наконец, создайте еще один источник света, называемый контровым (backLight), без теней, углом конуса 60°, и с интенсивностью 1. Переместите этот источник света с обратный стороны сцены (от камеры), немного слева от камеры и в направлении вниз на объекты сцены.

По завершении (и удалении излишних команд move и rotate), код в панели ввода должен выглядеть как представлено ниже, при расположении источников света на сцене подобно рис. 16.5.

Рис. 16.5. Типичная постановка источников света при тройном освещении

defaultSpotLight(1, 1,1,1, 0, 40, 0, 10, 1, 0,0,0, 1, 0);
rename "spotLight1" "keyLight";
move -r 19.764 22.101 20.838;
rotate -r -os -42.6 39.2 0;
defaultSpotLight(0.5, 1,1,1, 0, 40, 0, 10, 0, 0,0,0, 1, 0);
rename "spotLight1" "fillLight";
move -r -18.034 2.571 8.113;
rotate -r -os -3 -66.2 0;
setAttr "fillLightShape.color" -type double3 0.58425 0.63904 0.779;
defaultSpotLight(1, 1,1,1, 0, 60, 0, 10, 0, 0,0,0, 1, 0);
rename "spotLight1" "backLight";
move -r -7.937 8.956 -11.675;
rotate -r -os -29.4 -144.8 0;

5. Средней кнопкой мыши (клавиша <Option> на Mac) перетащите код из панели ввода на панель. Теперь, щелкнув на полученной кнопке, на любой сцене будут созданы три источника света в соответствующих позициях!

6. Как можно заметить, кнопка с надписью MEL на панели — не самая понятная пиктограмма в мире. Чтобы указать, какой именно сценарий MEL имеется в виду, для кнопки можно добавить надпись или даже пиктограмму. Чтобы добавить для кнопки текст, щелкните на черном треугольнике слева от панели, и в раскрывающемся меню выберите пункт Shelf Contents (Содержимое панели). Во вкладке Shelf Contents (Содержимое панели) перейдите в нижнюю часть списка, где должна находиться новая кнопка. Измените содержимое поля Labels & Tooltips (Метки и Всплывающие подсказки) на 3 light setup. Затем в поле Icon Name (Имя пиктограммы) введите значение 3Lts. Имя пиктограммы появится в панели под пиктограммой MEL, а текст отобразится при наведении курсора мыши на пиктограмму. Законченная кнопка представлена на рис. 16.6.

Рис. 16.6. Специальная кнопка тройного освещения на панели

Не стесняйтесь создавать и помещать на панель другие постановки освещения или простые сценарии по своему усмотрению, если они могут пригодиться в будущем.

Переменные, циклы и переходы

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

Переменные

Переменную (variable) проще продемонстрировать, чем долго описывать ее назначение и суть. Введите в редакторе сценариев следующее.

string $myVariable;
$myVariable = "hi there";
print $myVariable;

Выполнив эти команды можно заметить, что фраза "hi there" отображается в последней строке панели истории. Это означает, что команда отобразить содержимое переменной $myVariable привела к отображению фразы "hi there". Первая строка кода этого сценария называется объявлением (declaration) переменной: string — это тип переменной (т.е. строка, текст которой заключен в кавычки), а $myVariable — это имя переменной. Вторая строка сценария присваивает переменной $myVariable строку "hi there", а третья строка одержит команду print, выводящую содержимое переменной $myVariable на экран.

Типы переменных MEL

Язык MEL поддерживает следующие типы переменных:

int (целое число) — используется для хранения целых чисел, таких как 3 или -45.

float (десятичное число) — используется для вещественных чисел, таких как -35.4725.

string (символьная строка в кавычках) — используется для хранения текста, например "hello world".

vector (вектор). Три десятичных числа, которые составляют векторное число, используемое для описания точки в трехмерном пространстве, например (26, 31.67, 6.724). Векторное число применяется для хранения трехкомпонентной информации, такой как позиция (в координатах X, Y, Z) или цвета (красный, зеленый, синий).

array (массив). Список чисел, используемый для хранения набора целых чисел, десятичных чисел, строк или векторов. Массивы применяются для хранения данных многих подобных элементов, например цветов каждой частицы в группе частиц.

matrix (матрица). Двумерный массив десятичных чисел или массива массивов десятичных чисел. Если это звучит непонятно, матрицу можно представить себе как таблицу из рядов и столбцов, содержащую десятичные числа.

Более подробно каждый из типов переменных будет описан далее, по мере их применения в это

574 0 850 6
2
2007-10-07
Просто, круто! MEL-рулит...
2008-12-03
Я стабой полностью согласен, именно поэтому наверное его в Pixar используют
RENDER.RU