Maya Script Python Gkn Weight Editor ウェイトエディタ

weight_editor
ついに完成しました。Maya2012で動作確認済みです。
バグっぽいものは潰したつもりですが、まだあったらごめんなさい。
権利も責任も主張しないので、自由に改造してください。

 

画面はないのですが、文章で説明します。
ダウンロードしたファイルを解凍し、「weight_editor.py」をテキストエディタで開いて、全文コピーし、
Mayaのスクリプトエディタを起動し、ペーストして実行すれば使えます。
スクリプトエディタで全文選択し、中ボタンドラッグでシェルフに登録することができます。

 

そんな使い方はいやだ、という方がいれば、
weight_editor.pyの最後の一文「gkn_weight_editor_tool_main()」を削除し、
weight_editor.pyをC:\Users\(ユーザー名)\Documents\maya\2012-x64\ja_JP\prefs\scripts\にコピーして、
Mayaのスクリプトエディタで、

from weight_editor import *
gkn_weight_editor_tool_main()

と入力すれば起動できます。
ちなみに、どちらもスクリプトエディタのタブを「Python」に変更しておく必要があります。

 

実行するとウィンドウが表示されます。
スキニングされているオブジェクトを選択し、頂点選択にすると、ウィンドウが更新されます。
リストには、ジョイント名、ウェイト値、ロック状態が表示されます。
ウェイト値は恐らく、選択された頂点の頂点番号のが一番大きなものが表示されているかと思います。
この時、Mayaのスキニングのバグでマイナスの値が入っているものは「0.0」が割り振られて表示されます。
基本的に、このスクリプトで行われることは複数オブジェクトに対応しています。
複数のオブジェクトに同じインフルエンスが存在すれば同時に操作できますが、無い場合は無視されます。

 

ボタンの説明。
「Lock」ボタン
リストで選択されたインフルエンスをロックします。
「Toggle」ボタン
リストで選択されたインフルエンスがロック状態であればロック解除、そうでなければロックします。
「UnLock」
リストで選択されたインフルエンスをロック解除します。

 

「Round」ボタン
「Slider Step」で設定されている桁数を見て四捨五入します。
小数点以下一桁から三桁まで対応しています。複数のオブジェクトに対応しておりますが、頂点を選択して実行してください。
マイナスの値が入っているものは、強制的にゼロにします。

 

「PaintMode」ボタン
スキンウェイトペイントツールを起動します。
「Opacity」に設定されている値を参照し、ブラシの透明度を決めています。
「PaintValue」に設定されている値を参照し、選択されているモードが「Smooth」以外の時にペイントの値として使います。
ラジオボタン「Smooth」「Replace」「Scale」でモードを変更してください。
この時、リストで選択されているジョイントがペイントを施す骨になります。複数のジョイントには対応していません。
注意
ジョイントリストの選択変更、モードの変更、値の変更を行った場合はもう一度「PaintMode」ボタンを押してください。
「Apply」を押すと、「塗りつぶし」が実行されます。
服などの柔らかいものをスキニングする際に「Smooth」が便利です。
少しずつウェイトを無くしてゆきたい場合は、「Opacity」「0.01」等の小さい値を設定し、「PaintValue」「0.0」を設定した状態で
具合を見ながら「Apply」を押してゆくと、良いかと思います。

 

「SelectLess」ボタン
「Value」に設定されている値とリストで選択されているジョイントを参照し、ウェイト値がゼロ以上「Value」以下の頂点を選択します。
複数のジョイントを選択している場合、合計の値が「Value」以下の頂点が選択されます。
「SelectMore」ボタン
上記の反対版で「Value」以上1以下のウェイト値の頂点を選択します。
「Invert」ボタン
選択の反転を行います。Maya標準の選択の反転と違い、複数のオブジェクトが選択されている場合、
それらも含めた反転になります。
「Deselect」ボタン
「SelectMore」の要領で選択を解除します。
頂点の選択は、ペイントモードとの併用を考えて付けました。マスキングとして使用できます。
腕のウェイトを柔らかくしたい時は、前腕以下の指も含めたすべてのジョイントをリストで選択し、「SelectMore」で選択範囲を作成し、
リストで上腕のジョイントを選択し、「Smooth」を何回かかけた後、「Invert」で選択範囲を反転させて、リストで前腕のジョイントを選択し
同じ事を繰り返すと、なだらかになります。かつ必要ない部分にはウェイトが飛びません。
実行後に、「Round」ボタンを押せば、四捨五入した状態が確認できます。

 

「Slider Step」
スライダの動作を決めます。
「absolute」
リストで選択されたジョイントの絶対値によるウェイトの割り当てを行います。複数の頂点に対して同じウェイト値を設定したい場合に使います。
「relative」
リストで選択されたジョイントの相対値によるウェイトの割り当てです。デフォルトではこちらが選択されています。

 

これで鬱陶しいスキニングの作業が少しは楽になったかなぁ、、
元のmelを作った方に感謝です。
何とか多次元配列を1次元配列に変更するflattenとう関数を使わずに済みました。
Pythonでは組み込み関数として入っていないので、公開されているのを使うしか無い。
個人的に使うのには問題ないだろうが、公開するとなると分からないからできるだけ避けたい。

 

※追記2012/4/11
コピー・ペーストの機能を追加しました。
機能の説明については、こちらにあります。

 

※追記2012/4/12
ジョイントリストの一覧表示が早くなりました。
新たに開いたシーンで、以前のリスト選択が残っていて、ジョイントの数が少なくなった時にエラーが表示されていたのを無くしました。

 

※追記2012/4/14
幾つかのバグフィックス、「Round」の高速化。

 

※追記2012/4/25
同一シーン内に同じ構造の物があるときの動作を修正
スライダー、数値入力によるウェイト値変更の高速化
部分コピーの追加詳細はこちら

 
※追記2012/4/28
幾つかの調整

 
※追記2012/5/7
コピー機能の改善。コピー元とコピー先が同じポイント数の場合、選択順でウェイトをコピー・ペーストします。
幾つかのバグフィックス

※追記2012/5/9
バグフィックス
ウィンドウの小型化

※追記2012/5/16
バクフィックス

※追記2012/6/18
バグフィックス

コメント/トラックバック (3件)

  1. 技研 | 雑記 - ウェイトエディタの更新 その2 のコメント:

    [...] ウェイトでディタは、こちら [...]

  2. yuki のコメント:

    こんにちは。
    現在mayaで勉強中の者です。こちらのサイトを大変参考にさせてもらっています。
    このウェイトエディタについてなのですが、使うと必ずWireframe on shadedがonになるのですが、これは変更できませんでしょうか?
    大変使いやすく、これからも使っていきたいのですが、出来ればoffにできたらな、と思いコメントさせて頂きました。
    作られたのが昨年で、時間も経っているのにすみません。

  3. 研究員 A のコメント:

    はじめまして、技研の研究員Aと申します。

    スクリプトを使って頂き、ありがとうございます。

    えーと、ワイヤーフレームが表示されてしまう問題ですが、
    スクリプトを修正してお使いください。
    46行目と47行目、
    if cmds.getPanel( to= oPanel ) == “modelPanel” :
    cmds.modelEditor( oPanel, e= 1, wos= 1 )
    と書かれているところ削除すると、ワイヤーフレームをしなくなります。

    もう少し勉強してAPIでの実装ができれば、新たに作ろうかと僅かばかりですが考えているところです、、
    2014では(2013も?)正常に動作しませんのでご注意ください。

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です