Pythonスクリプトを使ってMAYAを外部から操作する方法


MAYAを外部から操作したりコマンドを実行したいと思いませんか。

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

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


PythonスクリプトをPhotoshopのメニューから実行する方法[Windows限定]

commandPort()

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

事前準備

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

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

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

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

Pythonスクリプト

createCube_maya.py
キューブが一つ生成されるpythonスクリプトを書いて保存しました。

import sys
import socket

mayaSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

try:
    mayaSocket.connect(('127.0.0.1', 6000))
except socket.error:
    print ' ERROR: Maya commandPort is not open.  '
    sys.exit()

cmd_mel = '''polyCube -w 10 -h 10 -d 10 -ax 0 1 0 ;'''

mayaSocket.send(cmd_mel)

mayaSocket.close()

各コマンドの解説

import sys
import socket
sysモジュールとsocketモジュールをインポートします。

mayaSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socketオブジェクト

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

sys.exit()
MAYAのコマンドポートが開いてない場合はエラー
そしてMAYAコマンドを送れないのでsysを終了させてます。

cmd_mel = ”’polyCube -w 10 -h 10 -d 10 -ax 0 1 0 ;”’
キューブを一つ生成する MELコマンド
ちなみに送れるコマンドはMEL出なければいけません。

mayaSocket.send(cmd_mel)
コマンドをMAYAに送ります。
送れるコマンドはMELのみです。

mayaSocket.close()
コネクションを閉じます。

Pythonスクリプトの実行

createCube_maya.pyを実行します。

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

応用

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

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

cmd_mel = 'polySphere -r 10 -sx 12 -sy 12;'

mayaSocket.send( cmd_mel)

複数のスフィアを生成

for i in range(4):
    for ii in range(3):
        cmd_mel = 'sphere -p %i 0 %i;' % (i * 3, ii * 3)
        mayaSocket.send( cmd_mel)

ポリゴンシリンダーの軸をランダムに生成
MELコマンド部分をPythonで記述しました。

import random
cylinder_ax_x = random.randrange(10)
cylinder_ax_z = random.randrange(10)

cmd_mel = '''
python("import maya.cmds as cmds");
python("cmds.polyCylinder(r=3, h=5, ax=('%s' ,1 ,'%s'))"); ''' % (cylinder_ax_x,cylinder_ax_z)

mayaSocket.send( cmd_mel)

まとめ

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

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

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

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

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


Twitter Facebook Pocket LINE はてブ

おすすめの関連記事:
コチラの記事も読まれています
あわせてよく読まれている記事