Опрос

Что такое, по вашему мнению, «демократия»?













Размещение

15.01.2010 11:44 Администратор
Печать PDF
Рейтинг пользователей: / 0
ХудшийЛучший 

Если вам нужно сделать свой модуль доступным широкому кругу пользователей, вы должны выбрать схему его размещения. Метод размещения подключаемых модулей будет, по всей видимости, тем же, что и при размещении сценариев. 1. Если работа ведется в производственной среде, где каждый пользователь может обращаться к центральному серверу, задача размещения существенно упрощается. Просто создайте на сервере совместно используемый каталог, например \\server\mayaPlugins. В этом примере используется формат, соответствующий универсальному коду имен UNC (Universal Naming Code), однако вы должны пользоваться тем форматом пути, которого требует ваша сеть. Если у вас нет центрального сервера, а вместо этого каждый пользователь имеет свою собственную локальную машину, создайте на каждой машине каталог, например с: aayaPlugins. Будем обозначать его как каталог_модулей. 2. Скопируйте двоичные файлы модуля в этот каталог. 3. На каждой из машин пользователей установите переменную окружения с именем HAYA_.PLUG_IN_PATH и включите в нее путь к каталогу на сервере. set MAYA_PLUG._IN_PATH=$MAYA_PLUG_IN_PATH; кягапог_мСоздание команд Чтобы понять, как создаются более сложные команды, подробно рассмотрим команду с именем posts. Она принимает на вход кривую и генерирует ряд стоек (цилиндров), расположенных вдоль кривой. На рис. 4.8 изображена исходная направляющая кривая. На втором рисунке, рис. 4.9, показан результат выполнения этой команды. 4.4.2. Модуль Posts'Мы начнем этот раздел с простой версии команды pos. ts, которую будем постепенно достраивать. Первая версия команды получит название posts'!. 1. Откройте рабочую среду Postsl. 2. Скомпилируйте ее и загрузите полученный модуль posts"!. mil в среде Maya. 3. Откройте сцену PostsCurve. ma. 4. Выделите кривую. 5. В строке Command Line наберите следующий текст, а затем нажмите клавишу Enter. postsi Будут созданы пять цилиндров, расположенных вдоль кривой. Подробно рассмотрим исходный код этой команды. Модуль: Postsl Файл: postsCmdl. cpp class PostslCmd : public MPxCommand public: virtual MStatus dolt ( const MArgList& ); static void *creator() { return new PostslCmd; } MStatus PostslCmd: :dolt ( const MArgList & ) const int nPosts = 5; const double radius = 0.5; const double height = 5.0; MSelectionList selection; MGlobal; : getActiveSelectionl_ist( selection ); MDagPath dagPath; MFnNurbsCurve curveFn; double heightRatio = height / radius; MItSelectionList iter( selection, MFn: :kNurbsCurve ); for ( ; liter. isDoneC); iter. nextQ ) iter. getDagPath( dagPath ); curveFn. setObject( dagPath ); double tStart, tEnd; curveFn. getKnotDomainC tStart, tEnd ); MPoint pt; int i; double t; double tlncr = (tEnd - tStart) / (nPosts - 1); for( i=0, t=tStart; i< nposts; i++, t += tlncr) curvefn. getpointatparam( t, pt, mspace: :kworld ); pt.y += 0.5 * height; mglobal: :executecommand( mstringf "cylinder -pivot ") + pt.x * " " + pt.y + " " + pt.z " -radius 0.5 -axis 0 1 0 -heightratio " + heightratio ); return ms: :ksuccess; mstatus initializeplugin( mobject obj ) { mfnplugin pluginfnc obj, "david gould", "1.0"); mstatus stat; stat = pluginfn.registercommand( "postal", postslcmd::creator ); if ( istat ) stat.perror( "registercomrnand failed" ); return stat; mstatus uninitializeplugin( mobject obj ) mfnplugin pluginfn( obj ); mstatus stat; stat = pluginfn.deregistercommand( "posts!" ); if ( istat ) stat.perror( "deregistercommand failed" ); return stat; первым шагом является описание нового класса комешды postslcmd. этот класс является производным от mpxcommand - класса, который служит предком все создаваемых команд. class postslcmd : public mpxcommand public: virtual mstatus dolt ( const marglist& ); static void *creator() { return new postslcmd; } есть только две функции, которые нужно реализовать, - dolt и creator. функция dolt является виртуальной функцией, вызываемой при выполнении команды. вся реальная работа в команде возложена на эту функцию. она производит все операции, которые должна осуществить команда для получения результата. функция creator служит для создания экземпляра команды. обратите внимание на то, что она является статической, а потому ее вызов не требует наличия экземпляра класса. на самом деле от вас не требуется, чтобы эта функция была статической функцией-членом или даже называлась creator. функция создания — это просто обычная функция, возвращающая размещенный в памяти экземпляр команды. static void *creator() { return new postslcmd; } эта функция регистрируется средствами maya в функции initializeplucin, поэтому maya знает о том, как создать экземпляр команды. при получении запроса на выполнение команды maya, пользуясь функцией creator, сначала размещает в памяти ее экземпляр. следом вызывается принадлежащая экземпляру команды функция dolt. каждый раз, когда вы станете выполнять команду, maya будет повторять эти шаги. а значит, всякий раз при запросе на выполнение команды будет создаваться ее новый экземпляр. причина этого связана со встроенным в maya механизмом отмены/повторного выполнения. вскоре он станет предметом нашего рассмотрения. так как всю фактическую работу выполняет функция dolt, сейчас мы опишем ее более подробно. первый фрагмент функции содержит код инициализации количества стоек, а также их радиуса и высоты. mstatus postslcmd::dolt ( const marglist & ) const int nposts = 5; const double radius = 0.5; const double height = 5.0; далее создается список объектов, выделенных в настоящий момент. для хранения списка используется объект selection. mselectionlist selection; mglobal::getactiveselectionlist( selection ); к сожалению, примитив cylinder не допускает явного указания его высоты. вместо этого, высота цилиндра определяется значением heightratio. это отношение высоты цилиндра к его ширине. heightratio рассчитывается на основе желаемой высоты и радиуса цилиндра, double heightratio = height / radius; далее организуется цикл по списку выделенных объектов. этой цели служит объект mitselectionlist. так как команду интересуют исключительно nurbsкривые. в цикле указан фильтр, который исключает все прочие объекты, такими кривыми не являющиеся. объект iter инициализируется объектом selection, который был создан ранее. mitselectionlist iter( selection, mfn:;knurbscurve ) цикл по всем nurbs-кривым выполняется, как показано ниже. поскольку итератор просматривает все выбранные nurbs-кривые, вы можете воспользоваться командой posts"! для работы с несколькими кривыми, и она построит цилиндры на каждой из них. for ( ; !iter.isdone(); iter.nextc) ) { для идентификации текущей "nurbs-кривой определяется полный путь к ней по оаг. iter.getdagpath( dagpath ); путь по оаг дополняется функциональным набором для работы с nurbsкривыми mfnnurbscurve, таким образом, все дальнейшие операции набора функций будут выполняться в отношении объекта, который определяется путем по оаг. curvefn.setobject( dagpath ); nurbs-кривая является параметрическим примитивом. ее расчет при известном значении параметра t позволяет получить точку, лежащую на кривой. значение t обычно находится в пределах от 0 до 1, однако диапазон изменения параметра кривой может быть произвольным. следующий фрагмент кода определяет начало и конец этого диапазона. double tstart, tend; curvefn.getknotdomain( tstart, tend ); наша команда порождает nposts стоек, располрженных по всей длине кривой. диапазон изменения параметра делится на необходимое число стоек. так как и в начале, и в конце кривой должна находится стойка, кривая будет иметь nposts - 1 сегмент. double tlncr = (tend - tstart) / (nposts - 1); следующий фрагмент функции действительно является ее ядром. стойки устанавливаются на кривой по всей ее длине при каждом очередном значении параметра t. for( i=0, t=tstart; i < nposts; i-и-, t += tlncr) функция getpointatparafn возвращает точку, лежащую на кривой и соответствующую тому или иному значению параметра. в данном примере запрашивается точка, описанная в мировых координатах (mspace: : kworld), а не в принятых по умолчанию координатах объекта (mspace: : kobject). это делается потому, что каждая стойка должна занять окончательное положение в мировом пространстве независимо от иерархии преобразований кривой, curvefn.getpointatparam( t, pt, mspace: :kworld ); по умолчанию опорной точкой цилиндра является его центр. так как основание цилиндра должно покоиться на кривой, надо переместить его опорную точку на половину значения высоты. pt.y += 0.5 * height; теперь, когда всевозможные параметры нашей команды готовы, можно выполнять команды mel, необходимые для фактического создания цилиндров. для построения цилиндра с данной опорной точкой (-pivot), данным радиусом (-radius) и данным коэффициентом высоты (-heightratio) используется команда cylinder. чтобы из кода на c++ выполнить оператор mel, вызовите функцию mglobal; : executecommand. ее входом является строка операторов mel. которые необходимо выполнить. mglobal: : executecommand( mstring( "cylinder -pivot ") + pt.x + ' " + pt.y + " " + pt.z + " -radius " + radius + " -axis 0 1 0 -heightratio " + heightratio ); действительно, выполнение операторов mel в модуле на языке c++ можно увидеть достаточно часто. во многих случаях это имеет больший смысл, нежели попытки выполнить те же операции с опорой на ряд вызовов c++ api. кроме того, имеется ряд команд mel, которые отсутствуют в c++ api, а потому вам не остается ничего иного, как выполнять эти команды именно на языке mel.

Добавить комментарий


Защитный код
Обновить

Поиск

В закладку

 
 

Авторизация



Погода