Skip to content

SOLARISでUSDファイルを開く

Houdini Apprentice Advent Calendar 11 日目は、
Houdini18 にて新しく追加された Layout/Lookdev/Lighting を行う SOLARIS にて
USD ファイルを開いてみよう
です。

USD/SOLARIS

と、始める前に軽くおさらいというか USD について。
USD というのは Pixar が作成したシーングラフを扱うためのライブラリで、
複数人が同時に作業を行うために作られたファイルフォーマットです。

いままでのファイルフォーマットと大きく違うのは
「プロシージャルシーングラフ」と呼ばれる、複数の USD ファイルを「プロシージャル」に
合成して、1つのシーングラフを構築できることです。

ローンチセミナーのスライドより。

SOLARIS では、この USD をネイティブでサポートし
その USD ファイルを SOP を扱うように、プロシージャルに合成し、
1つのシーングラフを構築することができます。

もう1つの特徴が、この SOLARIS(Stage ネットワーク)上のノードというのは
メモリ上であったり、ファイルだったりはある物の
そのノード1つづつが USD ファイルであり、レイヤーとして扱われています。

ノードの処理= USD 処理=プロシージャルシーングラフ構築

というのが、この SOLARIS の世界であり
SOLARIS の世界は USD の世界そのものでもあります。

というのが、ざっくりとした SOLARIS と USD の概要です。

USD ファイルをダウンロード

というわけで開く前の準備段階。
今回のサンプルを USD ファイルを、Pixar 公式から持ってきます。

http://graphics.pixar.com/usd/downloads.html

場所は公式のダウンロードサイトから、毎度おなじみ KITCHEN SET をダウンロードします。

SOLARIS を開く

ダウンロードできたら Houdini18 を起動します。

起動できたら画面のレイアウトを Solaris に変更します。

画面構成

SOLARIS の画面には、今までの Houdini にはなかったビューが2つほど追加されています。

まずひとつめが、 Scene Graph Tree
これは、現在選択中のノードの段階の「USD のシーングラフ(いわゆるステージ)」を表示します。
この SOLARIS は、「USD のプロシージャルシーングラフ」を表し
ノード1つが USD ファイル=レイヤー扱いです。
ノードの接続をすると、プロシージャルにそのノードが合成されていきます。
そして、現在選択している または ディスプレイフラグオンになっているノードの
段階が「そこまでのノードがコンポジションされた結果」です。

その結果できあがったシーングラフが表示されているのが
この「Scene Grapth Path」です。

もうひとつが「Scene Graph Detail」です。

これは、選択中のプリミティブのアトリビュートやその他諸々情報を核に出来るパネルです。
細かいところを説明し始めると、ここだけで1記事できるぐらいの物量があるので
今回は割愛しますが、個々を見るとどうコンポジションされてるかとか
現在のアトリビュートの値などを見ることが出来ます。

この2つは、SOLARIS の機能というより USD に付属するものになります。
SOLARIS でシーングラフを構築された結果がこの2つに表示されるので
ノードを作ったりするのと併せてこの2つのパネルを確認すると
色々とわかりやすいです。

ので、下の解説でもあわせてこの2つを表示していきます。

USD、開いてみよう

というわけでようやく本題に移動します。
ダウンロードした USD ファイルを Houdini/SOLARIS で開いてみます。

まず、USD ファイルを開くには「LoadLayer」ノードを使用します。
何故に LoadUSD ではないのかというと、
USD では USD ファイルのことをレイヤーと呼ぶからです。

このあたりの詳細は、
Stage/Layer/Spec
以前の記事を参照をば。

ただし、キッチンセットは Zup なので
そのままだとおかしくなるので 3D Viewports を開き、

Orientation を「Z UP」に変更します。

無事読み込みができました。
あとはこれにいろんな処理をしていけば OK です、、、と言いたいところですが
実は SOLARIS にはいろんな USD の読み込み方法があります。
せっかくなので、他の読み込み方法もみていきましょう。

LoadLayer

まず、上で使用した LoadLayer は「指定の USD をレイヤーとして読み込み」ます。

SceneGraphPath を見るとわかりやすいですが、このノードを使用すると
ルートしたにたいして、指定の USD をそのまま「ロード」します。
他のことはなにもしていません。

コンポジションアーク系のノードで開く

では、LoadLayer 以外ではどういう方法があるかというと
SOLARIS のノードとして用意されている各種コンポジションアーク系のノードで
読み込んでみます。
このノードで読み込むと、コンポジションアークの機能と併せて
USD ファイルをロードできます。
このように読んだ場合、ロード先の usda ファイル内の ClassPrim は隠蔽され
オーバーライドしたりすることはできなくなります。
しかし、LoadLayer でロードしてから、そのノードを Reference ノードに接続する場合、
リファレンスで読み込みたいレイヤーを一度サブレイヤー合成し
その後に \</sdfPath...>こんな感じでシーン内にある Prim を
リファレンスとしてロードする形になります。

この場合、レイヤーはカプセル化されず、指定のレイヤー内の別 Prim もロードされるので
継承処理と同じように、リファレンス元の Prim をオーバーライドできるようになります。
詳しくは こちら にて検証をまとめているので
参考にしてください。

SubLayer で開く

まずは、Sublayer ノードで開いてみます。

サブレイヤーで開いた場合は、基本は LoadLayer で読み込んだ場合と同様です。

Scene Graph Path も、LoadLayer したときと同様になります。
loadlayer したときとの違いは、このノード1つで USD ファイルをサブレイヤーで合成できることです。

たとえばこんな感じで3つのファイルをロードします。

base.usda がこんな感じの緑の玉として。

add_color.usda で赤く色を変えて

final.usda で四角くするようにしてみます。

そうすると上から順番に合成されていき、すべてが合成された結果がこのノードの結果として出力されます。

このサブレイヤーで複数 USD を合成するメリットとしては
Mute Layer や Enable を使用して USD の効果を ON/OFF 出来ることです。
たとえば、この3つのサンプルのうち「add_color.usda」をミュートにしてみるとします。

するとどうなるかというと、「赤くする」という レイヤー(USD ファイル)だけがミュートされて
緑のキューブになります。
このように、2D ソフトのレイヤーを ON/OFF するように
USD のレイヤー効果を簡単に切り替えつつ確認出来るのが Sublayer ノードの効果になります。

読み込みしつつ、PhotoShop のレイヤーのように ON・OFF したりできるのが
このノードを使用して読み込むメリットですね。

Reference で開く

つぎに、Reference ノードを使用してロードしてみます。

リファレンスノードは、MultiInput の入力結果を Reference 化するという機能もありますが


Reference Type を Reference Files にすることで、
このノードを使用して「Reference で USD ファイルを読み込み」することができます。

SceneGraphPath を見ると、プリミティブ名が緑になっていることが分かります。
また、LoadLayer の時と大きく違うのは「トップのノード名が違う」事です。
LoadLayer で読み込んだ場合は、USD ファイルに書かれているプリミティブの構造が
そのままロードされます。
しかし、リファレンスの場合は違い

Destination Primitive で指定したプリミティブ名の下に
Reference で読み込む USD の Primitive を読み込みます。
$OS とは、ノード名のことなので、ノード名である reference1 下に子のプリミティブが読み込まれています。

試しに リファレンスノードを右クリックし、LOP Actions > Inspect Active Layer を開いてみます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#sdf 1.4.32

def HoudiniLayerInfo "HoudiniLayerInfo" (
    customData = {
        string HoudiniCreatorNode = "/stage/reference1"
        string[] HoudiniEditorNodes = ["/stage/reference1"]
    }
)
{
}

def "reference1" (
    prepend references = @C:/pyEnv/JupyterUSD_py27/usd/Kitchen_set/Kitchen_set.usd@
)
{
}

このメニューを開くと、現在のノードの編集状況(=ノードの USD ファイル)を
アスキーファイルで確認できます。

すべてのノードはレイヤーと説明しましたが、この ActiveLayer というのが「このノードの USD」
なわけですね。
なので、コレを見ることで、このノードが今なにをしているのか、USD 的になにをしているか
確認することが出来ます。

で、見る限りリファレンスで読み込んでるのが分かります。

Reference ノードで読む事での違い ※ 2020/01/05 追記

後々ノードの細かい挙動を調べているときに判明したことですが
リファレンスノードを使用してロードした場合と、LoadLayer を使用してロードしたあとに
ノードを接続してリファレンス化する場合とで大きな差があることがわかりました。
その「差」がなにかというと、「カプセル化するか否か」です。

リファレンスノードでロードした場合は、USDA でみた場合
prepend references = @C:/pyEnv/JupyterUSD_py27/usd/Kitchen_set/Kitchen_set.usd@
こんな感じにファイルパス指定で、指定 Path の USDA の DefaultPrim または SdfPath で指定した Prim
をリファレンスでロードするようになります。

StageManager で開く

最後に、コンポジションアーク以外での開き方。
それが StageManager ノード。

チュートリアル動画だとこの StageManager を使用している例も多くありますが
上の3つとこの StageManager ではなにが違うのでしょうか。

大きな違いが「Stage」マネージャーとある通り、このノードは
これ単体でステージの構築を行うことが出来ます。

この場合のステージとは、複数の USD ファイルをコンポジションした結果の事を指します。

開くと、StageManager の画面は上の画像のようなウィンドウになります。
その中のフォルダアイコンをクリックします。

今までのノードは、1つのノードで1つの USD ファイルを読み込むものが中心でしたが
この StageManager はこれ単体でステージ(USD のコンポジションした結果のシーングラフ)を構築
出来るノードのため、複数の USD をリファレンスなどでロードして
グループ化などをしつつステージを構築することができます。

なので、この StageManager ノード単体で、ScenerGraphPath はリファレンスを含めて
完成されたステージが構築されます。(オレンジ色はコンポジションアークで読み込まれている物)

アスキーファイルをそのまま書いて開く

こんなことをするひとはほぼいませんが、inlineusd を使用すると、
USD ファイルをファイルではなく手書きで書いて読み込むことができます。

こんな感じで USD Source に対してアスキーで記述することで、

こんな感じで実際に SceneGraphPath にステージを構築することが出来ます。

じゃあ実際の所、どうやって開いたら良いの!!??

見ての通り、USD ファイルを開くだけでもやり方はたくさんあります。
こんなんじゃどうしたらいいかわからんよ!
って言う方に自分的オススメをご紹介。

たくさんのオブジェクトを配置したい場合は「StageMnaager」

ステージ内でレイアウトをしたい場合、下手をしたら何百というアセットを
ロードして配置する必要がでてきます。
そんなときに1つづつ読み込んだり、グループでまとめたりするのは非常に面倒くさいです。

そういうときは、StageManager を使用すると、リファレンスでまとめてロードだったり
複数アセットをロードしたりがドラッグ&ドロップで手軽にできて
グループ化したり、階層を変更したりと言ったオペレーションが手軽に行えます。

つまりは、このノード1つでステージの構築が完結するわけです。
なので、レイアウトなどはこのノードがオススメです。

もちろん、1つの StageMnager でまとめるとごちゃごちゃしちゃう!!!
という場合は、複数の StageMnaager を接続することも出来ます。
この場合、入力で受け取ったステージのシーングラフに対して+ α でアセットを足したりといった
ことが可能になります。

レイヤーをカプセル化したい場合は「Reference」

リファレンスで読み込みたいレイヤーの DefaultPrim または指定の Prim 以外を
「カプセル化」してロードしたい場合は Reference ノードを使用してロードします。
Reference ノードで読み込んだ場合は、指定 Prim 以外は隠蔽され
オーバーライドできなくなります。
なので、キャラクターを読み込みたい場合などは
リファレンスノードを使用してロードするのが良さそうです。

それ以外は「LoadLayer」

それ以外は、LoadLayer +コンポジションアークのノード or それ以外のべんりノード(Graft など)
を使用するのがオススメです。

LoadLayer で読むパターンは、このあと SOLARIS のノードベースで何かしらの構造を構築したい
(バリアントでバリエーションを作りたい、シェーダーのアサインをしたいライトノードを組み合わせながら
シーンを構築したい....等。

SubLayer や Reference でも直接ファイルを読み事ができますが
その場合入力順序を差し替えたり、一時的に OFF にしたりするのが非常にやりにくく
ノードでの一覧性があまり良くなくて私は使いにくく感じました。

LoadLayer でかならず読みこんでコンポジションしておくと、
切り替えしやすかったり、「ファイルを読んでる」というのが明確化するので
個人的には USD ファイルの単発でのロードは LoadLayer を使うのが良いかなと思います。

もちろん併用もできます

もちろん StageMnaager と LoadLayer +コンポジションアーク系ノードの併用も可能です。

まとめて StageMnager でシーンを構築しつつ、細かいバリエーションはノードで作って
最終的に合成する、、、、という風に
複数の USD の開き方を、良い感じに使い分ける事で
複雑なシーンを極力シンプルにノードを構築することも可能になります。

まとめ

こんな感じで、SOLARIS/LOP 内での USD ファイルの開き方の紹介でした。
USD ファイル1つ開くだけでこれだけいろんなアプローチがあるのが凄いところです。
これに+ SOP のシーンを LOP で開いたりなんかもできるので
SOLARIS は USD を扱う上では非常に柔軟かつ、考え方次第でいろいろな USD オーサリングを可能にする
ツールだなと思いました。

SOLARIS 記事一杯書こうといった第一弾がこんな記事でいいんだろうか?
次は今回さらっと書いたコンポジションアーク系のノードについて
もう少し詳しく書いて行こうと思います。