コンテンツにスキップ

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もお亡くなりに...)

ひととおりの挙動は理解できましたが、どうあるべきかはまだまだ考える余地はありそうです。