<< TOP



Lagoa  ICEベースのシミュレーター
       

 プロローグ
      さて、今回は Softimage 2011 SAP から搭載された ICEを使ったシミュレーター Lagoa の機能紹介記事になります。
    Thiago Costa さんが作り上げたこの機能は、オリジナルに組み上げたICEノード群なのです。
     紹介ムービーが存在しますね。 Lagoa Multiphysics 1.0 - Teaser  http://vimeo.com/13457383

    まだまだ日本語、いや英語でも詳しい説明が少ないのですが、
    すごいムービーにだけ注目するのではなく、いったいどのような設定のものなのか 基本から覗いてみたいと思います。
     で、ICETree 左のタスク・タブ> Lagoa を開くと、どんだけーーー!! って数の ICEノード が出て来ます。 
        えっと数えると、・・73個かな あります。

     サンプルのシーンがあったり、4番目のSoftimage画面に昇格したICEイン画面 の左メニューから設定すると、
    ある程度の組み合わせで簡単に用意してくれます。
     まずはそこらあたりから記述していきたいと考えます。

    0)  情報
    1)  基本
     > サンプルシーン
     > ICE の レンダリング
    2)  布のシミュレーション
     > Lagoa Setup Cloth Mesh からの発展
    3)  Lagoaのキャッシング
     > Lagoa Emit Mesh の場合

      パソコンのスペック WindowsXP SP3、 Intel Core2Duo 3G、 RAM; 3G、NVIDIA Quadro FX1700


情報

      これを書いている時点で Softimage2011SAP Lagoa についてのヘルプ情報は英語版のドキュメントにありましたが。
    その後、日本語のドキュメントがダウンロード出来るようになりました。
    デフォルトのインストール先のディレクトリー
    C:\Program Files\Autodesk\Softimage 2011 Subscription Advantage Pack\Doc\jp 内に xsidocs.chm を上書きコピーします。
    検索項目に Lagoa って入れると ドバーっと100個以上の候補が表示されます。






基本

 サンプルシーン
      まずは、基本のサンプルシーンがインストール時に用意されていますので、そこから始めると良いです。
    が、ICEである以上、基本的なICE知識はあるという前提で話が進みます。
     Alt+9 キー で ICE Tree を開き、ユーザーツール>サンプルをブラウズ... を選択すると、ICEのサンプルのあるところにブラウズしてくれます。
    その中の Lagoa_Basic_Emission シーンを選択して、メイン画面上に ドラッグ&ドロップ すればシーンが開きます。



      シーンを再生してから止めてパーティクルを選択し、Alt+9キー で ICE Tree を開くと たった4つのICEノードが表示されます。
    でも、こんな簡単なはずがありませんよね。↓



     Lagoa Setup Basic Emission ノード コンパウンド なので展開して中身を見ます。すると、6個のノードが表示されます。↑
    でも、こんな簡単なはずがありませんよね。

     つまり、Lagoa という機能は、扱い易いようにコンパウンドとしてまとめてくれている ICEノード群である、と理解出来るのです。
    でも、本当に簡単に色々な動作を設定できるようにまとめてくれているし、
    同時に ICEで出来ているので、既存のノードと組み合わせればいくらでも改良が出来るものだ と解ります。
     高機能で柔軟性に富んだ素晴らしいシミュレーションシステムなのです。

     では、ここにある 各コンパウンドをもう少し探求していきましょう。
    そのノードの見た目よりも、ずっと面白くアニメーションを設定出来るんです。



    Lagoa Emit Volume (Lagoaボリュームの放出)
       ノードをダブルクリックすると パーティクルを生成する設定PPGが表示されます。(これもコンパウンドなので、更に中があります)
      EmitRate は
      ・いっぺんに出すか [Once at Frame(フレームで1回)]
      ・各フレーム毎か[Every Frame(すべてのフレーム)] を簡単設定出来ます。
      Fitting 項目は放出の仕方が変わります。 一番下 Initial Force は方向です。
      これだけでも色々と放出方法が変えられる面白いノードです。





    Lagoa Add Forces (Lagoaフォースの追加)
       その下のフォースも独自のノードで組み合わせられたコンパウンドです。
      重力は既存ですが、その下の Air Density(空気密度) は 強さと効果度合いが調整出来ます。
      例えば、行き場が無くてどんどん溜まっていく というアニメーションが作成出来るので、
      まるで シャボン玉 や 泡 が 次々と積み重なっていくようにな動きになります。





    Lagoa Main Material (Lagoaメインマテリアル)
       その下のマテリアル(材質感)も独自のノードで組み合わせられたコンパウンドです。
      その横の Lagoa Phase のはトリガーとして ID値を変えることの出来るノードです。

       Lagoa Main Materialードは面白いです!!!
      パーティクルに 材質的な設定を行います、
      • 圧力 (Pressure Settings):流体の非圧縮性を制御
      • 粘着性 (Viscosity Settings):流体の滑らかさ
      • 非弾力性 (Inelastic Settings):摩擦や自己衝突(クロス)
      • 弾性 (Elasticity Settings):元の形に戻ろうする能力(伸縮性)
      • プラスティック流 (Plastic Flow):元の形に戻らない能力;可塑性(かそせい;
          荷重を完全に除いた後に残るひずみ(伸び、縮みのこと)) [プラスチックってこの可塑性物質という意味らしい]

      等々の各項目があり、細かく材質設定が可能です。

       サンプルシーンを見ていくと、
      ElasticitySettings項目の SolveElastic と Elasticity at Boundarues を ON にしていて、
      ポリゴンの外形が 衝突物に接触すると "くっ付く" という風な動作例になっています。
      このような振る舞いは、従来作るのが難しいアニメーションだと思います。

     



    Lagoa Simulate Multiphysis (Lagoa複数の物理特性のシミュレート)
       その下のコリジョン用のポリゴンが接続されているノードは 衝突物の振る舞いを設定出来るノードで、コンパウンドではありません。
      これ1つでコリジョンの際の動きが細かく設定出来ます。
      Optimization and Debug 項目に各機能を有効にするかを選択します。
      上から 
      ・圧力 ・密度 ・弾性 ・非弾力性 ・粘着性 ・可塑性 等を チェックで 無効/有効 が設定されます。

      下図例は、衝突したパーティクルが中々前に進まず、どんどんと後から来るものに押しのけられるように積み重なっていく、という動作です。





     これだけの設定で まだ ベーシック です。
    コンパウンドの中身がものすごい複雑なノードの組み合わせになっている・・・・なんて知らなくても、
    いくらでも面白い動きが作成出来てしまいます。

     サンプルシーンは10個用意されています。
    順に開いてみて、動きがどのように変化するのか見てみて、各ノードの機能を理解していくと良いと思います。
     中でも  Lagoa Setup Pouring Liquid、 Lagoa Setup Cloth Mesh など 流体や布の設定をしているコンパウンドがありますが、
    その内訳をみると、やはり上記で紹介したような基本の各ノードの設定値がそれっぽくなるように設定されているものだ、と気が付きます。
    なので、サンプルシーンからでも、その理解がすすめば、そこからどんどんアレンジしていけるものになっています。
     
     このようなシーンは簡単に作成できます↓。衝突判定も外形を成しているポリゴンをグループ化して設定しているだけです。
                    (うわー!!やな音だな、絶対ブツカりたくないね、ってぶつからないってXSI)



 
 ICE の レンダリング
     さて、ここで ICE の レンダリング TIPS です。
    上ムービーのように、ICEパーティクルに色と形状を設定した場合、以下↓のようになっています。
    色は LagoaGradient のカラー形状は Sphere になっています。
    これをこのままレンダリングしたいと思った時の設定です。



      爆発とか煙とか ICEパーティクルで色を付けた状態で、ちゃんとレンダリング出来るのです。
    また、ここではSphere形状のままのレンダリング方法です。
     pointcloud を選択して、適当なマテリアルを一旦付けます。
    そうした後、RenderTree(7キー)にて ノード>パーティクル>Particle Renderer を取り出します。
    なんと RenderTree上のノードも、ICETree上のように、Particle Renderer はコンパウンド になっていますね。
    Particle Renderer をダブルクリックして、ボリューム密度を 20000 くらい、
    ボリュームカラー・タブのアンビエンスを真っ白にして、強度も1にします。
    ディフューズの色も真っ白にして その強度は 0 にしておきます。
     続いて、ノード>パーティクル>Particle Shaper を取り出します、これもコンパウンドです。
    その Density (密度) を Particle Renderer の DensityShape に接続し、
    フラクタルの強度を 0 にします。つまりぼけた感じを 無し にしたのです。
    もし、ぼかしたパーティクルにしたいなら、プリセットのタブに ”もくもく” と ”フワフワ” があります。何の翻訳?


    RenderTreeの設定画面

     ここで、さっきからなんで、コンパウンドだ!コンパウンドだ!! って言ってるかというと、
    ICEノードと同じく、これらを展開すると やはり複数のノードでレンダリングの設定 しているわけなので、
    それらの個々のノードを取り出してユーザーが自由に組み替えれば、オリジナルのレンダリングの設定がいくらでも作れるようになっている・・・
     ってことを言いたかったからです。

    Particle Shaper と Particle Renderer を展開した図


       さて、これをレンダリングすると、このようになります。↓




布のシミュレーション

 Lagoa Setup Cloth Mesh からの発展
    どのくらいの布シュミレーションが出来るのか探ってみました。
    ユーザーガイドには 『動くキャラクターにかけるクロスとしては適していません』 と書かれているのですが、
    機能としてあるからには探ってみたいものです。
    設定方法は、左の項目からするとあっと言う間に構築してくれます。
     デフォーム>シミュレート>Lagoaクロスメッシュ の後、衝突するものをピックします。(グループも接続可能)
     


      これで基本的な設定は出来ているのですが、生成するとただ落ちるだけです。
    それは ピン で止めてないからです。
     Nullを取り出し、主表示を  に、仮に Constraints という名前のGroupを作成します。
    そのグループ名を Lagoa Setup Cloth Mesh の InNameNull に接続します。
    Nullの半径をスケール値調整すると、赤い点が表示される範囲が変化し、ピン止め した範囲指定できます。
    再生すると、もう布っぽい動きになっています。



     でも、結局細かい設定をするのなら、コンパウンドを展開して各ノードの設定をすることになります。
    下図左の LagoaMainMaterial ノードは 扱う機能に限定した LagoaMateriaCloth ノードじゃなくて フル機能 のノードを接続しているだけです。
    後の調整でどの機能も利用できるようにしておいた ということです。



     とにかく設定箇所がいっぱいあるのですが、使わないであろう設定は外しておくとか・・。
    例えば
     ・ちぎれる必要が無いなら、ELasticitySetting の ElasticBreakingPoint の値は要らないので、
      Lagoa Simulate Multiphysis の AllowTearingチェックを外します。
     ・黄色に表示している構造表示を無しにするには、Lagoa Simulate Multiphysis の Debug項目の Display Structure チェックを外します。

     さて、ここまでの設定で かなりいけてる と思って動かすと、あることに気が付くはずです!!
    布として形状変形させているGrid自身に回転値を付けると・・・・
    おや??、重力設定したはずの下への垂れ下がりが効かないで、回転したままになります。しかも、固定点がズレていきます。



     またバネみたいに ビヨヨーン が設定できるかもとか思いますが、
    今は形状(階層構造体)が回転しても、下への垂れ下がって欲しいところです。
     では、どうするんか??・・・ICELagaoが設定している所自身が回転してしまっている・・・と考えると、
    このICEを設定しているものは別の所、回転しないところに設定する・・・、と考え・・、
    そう・・、今までサンザンやって来た、PointCloud に ICELagao を設定するのです。
    その サンプルシーン が Lagoa_Transform_Constraint.scn で、開くと下図のようになっています。

     

     このシーンでは、形状変化する Torus を回転しても 下方向 に変形していきます。
    もちろん、LagoaSetupConstraint はコンパウンドであり、その中身は今までやってきた内容と ほぼ 同じですが、
    違いがある部分を今作成している 布のシミュレーション に設定します。

     まずは、プレミティブ>ポイントクラウド>空 で PointCloud を取り出し、ICESimulationのICETreeノードを設定します。
    実は、ICEのノード群は コピー&ペーストできるので、
    今までGridに設定していたICEノードをSimulationRoot以下を全選択して コピー(Ctrl+C)し、
    新しく作成した PointCloud のICETreeノード以下の場所に ペースト(Ctrl+V) します。
    元のICETreeは削除しておきます(右下のフリーズを使用)。
     さて、ここでコピーして来たノード群は 真っ赤 なはずです。それは、発生源(Emmiter)用のノードを変える必要があるからです。
    使うのは Lagoa Init Geometry ではなくて、Lagoa Emit Mesh です。
    それに置き換えて、EmiterInNameの接続部に 布として形状変形するGridノードを接続します。これで 青くなって 動き出します。
     が!!! あれ? 
    今度は、頂点の移動でシミュレーションが動いているが、ポリゴンの形状がそれに伴って動かないという現象になります。
    これは PointCloud でシュミレーションした結果を ポリゴンに反映してないからです。
    これも上記サンプルシーンで良く見るとそうなっているのですが、Lagoa Advect Simulated Mesh (Lagoaシミュレーションメッシュ移流)ノードを使用します。
    Lagoa Advect Simulated MeshのノードのInNameに 布として形状変化するGridノードを接続し
    Execute をSimulationRoot の PostSimExecute1 に接続します。
    これは頂点シミュレーションの結果後、一番最後にその計算された頂点位置にポリゴンの形状を付着させている、ということですね。



     これで、回転値が付いても下に布が垂れ下がります。しかも ピン止めした位置も変化しません。

     では、もう一回、少しキャラに使用しているポリゴンに近い形状で試作してみます。・・・・こんな感じです。
    Lagoaの各設定は調整でどんどん良くなりますが、急がずじっくりテストしてみてください。



     PointCloud を使ってLagoaを設定している場合、ポリゴンを Lagoa Advect Simulated Mesh ノードを使って変形させるのですが、
    幾つかのパターンでうまく動作しないことがありました。
     ・斜め字の ICETree(Pointcloud) というノードが、きちんとSimulationコンストラクションモード以下にあることを確認してみてください。
     そんなのが無い・・という場合は、一旦そのポリゴンに IceTree設定画面から シミュレーションICETree ノードを作成すると出来ます。
     Simulationコンストラクションモードの階層が出来たらIceTreeノードを削除します。
     ・この設定作業前にICETreeを作成したことがあった場合、Simulationコンストラクションが残っているが、
     これをリフレッシュする意味で、一旦削除し、
     改めて ICEシミュレーションをもう一回作成してからそのノードを削除すると、動作する場合もありました。



    この試しデータをWindフォースに強弱のアニメーションを付けると、このようなアニメーションになります。


    この時の設定は 以下の通り。
    Lagoa Main Material では、Inelastic Setting で自己作用、Elasticity Setting で元形状に戻ろうとする値。



    Lagoa Add Forces では、AirDensity で戻ろうとする時の抵抗値、 のアニメーション値。



    Lagoa Simulate Multiphysis では、TimeStep 値の増し、Optimization and Debug で有効にしている機能 を設定しています。
    衝突判定に重要な項目が、TimeStep 項目の Substeps です。
    ここはポリゴン数(頂点数)の問題ではなく、衝突判定の精度を決める値です。
    ここは 以上ないと頂点が当たり判定物に突き抜けてしまうのですが、
    値を大きくすると 処理が重くなってきたり、衝突した際の振る舞い (アニメーション) も変わるので、
    フレキシブルさが欲しい時は低い値の方が良いという 板挟み状態 です。
     あと、ちょっとだけでも Collisions 項目の Offset Collision 値を入れておくと考慮されます。



     では、もっとキャラの階層構造体に設定してみました。
    この場合、何処に置くのが正常動作して扱いも便利か 悩むところです。
    動きも速いとめり込みが発生し、Substeps が 3 くらいのままで動くよう、各所調整が入ります。
      Lagoa Main Material で Interfaces > Material Collision Offset が 0.006
      Lagoa Simulate Multiphysics で Collisions > Offset Collision が 0.095
    そして、初期位置からのスタートの場合うまく動作するのですが、いきなりあるポーズをした状態(位置)からのスタートだとうまく形にならないなど、
    まだまだ・・・研究の余地がありそうです。



    一旦ここまでとして、また話題を変えます。



Lagoaのキャッシング

 
 Lagoa Emit Mesh の場合
    さて、Substeps が上がったりすると結構シミュレーションが重いです。
    そこで、動きが良いようなら、キャッシュに保存して、タイムラインをスクラブしても動くようにして最終的な動きの確認をします。
    その後はレンダリングに移れますね。
     以下に記述するキャッシングの例は、Lagoaのパーティクルを発生しているノードが Lagoa Emit Mesh の場合です。
    <つまり、Lagoa Setup Jello のように Lagoa Emit Volume の場合は別です。>

     スカートだけのシーンに戻ります。
    キャッシュする方法は、現在3つくらいはありますが、ここではガイドに載っている例で。
     1) ICETreeシミュレーションのある PointCloudノードを選択した状態で
        パーティクル>シミュレーション>選択項目でキャッシュを保存 を実行します。
     するとキャッシュの保存が開始されます。
     ここで勝手に始まるのですが、保存される場所は、今作業しているプロジェクトの \Simulation\skirt1\pointcloud となったりします。



     2) PointCloudノードを選択した状態で
        パーティクル>シミュレーション>選択項目からキャッシュをロード を実行します。
     すると 新しい Cache_モデル名_pointcloud というノードが自動的に作成され、
    そこにミキサーオペレーターが作られ、同時に、元のpointcloud が非表示になります。

     3) Cache_モデル名_pointcloud ノードを選択した状態で
        パーティクル>エミッションシ後>キャッシュ済みシミュレートポストエフェクト>ポイントの移流 を実行します。
      すると、 選択画面で表示されるので、そのままの設定である Selected cloud is already cached でOKボタンを押します。
     Lagoa_Advect_points が作成されます。



     4) 設定画面 も表示され、以下のような赤線の設定にします。
    この状態で、黄色い点 はもう動いていますが、ポリゴンがその動きを追従しません。



     では、その動きをポリゴンに付ける設定をします。

     5) まず最初に、元々のPointcloudのICETreeを開き、発生するポリゴンをGetノードで指定している接続を解除します。
     これで、ポリゴンに方に付いている斜め文字のICETreeが消え、シミュレーションではポリゴンが動かないようになります。
    ここから無効 にしてけば シミュレーションも実行されない状態になります。



     変形する方のポリゴンに ICETreeノードを作成し、
    DataAccess > Cache on file ノードを取り出して、FileModeを ReadCacheにして、先ほど保存したキャッシュファイルを指定します。

    なんと、実はこの Cache on file ノードを使ってもキャッシュの書き出しが可能なんです。
    面白いのは 複数のキャッシュをブレンドすることも可能です。

     これでOKな、あれ、となるはずです。ポリゴンの位置が合ってない場合は、
    以下図のように SRTtoMatrixを使ってポリゴン位置にオフセット値を付けてしまうのはどうでしょうか。ここでは 0.0.0. です。



     これでタイムラインをスクラブすると負荷なく動き出します。


     本当は、この先も記述したかったのですが、探求している時間がもったいない。。。。
    そんな時間を待っているよりは、一旦皆さんに情報を公開してしまおうと考えました。
     ここまでのものですが、どうぞ参考にしてください。




     という訳で、次回は また、モデリングもしたいな。
      乞う、ご期待!!