« 余白なカメラ。 | トップページ | GetFullChinPath。 »

2013年2月28日 (木)

オブジェクトをぬるる~んとヌルに置き換える。

Mox さんが、アニメーションやらコンストレインやらを保持したままオブジェクトを全てヌルに置き換えるスクリプトを開発なさったそうです。

http://mox-motion.com/info/moxreplacenull.html




で、けっこう難儀して開発したという話を開発が終わってから読んだんですが、もしかしたらあの現象を利用すれば意外と簡単にできるんじゃないのかな、とふと思いついて書いてみたというだけのアレです。


あの現象とは、子供がいるオブジェクトを削除しようとすると削除されずにヌルに置き換わるという現象です。 手動で削除しようとすると、子供がいるときは削除できませんよね。 この現象です。 現象というより仕様ですわね。 だって親を亡くしたら子供は生きていけませんもの。 子供が階層からカットされるまでは、つまり親から自立するまでは親は死ぬことを許されず、責任持って子供を養育せねばなりません。 子供思いの XSI 様の慈悲仕様です。 



というのをスクリプトでやってみたら、できたように見える、というアレです。



ぬるるん
(JScript)
------------------------------------------------------------------------

//    処理対象になるオブジェクトを oAll にブチ込む(ブランチ選択なら階層全て)
var oCol = XSIFactory.CreateObject( "XSI.Collection" );
oCol.items = Selection;
var oAll = oCol.expand();

//    ダミー子供ヌル格納容器
oDummyChildNulls = XSIFactory.CreateObject( "XSI.Collection" );

//    処理対象オブジェクトをループ
for ( var i=0; i<oAll.count; i++ )
{

    var oObj = oAll(i);
    var oFurtherChildren = oObj.Children;//    更に子供がいるかどうか

   

//    子供が居ない → つまり階層の一番下 → 削除されてしまう → (゚д゚)マズー → ダミーの子供を出産
    if ( oFurtherChildren.count == 0 )    oDummyChildNulls.Add( oObj.AddNull() );

   

//この時点で必ず子供がいる状態になっているので、安心して親ブチ殺し→子供がいるから削除されずヌルに変身
    DeleteObj( oObj );
}

//    最後にダミーの子供を殺害して終了
DeleteObj( oDummyChildNulls );

------------------------------------------------------------------------

このスクリプトのダウンロード(右クリックで保存)





例えばこういう状態。

Nulllun1

階層があって、それぞれFカーブを持っていたり、エクスプレッションが入っていたり、コンストレインされていたりします。カスタムパラメータを持っているものもあります。


次にブランチ選択します。

Nulllun2

ブランチセレクトしているとその階層に含まれるオブジェクト全てが対象になります。 グループを選択しているとグループのメンバが対象になります。

で、スクリプトを実行すると、

Nulllun3

ヌルに置き換わりました。スケマティックやエクスプローラのアイコンがヌルに変わっているのがわかると思います。 PPG を表示させても、ちゃんとヌルが持つプロパティを持っています。

で、Fカーブもエクスプレッションもコンストレインもカスタムプロパティもそのまんま保持されているように見えます。 もちろんオブジェクトの名前もです。 Mox さんの方では再現できてないというワイヤカラーも保持されてますね。 ほんと、すべてそのままで、単にジオメトリがヌルに置き換わっただけという風に見えます。 どうでしょうか Mox さん。 これで目的のことはできますかね・・・・?


スケルトン階層や Model やカメラがヌルに置き換えられないというのは、Mox さんのと同じですね。 これはもう仕方ないと思います。 その部分だけ違う方法で特別にヌルに置き換えていくルーチンを書かなければいけませんね。




スクリプト的には、解説する必要もないほどシンプルだと思います。


冒頭、Expand の魔法でブランチ選択とかノード選択とかによる対象オブジェクトの選別をやっています。

あとは、対象オブジェクトをループして、子供がいるかどうかを調べます。子供がいれば、何もせずただ削除します。 削除と言っても、上で書いたように子供がいるなら親は殺されないという現象を利用した削除ですので、実際は削除されずにヌルに置き換わります。

子供がいなかった場合は、そいつは階層の一番下にいるオブジェクトだということですね。 こいつを削除しようとすると、そのまんま削除されます。 養育すべき子供を持たない奴であれば死んで良しという、XSI 様による悪魔仕様です。 でも死なれたら困るので、ダミー子供としてヌルを出産させます。 こうして養育すべき子供を持ったので、安心して削除にかけることができます。もう子供がいるから、削除されずにヌルに変身します。

そして最後にダミーの子供達は丸ごと殺害します。用済みだからです。


という風に、子供がいると削除されずにヌルに置き換わり、もろもろの属性はそのまんま保持されているらしいという現象に100%依存したスクリプトです。 5分かそこらで書けましたが、Mox さんの話も聞かずに勝手に書いたものですから、これが Mox さんのやりたかったことと合致するかどうかは XSI 様のみぞ汁です。


どうでしょうかね。

.

|

« 余白なカメラ。 | トップページ | GetFullChinPath。 »

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: オブジェクトをぬるる~んとヌルに置き換える。:

« 余白なカメラ。 | トップページ | GetFullChinPath。 »