[Maya] Fluid使ってるシーンで突然シーンファイルが肥大化する現象

タイトル通りの現象に襲われました。

しかも数十kb程度の軽いシーンだったんですが、突然300MB超のファイルになってしまいました。
シーンにはいくつかのモデルやアニメーション、カメラなどをリファレンスし、基本そいつらはいじってません。
他にシーンにあるのはエフェクトの為のFluidコンテナ、それに付随するコンストレインやFieldが数点。

一体何が原因・・・なのだ・・・??


さっき行った作業といえば、あれこれ設定済みのFluidのセットをduplicateして、その際に外れたコネクションを復元して、オリジナルと同等の状態に持っていく程度のこと。

それだけで何故数百MBに・・・!?

300MBもあるとmaファイル開くのも事なので、まずはシーンの調査から。
Fluidのコンテナのduplicateが怪しいなぁ、Initial Stateがシーンに内包されちゃったかな?と思ってクリアしてみるも、特にInitial Stateの設定はされておらず。

他にも特に怪しい点はない、、はず、、、

と思って仕方なくmaファイルをテキストエディタでオープン。
この際なんですが、ある程度しっかりしたテキストエディタ使わないと開いてさえくれないので気をつけてください。ちなみに僕はVim使ってます。

数分の後、やっとひらいたmaファイルを丹念に見ていくと、あったあった数字の羅列。
数万行だか数十万行だか程度ずらっと続いてる。これだろ間違いなく。

maではこういうのは大体createNodeの後のsetAttrで行われているのでそれを見つけるべくページを少し戻してみたところ、発見。

犯人はFieldでした。

今回使ってたのはVolumeAxisFieldだけども、どれでも同じなんじゃないですかね。
Fieldって基本作り一緒ですし。

で、悪さをしてたのはこれのinputData以降のサブアトリビュート達。inputPositionだかinputVelocityだかそういうやつ。

どうやらデュプリケートした際のデータがごっそりそのまま保存されていて、しかもさっき再コネクトしたさいに、connectDynamicコマンドを使ったためか、inputData[0]じゃなくてinputData[1]に接続されてしまったらしく、inputData[0]のデータがそのままmaに流れてしまった、という事みたいでした。

これは、ということで、シーンでコネクションを[1]から[0]に変更したところ、スッキリ直りました。
この際、outputも同じ添字のアトリビュートから接続してやらないといけないので、併せて再接続してやる必要があるようでした。

inputDataは[0]に繋ぎかえると[1]は消滅するんですが、outputに関しては[1]が残ったままになる。
これも消そうと思ってdeleteAttrとかやったんだけどダメ。
諦めてセーブしたらシーンファイルが戻っていたので、out側は気にしなくていいんだなと悟りました。
(プラグインノード書く際に設定するsetStorable()ってやつがこれなのね、と勝手に納得しました。)

で、これをTwitterでつぶやいたら、Akira Sonさんがコメントくれて、繋ぎ直さなくてもこのMEL通すとOKだよ、と教えてくれました。
感謝!!

以下がそのMEL。

setAttr ".ind[0].inp" -type "vectorArray" 0;
setAttr ".ind[0].inv" -type "vectorArray" 0;
setAttr ".ind[0].inm" -type "doubleArray" 0;

-typeフラグでdoubleArrayとか使えるのは初めてしった・・・。stringとかdouble3とかしか使ったことなかったので、、
ともあれ非常に参考になりました!ありがとうございます!!

 
以前も困った事あったので、原因判明して良かった良かった。

 
以上メモでした。
 
 
 
—————————————————————————————————-追記(2010/8/18)
あー、盲点。
まだあったぞ謎の肥大化。
今度の原因もやっぱりduplicate。

FluidのCacheを使用していたものをごそっとduplicateしたところ、やっぱり肥大化。
やれやれ、と思ってfieldを見るも、今回は[0]に繋がっていて問題なさそう。
それでもやっぱり300MB超。
これはおかしいと思ってあれこれやったが、やっぱり原因は違うところにありそうということで、観念してファイル開いた。

犯人はfluidShapeでした。
inDensity, inVelocity, inTemperature, inReaction, inColor, inTextureCoordinates, inFalloff
上記アトリビュートはキャッシュからの情報が突っ込まれます。
で、それの情報がやはり丸々残っていました。
上記はキャッシュの内容によってどこに情報が残るか違いますので、必ずしも全部に値が残るってことではないです。あしからず。

例によって削除MELは以下の通り。

setAttr .idns -type floatArray 0;
setAttr .ivel -type floatArray 0;
setAttr .itmp -type floatArray 0;
setAttr .irea -type floatArray 0;
setAttr .icol -type floatArray 0;
setAttr .itxc -type floatArray 0;
setAttr .ifal -type floatArray 0;

うんたらArrayタイプの、inputする前提のアトリビュートは、値を保持する様になっているみたいなので、皆様もFluidに限らずあれこれ運用の際はお気をつけ下さいませ。

コメントを残す

メールアドレスが公開されることはありません。