2013年4月21日日曜日

ウェイト移行ツール

キャラクターセットアップをやっていますと
ローポリモデルでアニメーション用セットアップ
後にハイポリモデルをレンダリング用に同じジョイントでセットアップ
なんてことがよくあります.

大きなプロダクションではラップデフォーマをカスタマイズしたもので
ハイポリモデルを変形させることがありますが
直接バインドして、ローポリモデルやハイを間引きしたモデルから
ウェイトをコピーする手法もまだ多く使われています.

しかし、ハイポリモデルはディテール追加のため
同じジョイントにバインドされている部品が多くなることが多く
ウェイトコピーコマンドが一対一でしか機能しないので
メンドクサイことこのうえない作業になります.

そこでまとめてやってしまおうと書いたのがこのMELです.
ハイモデルを選択(複数可)し最後に元になるモデルを選択して実行すると
同じジョイントにバインドした上でウェイトコピーを実行します.
これが全文、細かく説明しますと
まず選択したオブジェクトの一覧をリストに取得
最後のオブジェクトがソースなので、リストのサイズから最後の一つを
ソースオブジェクトとして取得後、forループのためにリストからソースオブジェクトを削除
ターゲットオブジェクトのリストとします.
次にソースオブジェクトのシェイプノードを取得
そこからスキンクラスタノードを取得、さらにバインドされているジョイントのリストを取得します.
for-inループでターゲットオブジェクトに対して、まずは取得したジョイントでバインド.
ソースオブジェクトからコピーウェイト、を繰り返します.
ループ処理が終わったら、戻り値としてスキンクラスタ名を戻します.
stringを戻す場合、string配列の一要素でオッケー?
と思っていたら戻した先で「これ配列じゃね?」とエラーが出てしまったので
一旦stringに代入してからreturnしております.

元はshelfに登録していてコマンド形式にはしていなかったのですが
他のツールで使う必要が出てきて書き直した次第で、戻り値もそのためです.

ysBindAndCopyWeights.mel

初歩的な(これまでのも似たようなもん?)内容ですが
このブログの目的が、防備録的なものだけではなく
これまで自分がネット検索でお世話になったのでその恩返しというような面もあります.
まあ、始めたばかりで方向性が定まらずに迷走中というのが一番正しいのかも.

2013年4月14日日曜日

ウェイトツール改修その2

今週も引き続きウェイト読み書きツールの改修です.
これまでは書き出した場合と全く同じジョイントで
オブジェクトをバインドしてあることが前提でした.
たとえウェイトゼロであっても、書き出したリストに
現在バインドしてあるジョイントが含まれていないとダメ.

間違えて異なるものを読み込んでしまうことを防ぐことにはなりますが
そうでない時、しかもバインドしているジョイントが多数になるとメンドクサイ.
そこで記録されているジョイントで、選択されているオブジェクトをバインドする
チェックボックスを追加しました.

ここにチェックが入っているかを、読込プロシージャで参照し
オンならば読み込んだジョイントでバインドします.
変数の参照先が空のままなので別途代入してあげることも忘れずに.
skinClusterコマンドの戻り値でskinCluster名を取得しようとしたところ
戻り値は配列でないstringとなっていたのですが
[u'skinClusterName']
となっていてなぜかそのままではエラーが出てしまったので
仮の変数で取得してから配列ゼロ番を代入して解決.
pythonでの文字列の扱いやユニコードやらのエンコード関係を
きちんと勉強する必要がありそうです.

ysWeightTrade.py

2013年4月7日日曜日

ウェイト保存読込ツール

ようやく環境が整いつつあるMacBookで今週末取り組んでみましたのは
自作pythonスクリプトの改良であります.
Mayaのウェイト情報保存ツールは、UV空間でグレースケール画像に読み書きします.
使い物にならないわけではないのですが、
UVが重ならずに展開されていなくてはならなかったり、
8bitグレーで0~1を置き換えているので精度がいまいちだったりします.

ネット上でもフリーのツールがいくつもあるように、
私も自分で制作することにしたのでした.
頂点番号とウェイト情報のみをテキストデータに羅列するという
かなり大雑把なツールですが、それゆえの便利さもあると思っております.
最初はMELで記述したのですが、pythonを勉強し始めたときに
既存のMELを書き換えることをしたうちのひとつで、
pythonの配列操作の柔軟性を利用できたかなあというものでした.

今回は、これまで読み書きするオブジェクト名まで一致しないとエラーとなる点を改善し
頂点数が合っていれば、確認ダイアログを出すということをやりました.
それに従い保存ファイルの書式を少し変更.
先頭に保存した時のオブジェクト名を記述して、
頂点名を完全に番号のみに.
これで読み込むときにオブジェクト名を確認した後
頂点番号前に読み込むオブジェクト名を書き足せば終了.
と思ったのですが、ここで壁にぶつかりました.
保存時と読込時の名称が同じならば、
確認ダイアログは出現せずに読込に入るはずが
何回やっても出てくるのです???
変数をprintさせてみても同じだし、なんでだろなあと頭をひねっていたところ
これ、改行情報まで読み込まれてるのでは.

ファイルの読込は行単位、プログラマーさんなら常識かもしれませんが
思わぬところに落とし穴があったものです.
保存オブジェクト名を読み込んだ変数から改行文字'\n'を取り除いてようやく解決
なんかいろいろ迷走しているのが分かるコードになってますねぇ.


使用するときは、スクリプトエディタのpythonタブで

from maya.cmds import *
from types import *
import ysWeightTrade
reload(ysWeightTrade)
ysWeightTrade.ysWeightTrade()

と打ち込みます.
よろしければお試しください.