Plug-ins к Maya. Для самых маленьких.
Автор: Sergei Shaykin
Попробуем создать простой plug-in к Maya.
Использование Wizard
Загрузка plug-in'а.
Примечание о средстве разработки
Использование Wizard
Для первого знакомства, я советую создать простейший пример, используя Wizard. Установка Wizard'а происходит в том случае, если вы инсталлировали Maya API SDK, после того как установили Microsoft Developer Studio на своей системе. Открывайте Developer Studio. Cоздайте проект File\New. Выбираем закладку Project. Если Maya API Wizard удачно установился, то в списке типов проекта вы можете найти Maya Plug-in Wizard. Не забудьте его выделить.
Задайте в поле Project name имя проекта, ниже путь для проекта. Кнопка OK запустит Maya Plug-in Wizard.
В первом шаге выберите версию Maya, вставьте имя разработчика, например своё или имя собаки жены друга вашего брата. Если вам нужны комментарии, что для начинающих обычно полезно, выставьте соответствующий флажок.
В следующем шаге выберите MEL Command, ниже введите имя команды.
Далее можно просто нажать кнопку Finish или просто в следующем шаге оставить всё по умолчанию.
Если кому интересен следующий шаг, то там выбираются библиотеки, которые будут использоваться в проекте. Maya API содержит следующие библиотеки:
- OpenMaya - В библиотеке находятся фундаментальные классы для определения нодов, команд и сборка их в plug-in.
- OpenMayaUI - Эта библиотека содержит классы, необходимые для создания нового пользовательского интерфейса, такие как манипуляторы, контексты и локаторы.
- OpenMayaAnim - Эта библиотека содержит классы работающие с анимацией, включая деформацию и инверсную кинематику.
- OpenMayaFX - Библиотека для работы с динамикой.
- OpenMayaRender - Содержит классы для работы с функциями просчёта.
Всё оказалось проще простого. Wizard настроит ваш проект и создаст небольшой код:
#include <maya/MSimple.h> DeclareSimpleCommand(MyCom, "Watkin", "3.0"); MStatus MyCom::doIt( const MArgList& args ) { MStatus stat = MS::kSuccess; setResult( "MyCom command executed!\n" ); return stat; }
Как ни странно, но это компилируется. Maya plug-in - это обычный файл DLL, только расширение самого файла должно быть ".mll". По умолчанию этот файл собирается в Debug или Release директорию (в зависимости от установок) вашего проекта. Чтобы Maya могла распознать новый plug-in, его нужно переместить в специальную директорию, где лежат другие plug-in'ы. Путь к этой директории может быть расположен по такой схеме: AW\Maya3.0\bin\plug-ins. Когда ваш plug-in попадёт туда, Maya сможет его обнаружить.
Загрузка plug-in'а.
Для того чтобы загрузить или выгрузить plug-in, не нужно выходить из Maya и запускать её заново. Существует два пути загрузки и выгрузки plug-in'а. Самый простой - это использование Plug-in Manager. Выберите в Maya меню Window > Settings/Preferences > Plug-in Manager для отображения списка plug-in'ов, затем найдите нужный и загрузите его.
Другой способ, загрузка через MEL командой loadPlugin:
loadPlugin "MyCom";
Эта команда ищет файл MyCom.mll по пути установленному в переменной среды MAYA_PLUG_IN_PATH и загружает его как plug-in. Выгрузка plug-in осуществляется командой unloadPlugin.
Теперь рассмотрим, что из себя представляет полученный код.
Класс MStatus работает с кодами состояний Maya. Этот класс предоставляет методы для посылки кодов состояний между пользовательским кодом и Maya. API использует этот класс для индикации успешного или неуспешного выполнения метода. Внутри него находится перечисление возможных типов состояния enum MStatusCode. Состояние нужно возвращать из этого enum, например,
return MS::kSuccess;
Класс MPxCommand является базовым классом для создания команд Maya, определяемых пользователем.
Класс MFnPlugin регистрирует и удаляет регистрацию взаимодействия плагина с Maya.
Для инициализации и выгрузки plug-in'а необходимо предоставить две функции, соответственно отвечающие за это:
MStatus initializePlugin( MObject obj )
MStatus uninitializePlugin( MObject obj )
Например, чтобы создать простую команду для Maya необходимо создать класс, порожденный от MPxCommand и зарегистрировать экземпляр этого класса в функции initializePlugin(), которая вызывается при подключении plug-in'а из Maya. Соответственно, удалить регистрацию необходимо в функции uninitializePlugin().
MStatus initializePlugin(MObject obj ) { MStatus status; MFnPlugin plugin( obj ); status = plugin.registerCommand( "MyCom", MyCom::creator); if( !status) status.perror( "registerCommand"); return status; } MStatus uninitializePlugin( MObject obj) { MStatus status; MFnPlugin plugin( obj ); status = plugin.deregisterCommand( "MyCom"); if ( !status) status.perror( "deregisterCommand"); return status; }
Созданный класс, собственно, и будет отвечать за работу вашей команды. То есть, вы в соответствующих методах этого класса описываете его поведение. Например, метод doIt() выполняется при вызове вашей новой команды из Maya. Для вашего класса также необходимо предоставить статический метод creator(), который дает Maya возможность создать новый объект вашего класса. Другими словами, если ваш класс, порожденный от MPxCommand, называется MyCom, вы предоставляете метод этого класса:
static void* creator();
и описываете его, к примеру, следующим образом:
void* MyCom::creator() { return new MyCom( ); }
Этого достаточно, чтобы создать простейшую команду, вызываемую из Maya. Если ваша цель именно простейшая команда, то вы можете либо самостоятельно написать соответствующий код, либо воспользоваться макросом DeclareSimpleCommand, объявленным в MSimple.h, и тогда вам необходимо предоставить лишь реализацию метода doIt. Собственно это и делает Wizard в нашем примере.
MSimple.h — это специальный заголовочный файл, используемый для командных plug-in'ов. Макрос DeclareSimpleCommand имеет ограничение, он не может быть использован для команд, поддерживающих операции Undo и Redo.
В метод doIt() параметром входит класс MArgList. Этот класс предоставляет методы, возвращающие аргументы, различных типов, включая integer, double, string, vector и тд. Например, метод length() возвращает количество аргументов, asString(i) возвращает i-й элемент как строку (класс MString), а asDouble(i) - как вещественное число. Причем, некоторые функции могут следить за своим успешным выполнением, например, asString(i, &state) - выдает state, как состояние выполнения этой функции.
Примечание о средстве разработки
На прощание поговорим о программах и о версиях.
Большое разочарование для любителей бейсиков, паскалей и прочей живности. Plug-in'ы для Maya пишутся на MS Visual C++. Для примера в этом тексте, была использована 6-я версия MS Visual C++ и Maya 3.0.
12 июля 2001 (Обновление: 13 июня 2009)
Комментарии [3]