usdviewでキッチンセットを詳しく見てみよう(1)
前々回の記事でUE4でのUSDを調べた時に 「親の顔より見ているキッチンセット」 というぐらいに
キッチンセットに関してはずっと見ている私ですが、
このキッチンセットのサンプルとしての優秀さというか、よくできている所、ポイントが
普通に見ただけだとわかりにくいところが結構ある(自分がそうだった)ので
今回は趣向を変えて、USDの神サンプルキッチンセットがどういうふうにできているのか
USDのサンプルとして見るときに、どこを見るとよいのかみたいなことを
USDをこれから調べたり、USDでのシーンを構築しようとしている人向けにまとめていこうと思います。
キッチンセットとは?
キッチンセットとは、USD公式サイトからダウンロードできるアセットのサンプルです。
このキッチンセットをみることで、USDのコアになるコンポジションアークであったり
レイアウトの要であるモデルヒエラルキーの構造であったり
レイアウトをするためのコンポーネントの構造であったり
USDを使用してシーンを構築する上での基本的なところがきっちり抑えられたサンプルになっています。
シーンを開いてみる
まずはシーンを開いてみます。
ダウンロードしたKitchen_set を解凍してみると
そのフォルダ以下はこうなっています。
のでまずは、 Kitchen_set.usd を usdview で開いてみます。
開くことができました。
コンポジション
開いてみたところで、もう少し詳しく見てみます。
まず、USDの特徴は複数のUSDファイル(レイヤー)を合成することで
1つのシーングラフを作ることができるというものです。
このキッチンセットも、この仕組で組立てられていて、今開いた「Kitchen_set.usd」は
配置されたメッシュデータ本体は持っておらず、
あくまでも「リファレンス」を使用してシーンに読み込まれたものです。
リファレンスは、あるレイヤーをあるPrimに対して接ぎ木するように読み込みます。
リファレンス(リファレンスに限らずコンポジションで合成されたもの)があるPrimは
このように、シーンのTreeViewのPrimNameがオレンジ色に表示されます。
このオレンジ色に表示されているPrimをクリックして、「Composition」タブを
クリックすると、選択しているPrimにリファレンスしているレイヤーを表示することができます。
このKitchen_1というのがなにかというと、
この家の壁部分になります。
Kitchen_1以下も開いてみると、
このようにGeom以下にMeshPrimが配置されています。
他の階層もみてみると、Props_grpの下を見ると、
このように複数のモデルがリファレンスで読み込まれていることがわかります。
コンポジションの表示。
つまり、この Kitchen_set.usda は、
Kitchen_setPrim(いわゆるトップノード)以下に、
ある程度グループ分けしたあと、
実際のモデルをリファレンスでロードして配置しているのがわかります。
コンポジションの構造
ある程度グループ化した状態で、シーンをロードしていることがわかりました。
ですが、先程のコンポジションのタブを見てみると、
このように、 Bowl.usd だったり Bowl_payload.usd だったり Bowl.geom.usd
だったり、複数のusdファイルが表示されていることがわかります。
これがどういうことかというと、ここで表示されているコンポジションは
選択したPrimを構成するのに必要なすべてのレイヤー が表示されているからです。
USDというのは、リファレンスの中にリファレンスだったり、ペイロードだったり
複数のコンポジションを組み合わせて指定することができます。
まずは、このBowlを参考に詳しく見てみます。
まずは、Kitchen_setのBowlC_1 Prim がどういうふうに構成されているかを見てみます。
このBowlC_1は、 Bowl.usd を「リファレンス」しています。
このBowl.usd がどこにあるかというと、 assets/Bowl 以下に保存されています。
このBowlを usdview で開いてみると
このようなシンプルなモデルなモデルが保存されています。
Bowl.usdとKitchen_set.usdの関係性はこうなっています。
Bowl.usd を BowlC_1 にリファレンスした結果、 Bowl.usd 以下のPrimが
BowlC_1 に合成されているのがわかります。
しかしよくよくBowl.usdを見直してみると、
Bowl.usd 内のBowlPrimの段階で色がオレンジ(なにかしらのコンポジションがある)
というのがわかります。
つまりは、この段階でコンポジションがすでにあることがわかります。
実はこのあたりを詳しく説明しているんのが
この、Houdiniアドカレ2020の記事の内容です。Kitchen_set.usd は、いわゆる「レイアウトをしているシーン」になります。
そして、レイアウトをするために配置するアセット(共通アセット郡)が
Bowl.usd のような Kitchen_set/assets 以下にあるUSDファイルです。
レイアウト用のモデル構造
Bowlを含む、Kitchen_setを構成するアセットは、全て共通のルールで
レイヤー(USDファイル)が分割されています。
この3つの関係性がどうなっているかというと
こうなっています。
geom.usd
まず geom.usd
これはファイルネームから想像できるとおり、Geom(メッシュデータ)などを含むレイヤーのことです。
Bowl_geom.usd を開くと、このようにメッシュが入っているレイヤーになっています。
この段階でもまだコンポジションがあることがわかります。
これがなにかというと、バリアントセットがこのgeomデータ内にしこまれています。
バリアントセットは、複数の選択肢を切り替えできるようにするコンポジションです。
切り替えるには、Meta Dataタブを開きます。
このBowlには、6つのモデルが含まれていて
バリアントを切り替えると、モデルが切り替わります。
ペイロード
上のMeshデータを含むUSDファイルを、このペイロードがリファレンスしています。
payloadレイヤーは、一見すると何もしていないようにみえます。
ですが、このペイロードレイヤーがあることにによって、
USDを開いたときに大きな効果を生むことができます。
それが、ペイロードの特徴の1つアンロード指定です。
リファレンスとペイロードは、基本的に両方とも効果は同じですが
大きな違いとして、ペイロードの場合「ロードしない」ことができます。
usdview Kitchen_set\Kitchen_set.usd --unloaded
usdview を開くときに、 --unloaded を追加してみます。
すると、ビューポートには何も表示されず、
先程は▼が表示されて下にモデルが読み込まれていましたが、今度は何も表示されなくなりました。
これは、ペイロードで読み込まれているレイヤーがアンロード状態になったからです。
これは、ロードされていないだけで、実際のコンポジションは存在しています。
なので、Primを選択して右クリックでロードすることができます。
これがどういうときに効果を発揮するかというと、
キッチンセットのような軽いシーンであればなんの問題もないですが、
これが超巨大な背景だったとすると、1つのシーンで数十ギガある...みたいなことも
当然考えられます。
そいういうときに、修正のためにシーンを開きたい場合も
すべてのデータがロードされるまで待たなければいけません。
ですが、多くの場合は巨大なシーンのうちカメラから見えるごく一部を調整したい...
みたいなことはザラにあります。
そういう場合、ロードせずにシーンを開いたあとに一部だけ表示したい
みたいなことを可能にするのがこのペロードです。
もちろん、Kitchen_set.usd に読み込むときにペイロードにしても良いですが
予めアセット側に対してペイロードが仕込んであれば
レイアウトする時は特にきにせずリファレンスで配置していけば良くなります。
なので、このキッチンセットのアセットには、
このように、実際にロードするアセット名のレイヤーとメッシュデータを含むgeomレイヤーの間に
かならずペイロードをするレイヤーが挟まっています。
モデル構造まとめ
まとめると、
Kitchen_set.usd でレイアウトしているアセットはassets以下に保存されています。
アセットは1つのレイヤーではなく、レイアウト時に便利なようにレイヤーの構造が
作られていて、 geom -> payload -> レイアウト時に読み込むレイヤー
という構成で作られています。
このような構造にすることで、レイアウトしているシーンを開くときに
アンロードして一部だけ読み込めるといったことができるようになっています。
(1)まとめ
このキッチンセット単体でみても、数多くのレイヤーで構成されていることがわかりました。
レイアウトシーンに対してどのようにモデルをロードしているのか
そのロードしているモデルがどういう構成でつくられているのか。
このあたりを追っていくだけでも
実際にUSDでシーンを構築する上での大きな参考になります。
もちろん、このサンプルの構成だけではなくさらに自分の思ったように構築もできますが
まずはこの構成を参考に組み立てつつ、必要に応じてレイヤーのコンポジションを
追加していくと、わかりやすいのではないかと思います。
長くなったのでもうしばらく続く!!!
Discussion