見出し画像

[Maya] Pythonで作業を楽にしよう① : メッシュごとのFBXエクスポート


初めに

Volca の Rikuです。

普段Mayaで作業していると、無駄に重複した煩雑な操作にうんざりすることがあります。
そんなとき、「こういうツールがあれば便利なんだけどな~」と思うこともあるかもしれません。

こうした場合はだいたいスクリプトで解決できるわけですが、
多くのデザイナーは「スクリプトを書くのは難しい」と感じたり、
「Pythonの教科書を読んでもよくわからない」といった理由で、
結局スクリプトを作れず、手動で作業していることも多いかと思います。

僕自身もそのような経験をしたことがあり、今振り返るとかなり遠回りをしていたなと感じます。
そこで、実際のニーズをもとに、コーディングが苦手なデザイナーさんでも「わかりやすい!」と言ってもらえるようなチュートリアルを書きたいと思いました。

「Pythonで作業を楽にしよう」をテーマに、新シリーズの連載を始めようと思います。
このシリーズでは、MayaのPythonスクリプト言語であるPymelを活用し、
さまざまなスクリプトの考え方や作り方を紹介していきます。

初回となる今回は、「メッシュごとのFBXエクスポート」
すなわち「複数のメッシュを個別にFBX形式でエクスポートする」スクリプトについて解説していきます。

< 注意 >
このシリーズの記事はMaya 2022以降のバージョンをもとに紹介します(Python 3.x対応)


今回使うコマンドの紹介

  1. import maya.cmds as cmds
    スクリプトの冒頭につける宣言です。
    「import xx as oo 」の形式の場合は、
    「xx という機能(モジュール)を oo という名前で使うぞ」という宣言を意味します。
    この場合は、「maya.cmds というモジュールを、cmds という名前で使う」となるわけです。
    呪文のようなものです。

  2. print()
    括弧内の内容をコンソールに表示するコマンドです。
    コーディングの勉強を始める際、これで「Hello World」した経験がある方も多いでしょう。
    printコマンドはさまざまな情報を「報告」させる役割でよく使います。
    処理中の数値を確認したり、現在の状態を知りたい際に非常に便利です。

  3. cmds.ls()
    シーン内のオブジェクトのリストを取得するためのコマンドです。
    括弧内に条件を指定することで、取得する対象を絞り込むことができます。
    使用頻度ナンバーワンのコマンドです。

  4. cmds.select()
    オブジェクトを選択するコマンドです。
    括弧内に条件を指定することで、選択対象を細かく指定することができます。

  5. cmds.file()
    ファイル操作用のコマンドです。
    Mayaの外部ファイルをアクセスする際に使用します。
    出力先のパス取得や、実際の出力操作にもこのコマンドを使います。

  6. len()
    文字列やリストなどの長さ(要素数)を取得するコマンドです。

  7. for文
    最も頻繁に使われるループ構文です。
    リストを指定すれば、その要素を順番に操作することもできます。

上記のコマンドの詳細については、公式コマンドドキュメントを参照してください。
細かい説明は省いて、早速実践に進んでみましょう。


Pythonの基本的な書き方

Mayaのスクリプトエディタを開いて以下のコードをコピペし、
「Execute All」ボタンで実行してみましょう。

インデント(Tab)の数に注意してください。
forループの中身は、ループ外のコードより1段下げる必要があります。

import maya.cmds as cmds
#万物の始まり

print('処理スタート')

listA = {1,2,3,4,5,6,7}

for element in listA:
	print(element)
    #要素それぞれで報告

print('処理終わり')

結果は以下の画像のようになるはずです。
ログ画面に、forループを使ってlistAの中身をすべて「報告」させることに成功したのが確認できます。

次は、Pythonを使って選択中のメッシュの名前を「報告」させてみましょう。


Pythonで選択中のメッシュの名前を取得

リストを取得するコマンドを使用すると、シーン内に存在するすべてのオブジェクトから、特定の条件に合うものを探し出すことができます。
今回は条件として「選択中」かつ「メッシュ」を指定します。transform属性を持つものがメッシュに該当します。

シーンに適当なオブジェクトを配置し、
それを選択した状態で、以下のコードを入力して実行してみましょう

import maya.cmds as cmds
#万物の始まり

print('処理スタート')

listA = cmds.ls(selection=True, type='transform')
#リストのコマンド、絞り込み条件は選択中かつtransform属性を持っているもの

for element in listA:
	print(element)
    #要素それぞれで報告

print('処理終わり')

僕の場合、以下のような結果が得られました。
無事に選択中のオブジェクトの名前を取得することができました。

名前が分かれば、さまざまな操作が可能になります。
次は、ファイルパスを取得し、FBX形式での出力まで行ってみましょう。


メッシュごとのFBXエクスポート

エクスポートには、ファイル名とパスの指定が必要です。
ファイル名はメッシュ名を使用し、FBXをMayaシーンファイルと同じパスに出力します。
具体的な流れとしては、以下のようになります:

  1. fileコマンドを使用して、Mayaシーンファイルの保存場所を取得します。

  2. 取得したパスに基づき、fileコマンドでFBXエクスポートを行います。

まず、シーンに適当なオブジェクトを配置し、一度保存してください。
その後、オブジェクトを選択した状態で、以下のコードを実行してみましょう

import maya.cmds as cmds
#万物の始まり

print('処理スタート')

listA = cmds.ls(selection = True, type = 'transform')
#リストのコマンド、絞り条件は選択中かつtransform属性を持っているもの

fullpath = cmds.file(query = True, sceneName = True)
scenename = cmds.file(query = True, sceneName = True, shortName = True)
exportpathlength = len(fullpath) - len(scenename)
exportpath = fullpath[0:exportpathlength]
#シーンのフルパスからシーン名を取り除く文字列処理です
#文字列の長さを取得して、シーン名の文字数分を末尾から削り取ります

print('エクスポートパス:' + exportpath)

for element in listA:
	print(element)
    #メッシュ名

	elementpath = exportpath + element + '.fbx'
	#エクスポートのファイル名を指定

	cmds.select(element)
	#順番にオブジェクトを選択

	cmds.file(elementpath, force = True, type = 'FBX export', exportSelected = True)
	#選択したものをエクスポート

print('処理終わり')

エクスポート先を開けば、選択したモデルが個別に出力されたことが確認できるはずです。



終わりに

メッシュごとのFBXエクスポートの紹介は以上です。
文字列処理の部分は、個人的にちょっと難しいと感じています。

詳しい説明については、色んなサイトで紹介されていますので、
興味がある方はぜひご覧ください。

次回の記事もお楽しみに!

いいなと思ったら応援しよう!