【MAYA・Python】ウエイトをまとめてコピーするツール
先日、複数のジオメトリのウエイトををまとめてコピーしてくれるツールを作成しました。同じ名前の組み合わせでコピーしてくれます。(MAYA)
機能としては複数のウエイトコピーやスキンバインドを自動で行ってくれるものとなっています。今回は本ツールの使い方や作成時に必要だったものを、簡単にご紹介したいと思います。
なお、python初心者ですので間違った点や非効率な部分がございましたら指摘していただけるとありがたいです!
↓↓pythonファイル↓↓
※作成時検証バージョン maya2020
※pyside2を使用しているため、maya2016以下未対応
【ツールの使い方】
➀ウエイトコピー元のジオメトリを選択し、「Source Mesh」ボタンを押します。(複数のジオメトリを含んだ一番上のトランスフォームノード一つだけ選択でも大丈夫です。)
➁ウエイトコピー先のジオメトリを選択し、「Target Mesh」ボタンを押します。
➂「Copy」のボタンを押すと、同名のジオメトリの組み合わせでSourceMeshからTargetMeshにウエイトがコピーされます。
【ダイアログの説明(エラー等)】
➀SourceMesh、またはTargetMeshにジオメトリが登録されていません
➁同名のジオメトリを選択して登録することはできません。
➂SourceMeshの中に、バインドされていないジオメトリがあります。(箇条書きで表示されているもの)あらかじめバインドしてください。
➃TargetMeshの中に、バインドされたメッシュがあります。(箇条書きで表示されているもの)スキニングされていないメッシュを登録してください。
➄コピー中・コピー完了・コピーキャンセル
【pyside2 について】
ここからは作成時に覚えたことを学習メモがてら紹介します。
今回、GUI部分の作成にはpyside2というライブラリを使用しました。フリーライセンスかつmayaにも標準でインストールされています。実際に触れてみて構造がわかりやすく、初心者でも扱いやすいと感じました。
またpysideはhoudiniやsubstanceといった他のDCCツールでも使用することができます。一度覚えるとpythonを使用した様々なプラグイン開発で役に立つでしょう。
基本的な概念として、一番外側の「Window」(またはダイアログ)の中に「レイアウト」を配置し、その中にボタンやテーブルといった「ウィジェット(widget)」を配置していくという考え方になっています。最終的にQwidgetクラスのshow()メソッドでGUIを表示できます。
また作成したwindowをmayaメインウィンドウの前側に常に表示するにはmayaMixin.MayaQWidgetBaseMixinをクラスの第一引数に継承することで可能となります。(スクリプト 48行目)
エラーダイアログはQDialogのインスタンスにWindowStaysOnTopHintフラグを立てることで前面に表示が可能です。(スクリプト295行目)
【ウエイトコピー処理 について】
ウエイトコピー処理部分は以下のサイトを参考にしました。
mayaでのpythonを動画で紹介してくれていますので、本当にわかりやすいです。是非学習の参考にしてみてください。
大まかな流れとしてはトランスフォームノードを取得し、そこから芋づる式にskinclusterノードまで取得して処理を行うというものです。(cmds.listRelativesやcmds.listHistory等)本ツールではこの処理を同名のジオメトリの組み合わせごとに行っています。
ちなみにアウトライナー上で右クリック→「シェイプ」にチェックを入れることでノードエディタで見るような トランスフォームノードとshapeノードの階層で表示することができます。普段アウトライナー上で表示選択できるものはshapeノードを階層にもつトランスフォームノードであることがわかりますね(アトリビュートのTransformノードと名前が一致している)
【最後に】
・例によって本ツールの利用は自己責任でお願いいたします。
・mayaはindie版でもお高い...!