Maya C++ プラグインの作成(windows)

本投稿では、Windows向けMayaのプラグインをC++言語(Visual Studio Community)で開発するための導入手順を紹介します。ここでは、短いメッセージを出力する機能のみ備えた、簡単なカスタムMELコマンドを開発するものとします。なお、開発・テスト環境は次に示す環境を前提とします。

  • Maya 2020 Update 2(Windows 10用、英語版)
  • Windows 10 Professional (2022月2月時点での最新版アップデート適用済)
  • Visual Studio Community 2022 (2022月2月時点での最新版アップデート適用済)

ビルド環境の設定

Visual Studio Communityのインストール

Maya 2020のヘルプに記載のとおり、Mayaの各バージョンごとに必要なVisual Studio(以降、VSと略記)のバージョンが異なります。たとえばリンク先に記載のとおり、Maya 2020ではVS2017が必要とされています。ただ、VS Community 2022のような最新バージョンのVSであっても、VS2017と同等のビルド環境を利用できます。言い換えれば、VS2017の製品版をインストールすることなく、VS Community 2022のオプション設定によって必要なビルド環境を整えられます。

まず、Visual Studio Toolsのダウンロードページから、VS Communityを無料ダウンロードします。

 

VS Communityのインストーラを実行して進めていくと、イストールするコンポーネントを選択する画面が表示されます。ここで、「C++によるデスクトップ開発」にチェックを入れ、さらに「MSVC v141 – VS 2017 2017 C++ x64/x85 ビルドツール(v14.16)」にチェックします。これで、VS Community 2022でもVS2017互換のビルド環境が追加されます。

 

オプション:Windows SDKの追加

個人の研究開発や独習においては必須ではありませんが、Mayaプラグイン開発にあたっては、予期しないエラーをできるだけ回避するために、Windows SDKのバージョンを統一しておくことが望ましいです。まず、Web検索などに頼ってMayaのビルド環境を調べます。基本的には Around the Corner というブログに行き当たることになります。例えばMaya 2020についてはMaya 2020 API update guideという投稿に記載されています。この情報によると、Maya 2020.2 は Windows SDK Version 10.0.10586.0 を用いてビルドされていることがわかります。

次に、同一バージョンの Windows SDK をインストールします。Windows SDK とエミュレーターのアーカイブのページを見ると、Windows 10 SDK (10.0.10586.212) という下三桁だけが異なるWindows SDKが見当りますので、こちらをインストールします。なお、下三桁はバグ対応といったマイナーアップデート番号に対応しますので、この番号が異なってもSDKの仕様に差異はありません。

 

Maya Developer Toolkitの導入

Maya デベロッパー センターから、Mayaのバージョンに対応する開発キットをダウンロードします。ここではMaya 2020.2に対応する「Maya 2020 Update 2 win64 DevKit」をダウンロードします。

 

ダウンロード後は、Mayaヘルプに記載の手順にしたがって圧縮ファイルの展開、フォルダ作成、環境変数の設定等を行います。


プラグインの開発

プロジェクトの設定

VS Community 2022を用いてプラグインを作成します。まず、新しいプロジェクトを作成します。

 

プラグインはDLL(ダイナミックリンクライブラリ)として作成する必要があり、また今回はC++言語を用いて実装しますので、下記のC++ DLLテンプレートを選択します。

 

プロジェクト名を設定します。ここで設定したプロジェクト名はプラグインファイル名に対応します(あとから変更可能)。

 

生成されたプロジェクトのオプションを設定します。まず、全般タブにおいて次のとおり設定します。なお、プロジェクト作成直後は下記画像とは異なる項目・レイアウトが表示されますが、プラットフォームツールセット切り替え後に「適用」ボタンを押すことで、下記画像の外観に切り替わります。

  • 「プラットフォームツールセット」を Visual Studio 2017 (v141) に変更
  • 「ターゲットの拡張子」を .mll に変更
  • (オプション)「Windows SDK バージョン」を 10.0.10586.0 に変更
 

次に、「C/C++」-「全般」-「追加のインクルードディレクトリ」に下記の2フォルダを追加します。

  • <Mayaのインストールフォルダ>\include
    • ここではインストールフォルダは C:\Program Files\Autodesk\Maya2020
  • <Maya開発キットのインストールフォルダ>\include
    • ここではインストールフォルダは C:\Users\mukai\devkitBase
 

続いて、「リンカー」-「全般」-「追加のライブラリディレクトリ」に下記の2フォルダを追加します。

  • <Mayaのインストールフォルダ>\lib
  • <Maya開発キットのインストールフォルダ>\lib
 

最後に、「リンカー」-「入力」-「追加の依存ファイル」に下記の2ファイルを追加します。

  • OpenMaya.lib
  • Foundation.lib

なお、使用するMaya APIによってはOpenMayaAnim.libOpenMayaUI.libなど、その他のライブラリの指定も必要になります。

 

以上でプロジェクトの設定は完了です。

コーディング

続いて、DLLプロジェクト作成時に自動生成されている dllmain.cpp ファイルの中身を書き換えることで、プラグインの動作をコーディングします。ここでは、PrintTest という名称のカスタムMELコマンドを作成する例を示します。PrintTestコマンドは、”Custom Command Test” というメッセージを出力するだけの簡単なコマンドで、下記のコードで実現できます。

まず、PrintTestクラスにコマンドの動作を記述しています。MELコマンドに対応するクラスは、MPxCommandクラスをpublic継承したうえで、doItメソッドをオーバーライドしてその中に動作を記述する必要があります。ここでは、doItメソッド内にメッセージを出力するコードを MGlobal::displayInfo関数を用いて実装しています。

次に、initializePlugin関数とinitializePlugin関数を実装します。これらはMaya本体にプラグインがロード/アンロードされた際の動作を決定する関数で、ここではカスタムMELコマンドをMayaに登録/解除するコードを記述しています。initializePlugin関数では、プラグインを操作するための関数セットであるMFnPlugin型のpluginを介し、registerCommandメソッドを用いてPrintTestコマンドを登録しています。第一引数”PrintTest”が実際のコマンド名に対応しており、第二引数ではコマンドクラスをインスタンス化する関数を指定しています(ここではラムダ式を用いて実装しています)。一方、uninitializePlugin関数では、deregisterCommandメソッドを通じてPrintTestコマンドを登録解除しています。

インストール

以上の手順でプロジェクト設定とコーディングを行った上で、DebugかReleaseのいずれかでプロジェクトをビルドします。そして、ビルドしたプラグインファイルを、Mayaが認識できるフォルダにコピーします。ここではHelloMayaPluginフォルダ内、x64 – Release に生成されているHelloMayaPlugin.mllファイルを、Maya2020のヘルプを参考に、<Maya開発キットのフォルダ>\plug-ins フォルダにコピーしています。

 

続いてMayaを起動し、「Windows」メニューから「Settings/Preferences」-「Plug-in Manager」を開き、<Maya開発キットのフォルダ>\plug-ins にグループ分けされている HelloMayaPlugin.mll の「Loaded」にチェックを入れ、プラグインをロードします。

 

最後に、MayaのScript Editorにおいて、PrintTest コマンド(MEL)を実行し、出力ウィンドウ内に「Custom Command Test」というメッセージが出力されることを確認します。


まとめ

シンプルなカスタムMELコマンドを題材として、Windows用Maya向けのプラグインをC++言語で開発するための環境構築方法を説明しました。ここではカスタムコマンドのみ扱いましたが、VSプロジェクトの設定方法などについてはカスタムノードの開発等においても共通点が多いと思います。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.