Houdiniの群衆をSOLARISに持って行ってみよう(1)
浜タコさん(@hamatako)の群衆勉強会で群衆のパイプラインワークフローを色々聞いていたら
Houdiniの群衆をSOLARISに持って行くと、
AgentがUsdSkelになるというのを聞いたので
どういう形で出てくるのかをチェックしてみました。
サンプルを開く¶
まずは、群衆のサンプルシーンを開きます。
開くには「Crowd」タののギフトボッククスっぽいものをクリックすると
群衆サンプルシーンを開くことができます。
読み込むと、こんな感じのシーンを開くことが出来ます。
Streetなので、こんな感じのシーンです。
SOLARISに持って行く¶
読み込んだら、シーンをSOLARISにもって行きます。
StageNetworkに移動して、SceneImport(all)ノードを作ります。
このノードを使用すると、Houdiniの世界をそのままSOLARISに持ち込むことが出来ます。
usdviewで表示¶
持ち込むことができたら、とりあえずusdviewで見れるように出力します。
USDROPを使用して、usdファイルとして出力してみます。
ValidFrameRangeがデフォルトだとCurrentFrameだけでアニメーションが出力されないので
Render Specific Frame Range にしておきます。
完了すると、指定フォルダにusdファイルが出力されます。
出力されたファイルはusdviewなどでも開くことができるようになります。
もう少し詳しく見てみる¶
出力はできたようなので、実際どのような構造USDとして出力されているのか細かく見ていってみます。
全体¶
まず、全体のシーングラフ。
これはHoudiniの構造がそのままUSDのシーングラフとして出力されます。
こちらがHoudini
USDはこちら。
大きな違いは「crowd_sim(DOP Network)」が出力された側には存在しません。
あくまでも出力されているのはSOP Networkのノードのようです。
Agent¶
エージェントは個別のモデルデータです。
個別のAgentは、それぞれusdとしてMeshが出力されます。
しかし注目はこのモデルには SkelもWeightもはいっていない です。
あくまでもTスタンスのMeshのみが各Agent名のフォルダに出力されます。
各モデルは、出力されている usda ファイル直下に読み込まれています。
しかし、あくまでもこれはHoudiniのシーングラフと同じ場所に同じように出力されているだけで
このモデルは並べるのには使用されていません。
なので、全シーンをSOLARISに持ち込んだ場合、このモデルが持ち込まれますが
Agent関係のPrimは本来は不要になります。
crowdsource¶
では、実際のモデルの組み立てがどこで行われているかというと
実際のCrowdSimをしているであろうcrowdsourceで
USD側もSkelとMeshの組み立てが行われています。
agentdefinitions内で、Mesh(Meshはshapelibrary内にある)とSkelがReferenceで構築され、
個別のagentでReferenceで読み込まれます。
注意点としては、このRefernceは「現在のレイヤー内にあるMeshやSkeletonPrimをReferenceしている」
ということです。
SOLARISから出力されたときに個別のusdとして出力されていますが
このファイルは外のAgentは読み込んでいません。
Group¶
シミュレーションはcrowdsourceで構築されていたようですが、最終的な出力は別のGeometryで出力されています。
これは、crowdsourceから、objectMergeを使用して
指定のGroup名になっているAgentだけになるようにしています。
このobjectMerge分も個別のusdになっています。
注意が必要なのは、このcrowdsourceを読み込んでいるobjectmergeのusdはcrowdsourceは見ていなくて
個別のデータになっていることです。
あくまでも、このobjectMergeのデータ内でのみ完結しています。
まとめ¶
SOLARISにAllで読み込むことで
群衆をSOLARISに持ち込むことが出来ますが、その場合不要のノードが大量に読み込まれてしまいました。
なので、Scene Improt(All)は不味い。
Scene Import(All)の場合の挙動は、
・obj下にあるものはDisplayFlg関係なく、すべて持って行く
・obj下のGeometry1つ=usのレイヤー扱い
・Geometry単位で完結していて、そこから外は参照していない?
ようなので、今回のように「Agentモデル」「Setup」「Sim」「Output(Group化)」のように複数階層存在する場合は
Outputとして作成したGeometryのみをSOLARISに持ち込まないとだめです。
さてどうするかと思ったのですが
素直にsopimport で各グループのジオメトリにしている object_mergeのノードを sopimportでロードして
USD ROPで持ち込むのが正解のようです。
結果。
各Agentとアニメーション、Setupをしているagentdefinitionsだけが出力されました。
Import Allだとほんとうに全部Importしてしまうので、
不要なもの(GeometryのDisplayFlagがOffになっているもの)がある場合は気をつけないといけなそうです。
おまけ¶
なにかの不具合か、Skeletonがエラーになる模様。
MakeInstanceすると壊れる模様(Houdiniもお亡くなりに...)
ひととおりの挙動は理解できましたが、どうあるべきかはまだまだ考える余地はありそうです。