1. サイトトップ
  2. ブログ
  3. アート
  4. 【Maya×Python】Pythonで業務効率化をはじめよう

【Maya×Python】Pythonで業務効率化をはじめよう

こんにちは!
アートデザイン課の秋月です。

入社してもうすぐ1年、仕事にもだいぶ慣れてきました。

さて、次の仕事は…

※この仕事内容はフィクションです

……。

な、なんだ!?この仕事内容は!!??
正直めんどくさすぎる…!!!

これを手作業でやるのはさすがに…。

…ん?そうだ!
最近何かと話題のPythonでなんかうまいことやればラクできちゃうのでは!?

ということで今回は、Python初心者がPythonでMayaでの作業を効率的に終わらせることを目指そうと思います。

環境

  • Maya Creative 2023
  • Python 3.9.7

作業内容の整理

さて、何をするにもまずは作業内容の整理が必要です。
いつも何気なくやっている操作もできるだけ抜き出してみます。

  1. FBXファイルをMayaで開いて
  2. メッシュを選択して
  3. shapeにリネームして
  4. 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ドキュメントを見てみます。

Maya ヘルプ | テクニカル ドキュメント | Autodesk

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と、このようになっていましたね!

      この辺りの詳細が知りたい方は下記サイトを参考にしてみてください。

      Pythonのモジュール、パッケージ、ライブラリ徹底解説! – AI-interのPython3入門

       

        実装してみよう!

        さて、当初の作業工程は以下のようなものでしたね。

        1. FBXファイルをMayaで開いて
        2. メッシュを選択して
        3. shapeにリネームして
        4. 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を勉強したい!という方向け

            Maya×Pythonを学びたい方向け

            参考

            ※今回用意したFBXファイルは、下記のUnityサンプルプロジェクトからお借りいたしました。

            • 3D Sample Scene (URP)
            • 3D Sample Scene (HDRP)

            【免責事項】

            本サイトでの情報を利用することによる損害等に対し、
            株式会社ロジカルビートは一切の責任を負いません。