初心に戻って好きな戦国武将は斎藤義龍。
どうも、クリーク・アンド・リバー社 COYOTE CG STUDIO テクニカルチーム 戦国大好き人間の中林です。
しばらく間が空きましたが久々の更新です。
ただ今、COYOTEスタジオのTAチームでは随時チームの拡大を図っています。その結果、現時点での17人のTAが所属するチームになっています。
今後もチームとして拡大を目指してTAを募集しています。興味のある人はリンク先の募集要項を参照してください。
https://crdg.jp/recruit/3d-ta/
このチームの拡大に合わせて、TAチーム内で幾つかのルールが出来ました。
その中の1つに、MayaのツールはMelではなくPythonをメインに作成しようというルールがあります。
MayaのUIは基本的にMelコマンドを実行しています。
UIで操作した内容はそのままスクリプトエディタのヒストリにMelコマンドとして表示されます。ヒストリからコピペするだけで使えるMelはお手軽です。
コピーしてきたMelコマンドと同じ内容をPythonで実行する場合は、MelコマンドをPythonの文法でmaya.cmdsモジュールに書き換えてあげる必要があります。
Melからスクリプトを書き始めた初心者が少し苦労するポイントです。僕も最初は苦労をしました。
まあ、数回変更すれば自然に慣れるのですが、その数回の説明をする機会もまた増えたのでブログで紹介しようと思います。
いつものコマンドをPythonに変更
ls -sl
毎度おなじみのコマンドです。これをpythonに置き換えるとこんな感じになります。
import maya.cmds as cmds
cmds.ls(sl = True)
やってることは、
0・「import maya.cmds as cmds」でモジュールを追加。
1・Melのコマンドの前にcmdsを付ける。
2・フラグを()内に入れる。
3・ フラグのハイフンを消して「=」をつけてオン状態にする。
※フラグは基本的にはTrueを代入することが多いです。
Pythonコマンドで見ると普段何気なく使っているMelのコマンドは(一部例外を除いて)全てオフ状態でフラグを書き込むことでオン状態にしていることが分かります。
コマンドは慣れればフラグをオンして順番を変えるだけ
オン状態にするのにTrue以外の場合があります。
rootオブジェクトのヒエラルキー(子孫)のジョイント名を取得するlsコマンドで説明したいと思います。rootは良くあるオブジェクトの親の名前です。
ls -dagObjects -type "joint" "root";
import maya.cmds as cmds
cmds.ls('root', dagObjects = True, type = 'joint')
フラグへの代入でdagObjectsはTrueだけどtypeは”joint”なのはどうやって見分けるのか? これはごく単純でMelコマンドでフラグが連続しているかで見分けるだけです。
-dagObjectsの直後に-typeがあるので = True。
-typeは直後に”joint”という文字列があるので = “joint”。
僕は慣れるまではこの認識で大丈夫だと思っています。
前のコマンドには無かったのでここで追記すると、
4・オブジェクト名の位置を前にする。
Melコマンドでは最後にあることが多いけど、Pythonコマンドでは前の方にあることが多いです。よほど特殊なコマンド以外はオブジェクト名で始まるので、一番前に持ってくると説明してます。
良くある特殊コマンド
僕の中でPythonに移行して、良く迷う特殊コマンドの例はoptionVarです。
optionVar -iv "defaultTriangles" 4 -sv "defaultFileName" "buffalo.maya";
cmds.optionVar(iv = ('defaultTriangles', 4), sv = ('defaultFileName', 'buffalo.maya'))
迷う原因はフラグの後に要素が複数あるからです。これは素直にコマンドリファレンスでMelとpythonを見比べて確認をしてます。上記のようにリファレンスの内容を見比べると括弧と位置が分かります。
MelとPythonのコマンドリファレンスにはスクリプトエディタのリファレンスからHPに飛べます。
僕個人の話だけどPythonに移行してからはoptionVarの使い方を覚えていないので、必要な時に毎回調べてます。これは変数の外部記憶はJSONに頼って、optionVarを使う機会が無くなったからです。
Pythonで作成するメリットは充実したPythonコマンドが活用できる部分だと僕は思っています。
Melスクリプトの簡単な対応
以前のブログでも説明をした通りMelスクリプトがログに表示されることが多いです。この場合は素直にmel.evalでMelスクリプトを実行するのが簡単です。
createRenderNodeCB -asShader "surfaceShader" lambert "";
import maya.mel as mel
mel.eval('createRenderNodeCB -asShader "surfaceShader" lambert ""')
これで気を付けないといけないのが、Pythonは'(シングルクォーテーション)と”(ダブルクォーテーション)の両方が併用でるけど、Melではダブルクォーテーションしか使えません。
import maya.mel as mel
mel.eval("createRenderNodeCB -asShader 'surfaceShader' lambert ''")
# エラー: RuntimeError: file <maya console> line 2: MEL スクリプトの実行時にエラーが発生しました
あくまでmel.evalの文字列の中身はMelなのでこの場合はエラーになります。
逆に普段は書きませんが、ダブルクォーテーションだけでも次の場合には上手くいきます。
import maya.mel as mel
mel.eval("createRenderNodeCB -asShader \"surfaceShader\" lambert \"\"")
慣れるまでのひと時に活用してください
今回は超初心者向けの内容ですが、同時にMayaでPythonを始める人に良く聞かれる事です。
数回繰り返せば自然に変更できるようになってます。
たまにコマンドリファレンスを読む必要はあるけど、それはMelでも同じです。
それでも、MayaのMelからPythonに入る人は多いので、僕の初心を振り返りつつ最初の1歩の踏み台になればと思います。