PythonからMAYAにコマンドを送る記事を以前書きましたがもちろん他のプログラム言語でも可能です。
今回はC#からMAYAにコマンドを送ってみたいと思います。
内容は被りますが、C#の書き方を説明します。
MAYAを外部からコントロールできれば、他のDCCツールと連携をとる事が出来る。
他のツールと連携が取れたら、データのやり取りが自動化出来て楽になるし
スピードも上がる、間違いも減るし、何より作業効率が上がり負担も減る。
そこで今回は C#からMAYAにコマンド送ってキューブを一つ生成してみたいと思います。
|
commandPort()
MAYAはコマンドポートを開閉することが出来ます。
コマンドポートを開くと、クライアント プログラムがコネクトされるsocketを構成出来ます。
そして外部からMELコマンドを送るができます。
事前準備
MAYAのコマンドポートを開くにはMAYA上で以下のコマンドを実行する必要があります。
一度コマンドを実行するだけで良いのでC#の話に移る前に実行しておいてください。
MAYAのスクリプトエディタ(Script Editor)で以下を実行してください。
Python:
import maya.cmds
maya.cmds.commandPort(name='localhost:6000')
MEL:
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();
}
}
}
各コマンドの解説
MAYAに送るMELコマンドです。
System.Net.Sockets.NetworkStream mayastream;
socketオブジェクト
MAYAのコマンドポートとコネクトします
ローカルホストを指定してるので
mayaSocket.Connect(“localhost”, 6000);
でも大丈夫です。
データの送受信に使用するNetworkStream
mayacmd_str をASCIIにエンコードしてMAYAに送ります
コマンドをMAYAに送ります
ちなみに送れるコマンドはMELだけです。
コネクションを閉じます。
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#だとその問題も解決します。
環境を整備することは作品の為にも、働く人の為にも、とても大事なことだと思います。
是非とも試してほしいです。
少しでも有益な情報であればうれしいです。
月額定額制の完全オンライン・プログラミングスクール
「SAMURAI TERAKOYA(侍テラコヤ)」
・月々定額のサブスクで利用でき、入会金も不要、いつでも退会可能
・現役エンジニアの講師とマンツーマン・レッスンで疑問や悩みを解決
・オンラインで学べるので地方在住者でも受講可能
|
|
BTOパソコンの草分け的ブランドFRONTIER(フロンティア) 3DCG/動画編集/ゲーム用途に合わせてCPUやGPUなどパーツを自由に選べてコスパにもこだわる方にオススメ。 |
|
|
|