Python

Mayaスクリプト: スキン済みメッシュの分割・結合

前回の記事でちょろっと触れたスムーススキンバインド済みのメッシュを分割/結合するスクリプトを配布します。

ホントはPMXプラグインと同時にリリースしようと思ったのですが、何となく先に公開することにしました。

あとオマケで通常メッシュをヒストリやトランスフォームノードを作らずに分割するスクリプトも同梱しました。 こっちはあまり需要無いかもしれないですけど、最近Gurenから同機能がいつの間にか消されてたみたいなので、その代替として使えるかもしれないということで。

▼ ダウンロード
TrM SeparateSkinMesh Ver1.00
TrM SeparateSkinMesh Ver1.10 (右クリックで保存)

▼ インストール
一般的なPythonスクリプトと同じく、起動時にロードして使用します。
  1. mayaスクリプトフォルダにこのファイルを移動します。
    (Windows7x64 であれば Documents\maya\20XX-x64\ja_JP\scripts\ 等)
  2. スクリプトフォルダにuserSetup.pyが無ければ新規に作成します。
    (userSetup.pyは空のテキストファイル)
  3. userSetup.pyに以下の一文を書き加えます。
    import TrM_SeparateSkinMesh
  4. Mayaを起動し、コマンドをシェルフにPythonモードで登録します。
    ※1つのコマンドが1つの処理なので、まとめてではなく個別に登録してください。
    # バインド済みメッシュの分離
    TrM_SeparateSkinMesh.separateSkinMesh()
    # バインド済みメッシュの結合
    TrM_SeparateSkinMesh.mergeSkinMesh()
    # 通常メッシュの分離
    TrM_SeparateSkinMesh.separateMesh(delFace=True)
    # 通常メッシュの複製
    TrM_SeparateSkinMesh.separateMesh(delFace=False)

▼ 使い方
  1. バインド済みメッシュの分離
    予めスケルトンを初期姿勢に戻しておいてください。
    バインドされたメッシュのフェースを選択してコマンドを実行します。
    選択部分と非選択部分の2つの新規メッシュが作成され、ウェイトがコピーされます。
    安全のため元のメッシュは削除されませんので、無事ウェイトがコピーされた事を確認した後、手動で削除してください。

  2. バインド済みメッシュの結合
    予めスケルトンを初期姿勢に戻しておいてください。
    バインド済みメッシュを複数(2個以上可)選択後、コマンドを実行します。
    新規に結合されたメッシュが作成されます。
    こちらも元のメッシュは削除されませんので、動作確認後に手動で削除してください。

  3. 通常メッシュの分離、複製
    フェース選択後にコマンドを実行します。
    分離モードでは新規にメッシュが作成された後、選択フェースが削除されます。
    複製モードでは選択フェースは削除されません。

    Mayaの通常機能でもフェースの分離がありますが、このコマンドではヒストリやトランスフォームを新規に作成しないためシーンを綺麗に保つ事ができます。

ウェイト処理は出来るだけ確実に動くように作ったつもりですが、データによっては上手く動かないかもしれません。
(特にヒストリが入っている場合は動かない可能性が高いです。)

なので、各自自己責任で、スクリプト実行後にきちんとコピーされているか確認してください。


それでは、良いMayaライフを。

スポンサーサイト

Python Tips: from import で reload する

こんばんわ、Toryです。
案の定あまり更新出来てないわけですが…。

今回はMayaなPython開発でよく使うreload()関数について1つ。

Maya用のPythonスクリプトを書いていると、モジュールの再読み込みをしたくなることってよくありますよね。
普通のPythonスクリプトなら、インタプリタごと再起動してしまえばいいわけなんですが、Mayaの場合本体ごと再起動しないといけないのでとても面倒です。

そういうわけでreload関数を使って再読み込みすると便利なのですが、このreload関数なんとfrom importで読み込んだモジュールを再読み込みすることができません。えぇぇ…

(form importを使うべきかどうかは別として)これは非常に不便です。

例えば、
from poly_helper import PolyHelper のようにした場合、
reload(poly_helper)としても、reload(PolyHelper)としてもエラーが出てしまいます。

これは、from文では、モジュールオブジェクト自体への参照が作成されず、reload()関数に渡すオブジェクトが未定義になってしまっているためですが、こういう場合、以下の様な書き方をすることができます。

import poly_helper
reload(poly_helper)
from poly_helper import PolyHelper

なぜこのような書き方ができるのか。

import
モジュールを読み込み、モジュールオブジェクトへの参照を作成する

from import
モジュールを読み込み、モジュール内の特定の要素への参照を作成する
(モジュールオブジェクト自体への参照は作成されない)

reload関数
引数にモジュールオブジェクトが必要

モジュールオブジェクトの実体
import と from import で作成されるモジュールオブジェクトはメモリ上では単一

というわけで、import文でモジュールオブジェクトへの参照さえ作ってしまえば、その参照でreloadすることができるわけです。

あまり使いドコロのないTipsかもしれませんが、何処かで誰かの役に立てばいいと思い書きました。
from自体、使わない方がいいんだろうか…。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。