C++ для Maya

Часть 1. Создание нового проекта и настройка зависимостей.

Написание первого плагина.

Внимание! Данной статьей я не хочу когото научить, но только делюсь своим опытом и наработками.

Почти вся информация по настройки проекта была взята из видео:

Запускаем Visual Studio и в появившемся окне выбираем Продолжить без кода(Continue without code).

Screenshot 2022-10-24 192146.jpg

Затем, в выпадающем окне Языки(Languages) выбираем C++ и опцию Пустой проект(Empty Project). Жмем Далее.

Screenshot 2022-10-24 194500.jpg

В следующем окне указываем имя проекта и путь куда ваш проект будет сохранен. Жмем кнопку Создать.

Screenshot 2022-10-24 194720.jpg

Нажимаем правой кнопкой мыши на PostsCmd1. В всплывающей вкладке выбираем Добавить(Add) Новый предмет(New Item).

Screenshot 2022-10-24 194840.jpg

В диалоговом окне выбираем C++ File и задаем имя PostsMain. Жмем Добавить(Add).

Screenshot 2022-10-24 195041.jpg

Так как наша Maya имеет архитектуру 64bit то мы удалим х86 архитектуру из нашего проекта.
Нажимае правой кнопкой мыши на PostsCmd1 и в всплывающем окне выбираем Характеристики(Properties). Затем переходим в Менеджер конфигурации(Configuration Manager).

Screenshot 2022-10-24 195220.jpg

Screenshot 2022-10-24 195330.jpg

Во вкладке Платформа Активных решений(Active Solution Platform) выбираем Редактировать(Edit). Далее выбираем х86 и удаляем с помощью кнопки Remove. Затем, переименовываем х64 на Maya2023_64Bit. В всплывающем окне подтверждаем кнопкой Да(Yes), а затем закрываем окно Редактирование Платформу Решений(Edit Solution Platform) кнопкой Закрыть(Close).

Screenshot 2022-10-24 195421.jpg

Screenshot 2022-10-24 195523.jpg

Screenshot 2022-10-24 195703.jpg

Поскольку плагин в основном представляет собой динамически связанные библиотеки, нам нужно установить тип конфигурации как .dll. Так же выберем ISO C++ 17Standart (/std:c++17).

Screenshot 2022-10-24 195844.jpg

Screenshot 2022-10-24 200047.jpg

Screenshot 2022-10-24 200047.jpg

Итак, во вкладке 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

Screenshot 2022-10-24 200219.jpg

Затем выберите раздел C/C++ на левой панели, Общие(General) -> Дополнительные включаемые каталоги(Additional Include Directories) и выберите включаемую папку из установочного каталога Maya devKit.

Screenshot 2022-10-24 200329.jpg

Screenshot 2022-10-24 200419.jpg

Screenshot 2022-10-24 200456.jpg

Screenshot 2022-10-24 200554.jpg

Необязательный шаг: если вы хотите ускорить процесс компиляции и у вас многоядерный процессор, я бы порекомендовал активировать настройку многопроцессорной компиляции из того же раздела Общие(General) -> Многопроцессорная компиляция(Multi-processor Compilation) -> Выберите Да (/MP)(Yes(/MP)).

Screenshot 2022-10-24 200723.jpg

Затем выберите связанный раздел на левой панели, выберите Общие(General) -> Дополнительные каталоги библиотек(Additional Library Directories) и выберите папку lib из установочного каталога Maya devKit.

Screenshot 2022-10-24 200855.jpg

Screenshot 2022-10-24 200930.jpg

Screenshot 2022-10-24 201027.jpg

Screenshot 2022-10-24 201110.jpg

Затем выберите раздел ввода из того же раздела компоновщика и добавьте в разделе Дополнительные зависимости(Additional Dependencies) следующие библиотеки:

Основные библиотеки:
* OpenMaya.lib
* Foundation.lib

Если вы разрабатываете плагины, использующие другие модули Maya, их также необходимо включить.

Дополнительные библиотеки:
* OpenMayaAnim.lib
* OpenMayaFX.lib
* OpenMayaRender.lib
* OpenMayaUI.lib

Screenshot 2022-10-24 201222.jpg

Screenshot 2022-10-24 201553.jpg

Поскольку типом конфигурации проекта является DLL, эти функции входа необходимы для его инициализации и деинициализации из хост-приложения, в данном случае Maya.
Выберите раздел Командная строка(Command Line) в том же разделе Компоновщик(Linker) и введите их в текстовое поле Дополнительные параметры(Additional Options).
/export:initializePlugin /export:uninitializePlugin

Screenshot 2022-10-24 201936.jpg

Во вкладке Конфигурации(Configuration) Debug добавьте:


UNICODE
WIN32
_DEBUG

Screenshot 2022-10-24 202146.jpg

Screenshot 2022-10-24 202311.jpg

Теперь сделайте то же самое для Конфигурации(Configuration) Release и добавьте:

UNICODE
WIN32
NDEBUG

Screenshot 2022-10-24 202449.jpg

Screenshot 2022-10-24 202553.jpg

После того, как все настроено правильно. Закройте диалоговое окно конфигурации.

На этом настройка проекта завершена. Теперь давайте напишем наш первый плагин для 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:

Screenshot 2022-10-24 202742.jpg

Далее в Maya загружаем плагин.Screenshot 2022-10-24 203554.jpg

Когда плагин загружен делаем следующие шаги:
1. Создаем Кривую(Curve).
2. Выделяем ее.
3. В коммандной строке вводим команду posts1.
П кривой расположаться пять колонн, количество которое указано в коде.

На этом первая часть статьи закончена ^^

664 0 850 7
4
2022-10-26
ну афигительно. вспомнил юношество. раньше только и читал здесь
2022-10-26
Григорий Филиповну афигительно. вспомнил юношество. раньше только и читал здесь

Спасибо за комент и оценку! А сейчас где читаеш? Соц. сети? Куда народ то пропал....?
2022-10-27
Виктор Ди (рико)
Спасибо за комент и оценку! А сейчас где читаеш? Соц. сети? Куда народ то пропал....?

Виктор, завтра ставим ваш пост в соц.сети 65 000 подписчиков и рассылку 100 000 адресов в понедельник, но нужно понимать, что у народа сейчас сложный период.
2022-10-27
Moderator
Виктор, завтра ставим ваш пост в соц.сети 65 000 подписчиков и рассылку 100 000 адресов в понедельник, но нужно понимать, что у народа сейчас сложный период.

Спасибо за поддержку.
RENDER.RU