はじめまして。COYOTE 3DCG STUDIO TAのやまたくです。
今回は簡単なツール開発を行いながらコマンド調査のテクニックを解説します。
私が初めてツールを作成した時、
「コマンドの調べ方がわからない!!」
と困っていたので、これからツール作成を始める方のお役に立てれば嬉しいです。
想定読者
- ツール作成に興味があり、MEL,Pythonを始めたばかりの方
- ツールを作ってみたいが、どうやって作ればいいか分からない方
特に、「コマンドの調べ方がわからない!!」という点を中心に解説します。
作成するツール
依頼者から、
「アセットのエクスポート、インポートを楽にできるようにしたい」
と要望を頂きました。UIにエクスポートボタン、インポートボタンがあれば良いそうです。
完成イメージ
それではさっそく、ツール制作に移って行きましょう!
制作の流れ
- 作業手順確認
- 技術検証
- ツール作成
- ツールの改良
作業手順確認
依頼者にどのような手順でエクスポート、インポートしているのかを確認します。
- オブジェクトを選択し、File>Export Selection。 デフォルト設定のまま書き出し。
- File>import 読み込み。
Remove duplicate shading networks にチェック
Maerge into selected namespace and rename incoming objects that match にチェック
では次に作業手順をコードに落とし込めるのか技術検証をしていきます!
技術検証
①Mayaでコマンドを実行、Script Editorで確認
File>Export Selectionコマンドを実行すると、
Script Editor上半分の履歴ペインに下記のコマンドが表示されます。
file -force -options "v=0;" -typ "mayaBinary" -pr -es ""保存先パス"";
Script Editor下半分の入力ペインに先ほどのコマンドをコピペします。
上図、水色の文字列(file)がMaya独自のコマンドです。
②fileコマンドをドキュメントで確認
Maya独自のコマンドをドキュメントで確認します。
help>MEL command help を開く。
検索フォームに「file」と入力。
fileコマンドのドキュメントページが出てきました!
先ほどのMELコマンドのfile以下に「-」がついている文字列は「フラグ」です。
次はドキュメントからfileコマンドのフラグを確認します。
③フラグの意味を一つずつ確認
-
-force:
アクションを強制的に実行させます。 -
-options:
現在設定されているファイル オプションを設定/照会します。 -
-type(-typ):
このファイルのタイプを設定します。 -
-preserveReferences(-pr):
このようなリファレンスがコピーとしてではなく、実際のリファレンスとして読み込み/書き出しされるように、さまざまな読み込み/書き出しフラグを変更します。 -
exportSelected(-es):
選択したオブジェクトを指定したファイルに書き出します。
試しにFile>Export Selectionのオプションを開き、
「Preserve references」のチェックを外して書き出すと、
-prフラグがなくなっていることが確認できました。
ん? 「include Options」のHistory等のフラグが見当たりませんが、
反映されているのでしょうか?
確認していきます。
今度は「include Options」のチェックを全て外して書き出してみます。
file -force -options "v=0;" -typ "mayaBinary" -pr -es ""保存先パス"";
結果は先ほどの書き出しコマンドと同じでした。
では、チェックを外したまま書き出しコマンドを実行してファイルを開いてみます。
History、Textureがない状態で書き出されています。
どうやら、「include Options」のフラグを調べて追加してあげる必要がありそうです。
④include Options フラグを追加
fileコマンドのフラグを確認していきます。
「include Options」の一つである「History」で文字列検索してみましょう。
-constructionHistory というフラグが見つかりました!
- -constructionHistory(-ch):
exportSelected と一緒に使用し、アタッチされたコンストラクション ヒストリを書き出しに含めるかどうかを指定します。
先ほどの書き出しコマンドに-chを追加して、ヒストリが含まれるか確認します。
せっかくですので、Pythonコマンド化して実行してみましょう!
MELからPythonへのコマンド変換はこちらの記事に詳細が書かれています。
cmds.file(""保存先パス"", force=True, options="v=0;", typ="mayaBinary", pr=True, es=True, ch=True)
ヒストリ付きでの書き出しができました!
では同様に他のフラグも追加していきましょう!
- -channels(-chn)
- -expressions(-exp)
- -constraints(-con)
- -shader(-sh)
Pythonコマンドは下記の様になります。
cmds.file(""保存先パス"", force=True, options="v=0;", typ="mayaBinary", pr=True, es=True, ch=True, chn=True, exp=True, con=True, sh=True)
⑤importを検証
まずはFile>importをデフォルト設定で実行し、コマンドを確認します。
file -import -type "mayaBinary" -ignoreVersion -ra true -mergeNamespacesOnClash false -namespace "hoge" -options "v=0;p=17;f=0" -pr -importTimeRange "combine” “保存先パス”;
次に、
- 「Remove duplicate shading networks 」にチェック
- 「Maerge into selected namespace and rename incoming objects that match」 にチェック
再度File>importを実行します。
file -import -type "mayaBinary" -ignoreVersion -ra true -rdn -mergeNamespacesOnClash true -namespace ":" -options "v=0;p=17;f=0" -pr -importTimeRange "combine" “保存先パス”;
コマンドの差分を抽出すると、下記の様になりました。
- -rdn
- -mergeNamespacesOnClash true -namespace ":"
先ほどと同じ手順で、コマンドのフラグを確認していきましょう!
⑥フラグの意味を一つずつ確認
-
-import:
指定したファイルを読み込みます。 -
-type(-typ):
このファイルのタイプを設定します。 -
-ignoreVersion:
正式にサポートされているバージョンより前または後のバージョンのファイルを開くために使用します。 -
-renameAll(-ra):
true の場合、既存のノードとクラッシュする名前のノードだけでなく、新たに作成されたすべてのノードの名前を変更します。 -
-removeDuplicateNetworks(-rdn):
これを設定すると、読み込まれたネットワークと同じネットワークが現在のシーンで検出された場合に、読み込まれたネットワークを除去します。 -
-mergeNamespacesOnClash:
mergeNamespacesOnClash が true の場合、既存の「ref」というネームスペースは再利用されて pSphere1 はこの既存のネームスペースに移動されます。このネームスペースに「pSphere1」という名前のオブジェクトがさらにある場合、読み込まれたものは数字が増分され(「pSphere2」)名前変更されます。 -
-namespace:
読み込みと参照中に、すべてのオブジェクトをグループ化するために使用されるネームスペース名です。 -
-options:
現在設定されているファイル オプションを設定/照会します。 -
-preserveReferences(-pr):
このようなリファレンスがコピーとしてではなく、実際のリファレンスとして読み込み/書き出しされるように、さまざまな読み込み/書き出しフラグを変更します。 -
-importTimeRange:
タイム レンジを読み込み、文字列によって指定される 3 つの異なる方法のうちの 1 つの方法で Maya の再生範囲に適用するために使用します。
今回は設定の変更が反映されている様なので、
importコマンドをPythonへ変換して実行してみましょう!
cmds.file(""保存先パス"", i=True, type="mayaBinary", ignoreVersion=True, ra=True, rdn=True, mergeNamespacesOnClash=True, namespace=":", options="v=0;p=17;f=0", pr=True, importTimeRange="combine")
想定通りにimportが行われました!
設定をデフォルトに戻したり、様々なファイルをimportして動作確認を行います。
おや?デフォルト設定に戻すと「removeDuplicateNetworks」が機能しなくなってしまいました。
⑦原因を調査
「removeDuplicateNetworks」が機能しなくなった原因を調査していきたいと思います。
調査する際のコツは、機能した時としなかった時の差を比較することです。
デフォルトとの差は何か…、
-
「Remove duplicate shading networks」にチェック
-
「Maerge into selected namespace and rename incoming objects that match」 にチェック
では「Remove duplicate shading networks」に再びチェックを入れ、
File>importコマンドを実行します。
「removeDuplicateNetworks」が機能しました!
どうやらチェックのON,OFFに関係がありそうです。
「removeDuplicateNetworks」フラグの説明を注意深く確認します。
- -removeDuplicateNetworks(-rdn):
optionVar removeDuplicateShadingNetworksOnImport を 0 に設定すると(またはファイル > オプションの読み込み(File > Import options)から重複したシェーディング ネットワークの除去(Remove duplicated shading networks)オプションを無効にする)、このフラグによる削除からシェーディング ネットワークが除外されます。
この文言が怪しそうです。
どうすればoptionVarの値を取得できるのでしょうか?
分からないことはWEB検索をします。「maya optionVar 取得」などで検索してみます!
弊社のブログがありましたので読んでみます。
Melのglobal変数とoptionVarでメニューの値を保存
なるほど、optionVar -q "名前”で取得できるようです。取得してみましょう!
optionVar -q "removeDuplicateShadingNetworksOnImport"
「Remove duplicate shading networks 」にチェックなし, 0
「Remove duplicate shading networks 」にチェックあり, 1 が帰ってきました。
import直前に、
optionVar "removeDuplicateShadingNetworksOnImport”を1にして実行するように変更します。
optionVarに整数を入れたい場合、
optionVar -iv "名前" 整数;
と入力します。Python化して実行してみましょう!
cmds.optionVar(iv=('removeDuplicateShadingNetworksOnImport', 1))
cmds.file(""保存先パス"", i=True, type="mayaBinary", ignoreVersion=True, ra=True, rdn=True, mergeNamespacesOnClash=True, namespace=":", options="v=0;p=17;f=0", pr=True, importTimeRange="combine")
想定通りにimportが行われました!
問題なさそうなので、技術検証の次はツールの作成に取り掛かります!
ツール作成
①UI作成
UIの作成についてはまだでしたので、作成方法を調べておきたいと思います!
WEBで「maya python UI」「maya mel UI」などと検索します。
ボタン2つのUIは下記のスクリプトで生成できます。
toolWindow = cmds.window(title="toolWindow")
cmds.columnLayout(adjustableColumn=True, parent=toolWindow)
cmds.button(label="Export", command="export関数()")
cmds.button(label="Import", command="import関数()")
cmds.showWindow(toolWindow)
cmds.buttonの「command」フラグで自作関数を呼び出せます。
UIについては、ボタンの間隔が近く操作しづらいので、スペースとサイズ調整をします。
windowコマンド、columnLayoutコマンド、buttonコマンドのフラグを一つずつ確認していき、
目的に合いそうなフラグを試していきます。
探した結果、
columnLayoutの「rowSpacing」フラグ、
buttonの「height」フラグを使用しました!
toolWindow = cmds.window(title="toolWindow")
cmds.columnLayout(adjustableColumn=True, rowSpacing=5, parent=toolWindow)
cmds.button(label="Export", command="export関数()", height=40)
cmds.button(label="Import", command="import関数()", height=40)
cmds.showWindow(toolWindow)
②エクスポート、インポート関数作成
技術検証したコマンドを関数化します!
(保存先は仮で"C:/Windows/Temp/ExportImportObjects.mb”を指定)
def exportObjcts():
cmds.file("C:/Windows/Temp/ExportImportObjects.mb", force=True,
options="v=0;", typ="mayaBinary", pr=True, es=True,
ch=True, chn=True, exp=True, con=True, sh=True)
def importObjcts():
cmds.optionVar(iv=('removeDuplicateShadingNetworksOnImport', 1))
cmds.file("C:/Windows/Temp/ExportImportObjects.mb", i=True,
type="mayaBinary", ignoreVersion=True, ra=True, rdn=True,
mergeNamespacesOnClash=True, namespace=":", options="v=0;p=17;f=0",
pr=True, importTimeRange="combine")
③UIと関数を合体
UIと関数を合体させてMaya上で確認します!
toolWindow = cmds.window(title="toolWindow")
cmds.columnLayout(adjustableColumn=True, rowSpacing=5, parent=toolWindow)
cmds.button(label="Export", command="exportObjcts()", height=40)
cmds.button(label="Import", command="importObjcts()", height=40)
cmds.showWindow(toolWindow)
def exportObjcts():
cmds.file("C:/Windows/Temp/ExportImportObjects.mb", force=True,
options="v=0;", typ="mayaBinary", pr=True, es=True,
ch=True, chn=True, exp=True, con=True, sh=True)
def importObjcts():
cmds.optionVar(iv=('removeDuplicateShadingNetworksOnImport', 1))
cmds.file("C:/Windows/Temp/ExportImportObjects.mb", i=True,
type="mayaBinary", ignoreVersion=True, ra=True, rdn=True,
mergeNamespacesOnClash=True, namespace=":", options="v=0;p=17;f=0",
pr=True, importTimeRange="combine")
ボタンを押すとエクスポートとインポートが行われました!
まだまだ不十分な箇所はありますが、依頼者に確認してもらいます!
ツールを改良
ツールは作成したら終了ではありません。
使ってもらいながら不便な所を継続して改良していかなければ、
「せっかく作ったのに使われていない…」と言う結果になってしまいます。
(ツールを継続的に改良する大切さはこちらの記事でも紹介しています)
Photoshop内製ツール紹介『CRPS_指定ファイル保存』
本ツールも意見をもらいながら改良していき、現在は下記の様になりました。
- アセットを数種類読み込みたいので、ボタンを追加。
- 何をエクスポートしたか分からなくなるので、ボタンラベルにオブジェクト名を表示。
- エクスポートのパターンとして、
「選択したオブジェクトをrootに置きたい」場合と
「階層はそのままで良い」場合があるのでエクスポート設定を追加。
簡単ではありますがツール制作の流れは以上です。
コマンド調査テクニック補足
●Maya上で調べる
①Script Editorを開きコマンドを実行。
- ポイント1.一度undoしてコマンドを確認。
- ポイント2.ヒストリ>すべてのコマンドをエコー(history>Echo All Commands)にチェックを入れる。
詳細記事はこちら→表示されないMelコマンドを知る方法:初心者編
②コマンドをドキュメントで確認。
フラグや一番下の例からコマンドを理解していきます。
–ドキュメントを検索しても見つからない場合…
③whatIs “検索したいコマンド” でMELスクリプトパスが出てくるので、
MELソースコードを確認。
詳細記事はこちら→表示されないMelコマンドを知る方法:中級編
–「Run Time Command」と出た場合
④Windows>settings/preferences>Hotkey Editorを開き、コマンドを検索。
新たなコマンドを見つけたら②「ドキュメントで確認」
これを繰り返していけばコマンドの正体が見えてきます!
詳細記事はこちら→表示されないMelコマンドを知る方法:追加編
●WEB検索する
ドキュメントを読んだが不明な箇所があれば、WEB検索をして分かりやすい解説を探します。
●既存のツールから学ぶ
既存のツールのコードから多くを学ばさせて頂いてます。
下記リンクは私が参考にさせて頂いているサイトです。
CG自習部屋 Mayaの時間
3D人-3dnchu-
MODELING HAPPY
HIGHEND3D
UnitBus
MayaEmbeddedLanguage-note
おわりに
今回は、TAになりたての頃、
「このコマンドってどうやって調べるんだ?」「ドキュメントが見当たらない…」
などコマンドの調べ方で困っていたのでそれを中心に解説させて頂きました!
私も未熟ですが、これからTAを目指される方にこの記事が助けになれば嬉しく思います。
COYOTE 3DCG STUDIO
公式HP:https://3d.crdg.jp/
COYOTE 3DCG STUDIOはクリーク・アンド・リバー社が運営するゲーム専門3DCG制作集団です。
キャラモデル、背景モデル、3Dアニメーション、テクニカルアーティストによるツール開発などを得意としています。
新規立ち上げにおけるコンサルティングから量産制作まで幅広く対応可能な体制を保有しており、出向にも柔軟に対応しております。