« キーフレーム殲滅でポン。 | トップページ | GridData に色つけてポン。 »

2012年1月19日 (木)

悲しみの対称複製そしてリネーム。

以前、対象複製同時名前健作痴漢。などという記事を書いたのですが・・・。


シンメトリ複製する時に、名前の LeftRight にするみたいに、左右のリネームを同時にやろうというものでした。 後からリネームするのって麺独裁じゃないですか。 名前の最後が数字で終わってるオブジェクトだと数字が加算されてうざったいし。 なのでそういうことを自動化するスクリプトを書いたのでした。


その後PPG付きにしたのでオプションもその都度変えられるようになり、それなりに便利に使っていたんですよ。




でも、今日使っていて、思いっきり不具合に出くわしました。


1つのオブジェクト、1つのブランチとかでやる場合には問題なかったのかな。 よくわかんないけど、今日の作業では全然ダメでした。 それなりに複雑なリグのツリーを対称複製しようとしているのですが、ボーン階層とコントローラ階層の関係のように、コンストレインやエクスプレッションの関係も一緒に対称複製したいので、複数のツリーをブランチ選択してイッキに対称複製する必要がありました。 1つ1つ対称複製していたんじゃ、コンストの関係が切れるというか、複製元へのコンストのままになってたりしますからね。


でも、やってみたら、もう、オブジェクトの名前がぐちゃぐちゃにシャッフルされてしまっていました。 対称複製自体は正常にできているし、コンストもエクスプレッションの関係もちゃんと複製されている。 でも、名前がズレている。  A という親から B と C に枝分かれするツリーで、LR の名前置換自体はちゃんとされているけど、LR 以外の部分で B と C の名前がテレコになったりしてました。 あかん。 これではあかん。 何がなんやら分かんなくなってしまう。




前のスクリプトが前提にしていたのは、 「複製されたツリーは、複製元のツリーと親子の順番が一緒である。 だから、元が5番目の子は複製後のツリーでも5番目の子であり、インデックスの一致を信じてリネームができる」 ということでした。 


でもどうやら、そうとも限らない気がして来ました。 なんかもう、結果の名前がぐちゃぐちゃでしたからね。 で、自分で書いたコード読み返してみても、なんだこりゃって気もしました。 すげえテキトーに見えました。 最近ちょっと弱っているのもあって、すごく悲しくなりました。 対称複製ごときで悲しむなんて俺の人生終わっています。 



ということで、前回の時点で検証不足だったのはもちろんですが、今回もまた、どこがどう不具合なのかを深く検証することはしていません。 しかし、ともかく、ほんとに信頼できんのか怪しい上記の前提条件はポイと捨てて、もっと確実な方法でリネームするよう改造した方が良かろうと思いました。 なにせ今作っているリグが(それほどでもないけど)それなりに複雑になってきたので、もし不具合があったら後から直すのが大変なわけですよ。 なのでアルゴリズム的にもっと確実にするというかシンプルにするというかね、ここは原理を見直した方が良かろうと思ったわけですよ。







ってことでなんとか改造したバージョンを、一応載せておきますね。


っていってもコードが少し長いし、セルフインストール型にしてしまっているので、ソースを直接載せるのではなく、ファイルのダウンロードリンクを貼っておきます。


 悲しみの対称複製そしてリネーム。

 ダウンロード KanashiminoSymDupAndRename.js (13.4K)





自分のプラグインフォルダに入れて下さい。 XSI を再起動するかプラグインをリロードすると、XSI 右側の Edit メニューの中に出現します。 


2



あとは、普通に対称複製したいブツをブランチ選択などで選んで(複数可)、このメニューから実行です。



するとPPGが出てきます。

Kanashimino


下段中央の部分は、標準機能の Duplicate Symmetry を実行した時と基本的に同じです。 

上の部分がオブジェクト名の検索&置換ですね。  性器正規表現も使えます。たぶん。 

このように、標準機能に検索&置換を付け加えたというだけのものです。










一応、新しい原理を説明すると・・・・


以前のようにインデックスに頼るのではなく、 「複製後に名前が必ず一定のパターンになるよう、複製元の名前をあらかじめ細工をする。 一定のパターンであるということが分かっているのだから、名前は安全に加工し直すことができる」 というものにしてあります。




例えば、元のオブジェクトが L_bone1 だったとしたら、

複製前に、L_bone1_FuckMePlease という名前にリネームしてしまいます。


そしてこの L_bone1_FuckMePlease を対称複製しますが、複製された時点では名前は必ず
L_bone1_FuckMePlease1 になります。 元の名前 + 1 ですね。  XSI ではいつもこうなりますよね。


そして、L_R_ に変換する。 すると、R_bone1_FuckMePlease1 になりますね。


そして 、R_bone1_FuckMePlease1 から _FuckMePlease1 を取っ払えば、めでたく R_bone1 という名前になります。 必ずケツに _FuckMePlease1 が付いているとわかっているからできる技です。 ここで複製後のオブジェクトのリネームは完了。


さらに、元のオブジェクトも L_bone1_FuckMePlease にリネームしちゃってますから、 _FuckMePlease を削除して、元の L_bone1 に戻してあげます。 これで全部おしまい。



という風に、複製前に、絶対にカブらなさそうな名前にいったんリネームして、しかも数字で終わらない文字列を付け加えることによって、複製後には必ず その名前+1 というパターンになっているようにしたということです。 たぶんこっちの方が確実だと思う。 

もし L_bone1_FuckMePlease という名前のオブジェクトが既に存在していたらこの方法はアウトなわけですが、そんな変態な名前を付けるのは俺とあの人とあの人くらいしかいないと思うので、まずカブらないでしょう。 ちなみに FuckMePlease の部分は実際はもうちょっと長い文字列にしてあります。  







一応、俺のもとではちゃんと動いているように見えます。 が、最終的に元に元に戻すとは言え、複製元のオブジェクトまでリネームする工程があるので、何か予期せぬ不具合が出ないかとか、なんとなく心配になりますよね。 エクスプレッションが入っていた場合、リネームされた時に正しく関係がアップデートされんのか? とか。  

でも今のところ、ちゃんと動いているように見えます。 それなりに複雑なリグでも試してみたんですが大丈夫に見えます。



どうでしょうかね。
どなたか試してみてくれませんかね。

なるべく複雑な条件で試してもらえるとありがたいですね。 エクスプレッションとかコンストレインとか、そういう関係を保ったまま複製されないと意味無いですからね。





UI 部分はまだ改良できそうですね。 検索&置換の部分をもっと入力しやすくするとか、前回入力した文字を覚えておくとか、プリセットを呼び出せるようにするとか・・・。 いずれ改造するかも知れません。





その前に、そもそもちゃんと動くか、試して教えてくれたらありがたいです(゚∀゚)





.

|

« キーフレーム殲滅でポン。 | トップページ | GridData に色つけてポン。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217974/53770405

この記事へのトラックバック一覧です: 悲しみの対称複製そしてリネーム。:

« キーフレーム殲滅でポン。 | トップページ | GridData に色つけてポン。 »