C++ для Maya
Часть 1. Создание нового проекта и настройка зависимостей.
Написание первого плагина.
Внимание! Данной статьей я не хочу когото научить, но только делюсь своим опытом и наработками.
Почти вся информация по настройки проекта была взята из видео:
Запускаем Visual Studio и в появившемся окне выбираем Продолжить без кода(Continue without code).
Затем, в выпадающем окне Языки(Languages) выбираем C++ и опцию Пустой проект(Empty Project). Жмем Далее.
В следующем окне указываем имя проекта и путь куда ваш проект будет сохранен. Жмем кнопку Создать.
Нажимаем правой кнопкой мыши на PostsCmd1. В всплывающей вкладке выбираем Добавить(Add) Новый предмет(New Item).
В диалоговом окне выбираем C++ File и задаем имя PostsMain. Жмем Добавить(Add).
Так как наша Maya имеет архитектуру 64bit то мы удалим х86 архитектуру из нашего проекта.
Нажимае правой кнопкой мыши на PostsCmd1 и в всплывающем окне выбираем Характеристики(Properties). Затем переходим в Менеджер конфигурации(Configuration Manager).
Во вкладке Платформа Активных решений(Active Solution Platform) выбираем Редактировать(Edit). Далее выбираем х86 и удаляем с помощью кнопки Remove. Затем, переименовываем х64 на Maya2023_64Bit. В всплывающем окне подтверждаем кнопкой Да(Yes), а затем закрываем окно Редактирование Платформу Решений(Edit Solution Platform) кнопкой Закрыть(Close).
Поскольку плагин в основном представляет собой динамически связанные библиотеки, нам нужно установить тип конфигурации как .dll. Так же выберем ISO C++ 17Standart (/std:c++17).
Итак, во вкладке All Configuration мы выбрали следующее:
* Configuration Type : Dynamic Library (.dll)
* Windows SDK Version : 10.0 (latest installed version)
* Platform Toolset : Visual Studio 2022 (v 143)
* C++ Language Standart : ISO C++17 Standart
Внимание! Если плагин не будет активироваться в Maya, то попробуйте выбрать Visual Studio 2022 (v 143).
В разделе Дополнительных свойств(Advanced) измените Целевое расширение файла(Target File Extension) на .mll
Затем выберите раздел C/C++ на левой панели, Общие(General) -> Дополнительные включаемые каталоги(Additional Include Directories) и выберите включаемую папку из установочного каталога Maya devKit.
Необязательный шаг: если вы хотите ускорить процесс компиляции и у вас многоядерный процессор, я бы порекомендовал активировать настройку многопроцессорной компиляции из того же раздела Общие(General) -> Многопроцессорная компиляция(Multi-processor Compilation) -> Выберите Да (/MP)(Yes(/MP)).
Затем выберите связанный раздел на левой панели, выберите Общие(General) -> Дополнительные каталоги библиотек(Additional Library Directories) и выберите папку lib из установочного каталога Maya devKit.
Затем выберите раздел ввода из того же раздела компоновщика и добавьте в разделе Дополнительные зависимости(Additional Dependencies) следующие библиотеки:
Основные библиотеки:
* OpenMaya.lib
* Foundation.lib
Если вы разрабатываете плагины, использующие другие модули Maya, их также необходимо включить.
Дополнительные библиотеки:
* OpenMayaAnim.lib
* OpenMayaFX.lib
* OpenMayaRender.lib
* OpenMayaUI.lib
Поскольку типом конфигурации проекта является DLL, эти функции входа необходимы для его инициализации и деинициализации из хост-приложения, в данном случае Maya.
Выберите раздел Командная строка(Command Line) в том же разделе Компоновщик(Linker) и введите их в текстовое поле Дополнительные параметры(Additional Options).
/export:initializePlugin /export:uninitializePlugin
Во вкладке Конфигурации(Configuration) Debug добавьте:
UNICODE
WIN32
_DEBUG
Теперь сделайте то же самое для Конфигурации(Configuration) Release и добавьте:
UNICODE
WIN32
NDEBUG
После того, как все настроено правильно. Закройте диалоговое окно конфигурации.
На этом настройка проекта завершена. Теперь давайте напишем наш первый плагин для Maya.
С простым кодом я уже ознакомился и мне хотелось что то посложнее и интереснее. И поэтому код который я буду использовать в примере я взял из книги Maya. Полное руководство по программированию(Complete Maya Programming).
Автор - Девид Гоулд(David Gould).
Полный разбор кода вы можете посмотреть в вышеуказанной книге. В кратце же, этот плагин расставляет Нурбс цилиндры по выделенной кривой.
#include<maya/MObject.h>
#include<maya/MGlobal.h>
#include<maya/MArgList.h>
#include<maya/MSelectionList.h>
#include<maya/MDagPath.h>
#include<maya/MPoint.h>
#include<maya/MPxCommand.h>
#include<maya/MItSelectionList.h>
#include<maya/MFnNurbsCurve.h>
#include<maya/MFnPlugin.h>
class posts1Cmd : public MPxCommand
{
public:
virtual MStatus doIt ( const MArgList& );
static void* creator() { return new posts1Cmd; }
};
MStatus posts1Cmd::doIt(const MArgList&) {
const int nPosts = 5;const
double radius = 0.5;const
double height = 5.0;
MSelectionList selection;
MGlobal::getActiveSelectionList( selection );
MDagPath dagPath;
MFnNurbsCurve curveFn;
double heightRatio = height / radius;
MItSelectionList iter(selection, MFn::kNurbsCurve);
for (; !iter.isDone(); iter.next())
{
iter.getDagPath(dagPath);
curveFn.setObject(dagPath);
double tStart, tEnd;
curveFn.getKnotDomain(tStart, tEnd);
MPoint pt;
int i;
double t;
double tIncr = (tEnd - tStart) / (nPosts - 1);
for(i = 0, t = tStart; i < nPosts; i++, t += tIncr)
{
curveFn.getPointAtParam(t, pt, MSpace::kWorld);
pt.y += 0.5 * height;
MGlobal::executeCommand(MString("cylinder -pivot ") + pt.x + " " + pt.y
+ " " + pt.z + " -radius 0.5 -axis 0 1 0 -heightRatio " + heightRatio);
}
}
return MS::kSuccess;
}
MStatus initializePlugin(MObject obj)
{
MStatus status;
MFnPlugin plugin( obj, "Viktor", "1.0");
status = plugin.registerCommand( "posts1", posts1Cmd::creator );
if (!status) {
status.perror("registerCommand");
return status;
}
return status;
}
MStatus uninitializePlugin(MObject obj)
{
MStatus status;
MFnPlugin plugin(obj);
status = plugin.deregisterCommand("posts1");
if (!status) {
status.perror("deregisterCommand");
return status;
}
return status;
}
В Visual Studio во вкладке Build, нажмите Build Solution.
При удачном завершении построения проекта будет следующая информация в поле Output:
Далее в Maya загружаем плагин.
Когда плагин загружен делаем следующие шаги:
1. Создаем Кривую(Curve).
2. Выделяем ее.
3. В коммандной строке вводим команду posts1.
П кривой расположаться пять колонн, количество которое указано в коде.
На этом первая часть статьи закончена ^^