こんにちは!
アートデザイン課の秋月です。
入社してもうすぐ1年、仕事にもだいぶ慣れてきました。
さて、次の仕事は…
……。
な、なんだ!?この仕事内容は!!??
正直めんどくさすぎる…!!!
これを手作業でやるのはさすがに…。
…ん?そうだ!
最近何かと話題のPythonでなんかうまいことやればラクできちゃうのでは!?
ということで今回は、Python初心者がPythonでMayaでの作業を効率的に終わらせることを目指そうと思います。
環境
- Maya Creative 2023
- Python 3.9.7
作業内容の整理
さて、何をするにもまずは作業内容の整理が必要です。
いつも何気なくやっている操作もできるだけ抜き出してみます。
- FBXファイルをMayaで開いて
- メッシュを選択して
- shapeにリネームして
- FBX形式で出力
これを特定のフォルダ下にあるモデルすべてに対して繰り返せばよさそうですね。
とりあえず手作業でやってみる
とりあえず先ほどの作業工程を手動でやってみます。
この時、右下に何かログが出てきているのにお気づきになりましたか?
もう少し詳しく見てみましょう!
一番右下端にあるのボタンを押すことで展開できます。
Script Editorとやらが出てきました!!
Script Editor(スクリプトエディタ)とは
Script Editorは主に以下2つの要素から構成されます。
- ヒストリペイン(履歴ペイン)
:操作や動作に対応してコマンドとその結果の履歴が表示されます。 - 入力ペイン
:該当するタブにMELまたはPythonのコマンドを入力します。
先ほど出ていたログは、操作や動作に対応したコマンドとその結果の履歴だったようです。
つまり、ここに書かれたコマンドを流用してしまえば何とかスクリプトが書けそうですね!
というわけで先ほど行った作業とヒストリペインを照らし合わせて、今回の作業に必要なコマンドを発掘していきましょう。
Script Editorから必要なコマンドを見つける
のボタンを押してヒストリペインに表示されている履歴を削除し、もう一度先ほどの作業を行いながらヒストリペインをチェックします。
ここでは例としてメッシュ選択した際の履歴を見てみましょう。
select -r Rock_A_01_LOD00 ;
selectというコマンドでメッシュの選択を行っていることがわかりました!
公式ドキュメントを見てみよう
さて、作業に必要そうなコマンドは発掘できましたが、その後ろには -r とかよくわからない記号が書いてあってこのままだと怖いですね。
というわけでMayaのHelpからテクニカルドキュメントを見てみましょう!
ヒストリペインに表示されているのはMelなので、とりあえず select コマンドのMelドキュメントを見てみます。
select のようなコマンドには各コマンドごとのフラグがあり、任意のフラグをオンにすることで細かい操作の設定ができるようになっているようです。
さきほど select についていた -r の説明は下記です。
アクティブ リストの既存の項目を指定した項目で置き換えることを示します。
アクティブリストは少し聞きなれないかもしれませんが、自分が選択するとそのオブジェクトに対して操作がアクティブ=有効になる、と考えるとなんとなく意味がわかりそうですね。
この調子でコマンドを解きほぐしていきます!
MEL⇔Python変換
ここまでMELコマンドで見てきましたが、今回私が書きたいのはPythonです。
ドキュメントの右上にはPythonバージョンのコマンドを見ることができるリンクがあるのでそこからPythonを見てみましょう。
MelとPythonを比較してみるとこんな感じになります。
MEL : select -r Shape ;
Python : cmds.select( 'Shape', r = True )
つまり、こんな感じの構文になっていそうですね
MEL : コマンド フラグ オブジェクトの名前 ;
Python : cmds.コマンド( 'オブジェクトの名前', フラグ = True )
ここまでわかればMEL⇔Pythonの変換もうまくできそうですね!
PythonでMayaコマンドを使う前準備
作業に必要なコマンドが抽出でき、コマンドの使い方とフラグもなんとなくわかったところでさっそく実装にうつりたいと思います!
PythonでMayaコマンドを使う時は、まずMayaコマンドを読み込んであげる必要があります。
import maya.cmds as cmds
Mayaコマンドに限らず、組み込み関数ではない関数を使用するときはこの宣言が必要となります。
import ライブラリ/モジュール名
#または
import ライブラリ/モジュール名 as 略称
そのライブラリ/モジュールの中にある関数を使用するときは以下のように書きます。
ライブラリ/モジュール名.コマンド
#または
略称.コマンド
先ほどのPythonコマンドの例でもcmds.selectと、このようになっていましたね!
この辺りの詳細が知りたい方は下記サイトを参考にしてみてください。
実装してみよう!
さて、当初の作業工程は以下のようなものでしたね。
- FBXファイルをMayaで開いて
- メッシュを選択して
- shapeにリネームして
- FBXファイル形式でエクスポート
実際に実装してみたものがこちらです。
#mayaコマンドを使う前準備
import maya.cmds as cmds
#変数
path = 'D:/Logicalbeat/Blog/FBX/Rock_A_01.fbx' #FBXファイルのパス
meshList = [] #選択したメッシュを入れておくためのリスト
#FBXファイルを開く
cmds.file( path, i = True, type = 'FBX', ignoreVersion = True, renameAll = True, preserveReferences = True, options = "fbx", importTimeRange = "override" )
#シーンにあるメッシュをすべて選択
cmds.select( allDagObjects = True )
#選択したメッシュをデータとして扱えるようにする
meshList = cmds.ls( selection = True )
#名前を変更する動作をメッシュの数だけ繰り返す
for mesh in meshList:
cmds.rename( mesh, 'shape' )
#FBXファイル形式でエクスポート
cmds.file( path, exportSelected = True, type = 'FBX', options = "fbx", preserveReferences = True, force = True )
これを実行してみると…
ばっちり思った通りの挙動になりました!
【おまけ】さらに実装を進めてみる
今のままだと少し実用性がないのと、特定のファイルにしかスクリプトが実行されないので、もう少し加筆しました。
具体的には以下の機能を追加しています。
- 対象のフォルダを選択する
- 選択したフォルダ下にあるファイルに対して作業を実行する
#前準備
from tkinter import filedialog
import os
import maya.cmds as cmds
#変数
folderPath = '' #フォルダのパスを入れておくための変数
fileList = [] #FBXファイルを入れておくためのリスト
meshList = [] #選択したメッシュを入れておくためのリスト
#フォルダ選択
dirPath = 'D:\\'
folderPath = filedialog.askdirectory( initialdir = dirPath )
#FBXファイル一覧を取得
fileNameList = os.listdir( folderPath )
#全部のファイルに対して繰り返す
for fileName in fileNameList:
#FBXファイルの絶対パスを作成
path = os.path.join( folderPath, fileName )
#FBXファイルを開く
cmds.file( path, i = True, type = 'FBX', ignoreVersion = True, renameAll = True, preserveReferences = True, options = "fbx", importTimeRange = "override" )
#シーンにあるメッシュをすべて選択
cmds.select( allDagObjects = True )
#選択したメッシュをデータとして扱えるようにする
meshList = cmds.ls( selection = True )
#名前を変更する動作をメッシュの数だけ繰り返す
for mesh in meshList:
cmds.rename( mesh, 'shape' )
#FBXファイル形式でエクスポート
cmds.file( path, exportSelected = True, type = 'FBX', options = "fbx", preserveReferences = True, force = True )
#新規シーンを作成して初期化
cmds.file(new = True, force = True)
print('実行完了')
最後に
いかがだったでしょうか?
スクリプトを全く書いたことがないとハードルが高く感じるかもしれませんが、「スクリプトを書くにはまず何からすればいいのか?」問題の解決への一助となれたら幸いです。
技術の発展によりできることが増えてくると、個々の作業をいかに効率的にこなしていくかというのは大変重要になってくると思います。
そのうえで職種に関係なくPython等スクリプトが書けると便利なんじゃないでしょうか。
最後に、もっと勉強したいよ!という方向けに個人的なおすすめサイトを紹介して終わろうと思います。
それではお互い良き制作ライフを!!
プログラミング未経験の方向け
- Python Japan 「ゼロからのPython入門講座」
プログラミング未経験者を対象に、Pythonプログラミングに必要な最低限な操作方法と、基礎知識を覚えてもらうことを目標にされています。
しっかりPythonを勉強したい!という方向け
- 東大 「Pythonプログラミング入門」
基礎から体系的に学ぶことができます。HTML版、Colab版、PDF版、Jupyter版と様々な版が公開されていて学びやすいです。
Maya×Pythonを学びたい方向け
- アーティストのためのMaya Python入門
実際に操作しているところを見ながら使用頻度の高いコマンドを中心に学ぶことができます。
参考
- Maya ヘルプ | スクリプト エディタ(Script Editor) | Autodesk
- maya python はここから始まる。スクリプトエディタの基本機能と使い方を詳しく解説 – NakaNote
- Pythonのモジュール、パッケージ、ライブラリ徹底解説! – AI-interのPython3入門
※今回用意したFBXファイルは、下記のUnityサンプルプロジェクトからお借りいたしました。
- 3D Sample Scene (URP)
- 3D Sample Scene (HDRP)
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。