C#を使ってMAYAを外部から操作する方法


PythonからMAYAにコマンドを送る記事を以前書きましたがもちろん他のプログラム言語でも可能です。
今回はC#からMAYAにコマンドを送ってみたいと思います。

内容は被りますが、C#の書き方を説明します。

MAYAを外部からコントロールできれば、他のDCCツールと連携をとる事が出来る。
他のツールと連携が取れたら、データのやり取りが自動化出来て楽になるし
スピードも上がる、間違いも減るし、何より作業効率が上がり負担も減る。

そこで今回は C#からMAYAにコマンド送ってキューブを一つ生成してみたいと思います。

commandPort()

MAYAはコマンドポートを開閉することが出来ます。
コマンドポートを開くと、クライアント プログラムがコネクトされるsocketを構成出来ます。
そして外部からMELコマンドを送るができます。

事前準備

MAYAのコマンドポートを開くにはMAYA上で以下のコマンドを実行する必要があります。
一度コマンドを実行するだけで良いのでC#の話に移る前に実行しておいてください。

MAYAのスクリプトエディタ(Script Editor)で以下を実行してください。

import maya.cmds
maya.cmds.commandPort(name='localhost:6000')
commandPort -nr -n "localhost:6000";

MAYA側の事前準備はこれで整いました。
ちなみにポート(TCPポート)の番号は1024より大きい空いている数字を指定してください。
今回は6000にしてます。

C#

createCube_maya.cs という名前でC#ファイルを保存しました。

キューブが一つ生成されます。

namespace createCube_maya
{
    class Program
    {
        static void Main(string[] args)
        {
            string mayacmd_str = "polyCube -w 10 -h 10 -d 10 -sx 2 -sy 2 -ax 0 1 0 ;";

            System.Net.Sockets.TcpClient mayaSocket = new System.Net.Sockets.TcpClient();
            System.Net.Sockets.NetworkStream mayastream;
            mayaSocket.Connect("127.0.0.1", 6000);

            mayastream = mayaSocket.GetStream();

            byte[] myWriteBuffer = Encoding.ASCII.GetBytes(mayacmd_str);//MEL command
            mayastream.Write(myWriteBuffer, 0, myWriteBuffer.Length);

            mayaSocket.Close();
            mayastream.Close();
        }
    }
}

各コマンドの解説

string mayacmd_str = “polyCube -w 10 -h 10 -d 10 -sx 2 -sy 2 -ax 0 1 0 ;”;

MAYAに送るMELコマンドです。

System.Net.Sockets.TcpClient mayaSocket = new System.Net.Sockets.TcpClient();
System.Net.Sockets.NetworkStream mayastream;

socketオブジェクト

mayaSocket.Connect(“127.0.0.1”, 6000);

MAYAのコマンドポートとコネクトします
ローカルホストを指定してるので
mayaSocket.Connect(“localhost”, 6000);
でも大丈夫です。

mayastream = mayaSocket.GetStream();

データの送受信に使用するNetworkStream

byte[] myWriteBuffer = Encoding.ASCII.GetBytes(mayacmd_str);//MEL command

mayacmd_str をASCIIにエンコードしてMAYAに送ります

mayastream.Write(myWriteBuffer, 0, myWriteBuffer.Length);

コマンドをMAYAに送ります
ちなみに送れるコマンドはMEL出なければいけません。

mayaSocket.Close();

コネクションを閉じます。

mayastream.Close();

NetworkStreamを閉じます。

C#を実行

createCube_maya.csを実行します。

ポリキューブが生成されました

MAYAにキューブが生成されたら成功です。

応用 MELコマンドを変更

送るMELコマンドを変えてみます。

ポリゴンのスフィアを生成

string mayacmd_str = "polySphere -r 10 -sx 16 -sy 16;";
ポリキューブ生成
スフィアが生成されました。

ポリゴンシリンダーの軸をランダムに生成

MAYAに送るコマンドをpythonで記述しました。
ランダムの処理はC#で書いて、その数値を “python(“Pythonコード”)” に文字列にして入れました。

namespace createCube_maya
{
    class Program
    {
        static void Main(string[] args)
        {
            string mayacmd_str = melcommand1();
            System.Net.Sockets.TcpClient mayaSocket = new System.Net.Sockets.TcpClient();
            System.Net.Sockets.NetworkStream mayastream;
            mayaSocket.Connect("127.0.0.1", 6000);
            mayastream = mayaSocket.GetStream();

            byte[] myWriteBuffer = Encoding.ASCII.GetBytes(mayacmd_str);//MEL command
            mayastream.Write(myWriteBuffer, 0, myWriteBuffer.Length);

            mayaSocket.Close();
            mayastream.Close();
        }
        static string melcommand1()
        {
            Random rnd = new Random();
            string ax_x = rnd.Next(0, 10).ToString();
            string ax_y = rnd.Next(0, 10).ToString();
            string ax_z = rnd.Next(0, 10).ToString();

            string mayacmd = "python(\"import maya.cmds as cmds\");"
            + "python(\"cmds.polyCylinder(r=3, h=5, sy=2 ,ax=(" + ax_x + " ," + ax_y + " ," + ax_z + "))\");";
            return mayacmd;
        }
    }
}
ポリシリンダーが生成
ポリゴンシリンダーが生成されました

まとめ

MAYAを外部から操作したりコマンドを実行したり出来ると非常に便利です。

C#で計算して結果をMAYAに送り実行させたり
MAYAと他のツールとを連携させたり、
連動させてツール間の見栄えの違いを同時に確認したりと、
開発効率が劇的に変わる可能性があります。

MAYAとPhotoshop
MAYAとゲームエンジン
MAYAとスカルプトツール
MAYAと3dsMax


様々な組み合わせで開発環境が良くなる事が考えられます。

そしてPythonではなくC#の利点として、開発等をチームでする場合、Pythonだと他の人に配布しにくい状況だったりしますが、C#だとその問題も解決します。

環境を整備することは作品の為にも、働く人の為にも、とても大事なことだと思います。
是非とも試してほしいです。

少しでも有益な情報であればうれしいです。