AssetInfoについて
Universal Scene Description AdventCalendar2021 13日目は、
AssetInfoについてとその使い方です。
AssetInfoとは¶
AssetInfoとは、USDで作成されたアセットを管理・識別するために、
PrimやPropertyに対して指定することができる辞書型のメタデータ です。
USDは、Stage/Layer/Specの回で説明した通り、1つのファイルから構成されているわけではなく
1つのステージに対して複数のファイルによって構成されています。
その大量のファイルの依存関係がどのようになっているのかをAPIを使用して把握することはできますが
かなり深いところを触る必要があり(たとえば、データをサブミットしたりビルドしたりするときに
あるステージの構造を検索しようとすると、かなり大変なことになります。
(いわゆる「できないわけではない」)
AssetInfoをアセットに対して指定しておくと、
レイアウトしているシーン等から
「今のステージがどのようなアセットで構成されているのか」
「今のステージがどういう意図になっているのか」
を、特定すことができるようになります。
Kitchen_setみてみる¶
説明を見てもピンとこないので、具体的な例をまず見てみます。
Kitchen_setにある Ball.usd を usdviewで開いてみます。
MetaDataタブを確認するとassetInfoに identifier と name が指定されていることがわかります。
Kitchen_set.usd を開き、Ball.usdをペイロードしているPrimをみると
Meta Dataに、 Ball.usd に指定されたAssetInfoが確認できます。
指定できる情報¶
AssetInfoには、そのアセットを管理するための情報がDict型で入っています。
1 2 3 4 |
|
Dict型なので、こんな感じでどんな情報でも入れることができますが、
デフォルトでは以下の4つを推奨していて
API側でもその4つがデフォルトで用意されています。
型 | ||
---|---|---|
identifier | asset | コンポジションアークでターゲットにする時のファイルパス いわゆるこのAssetInfoが指定されている(自分自身の)ファイルパス |
name | string | アセット名。 データベースへのクエリなどに使用 |
payloadAssetDependencies | asset | 動的に依存関係を検索するときに使用するアセットがペイロードしているアセットを指定する。、 事前にペイロードの依存を計算しておくことで、全部をロードしなくてもアセットの依存関係を把握できる。 |
version | string | アセットのバージョンを設定する。 ShotGridなどでアセットを管理している場合などに、追跡するのに使える |
以上4つです。
アセットのバージョン管理などは、ShotGridなどといったデータベースを使用することが多いとおもいます。
ですが、そういったデータベースとは別に、アセット自体にも管理用の情報(name や version)は持たせたいはずです。
デフォルトで推奨されているAssetInfoは、まさにそういった用途で使用するものになっています。
asset型は、アセット(USDファイル、テクスチャを含む)を指すためのパスを表す
参考:USD は手書きするもののアトリビュート
AssetInfoを活用する¶
どのような情報が保存されているかはわかりました。
これを実際にどう活用していけばいいのか、
「今のステージがどのようなアセットで構成されているのか」
を、AssetInfoを使用して調べてみます。
Flattenした場合のAssetInfo¶
USDには、現在のStageを「Flatten」することで、すべてのコンポジションアークを実行した結果の
シーングラフを出力する機能があります。
Flattenしてしまうと、コンポジションの情報もすべて解決された状態になるため、
Compositionをみても、Layerは存在しません。
つまり、Flattenする前、どのようなLayerによって構成されていたのかは
Compositionから追うことはできません。
Flatten前
Flatten後
ですが、AssetInfoをみてみると
どのAssetがどこに置いてあるなんのアセットなのか、Flattenした後でもわかります。
Kitchen_setにはversionははいっていないが、
入っていればFlattenした段階でどのバージョンのアセットかもわかる...ということになる
依存解決のためのAssetInfo¶
もう1つが、アセットの依存解決です。
最初に説明した通り、現在のStageがどのようなコンポジションによって構成されているかは
PCP等を使用すれば検索することは可能ですが、
複雑なStageをPCPを使用して依存を調べるとすると、かなり大変です。
さらに、「あるレイアウト済のシーンに配置しているアセットを収集したい」ということがあった時
使用するアセットを調べるためだけに巨大なシーンを開くのは効率的ではありません。
そういったときに、PayloadをアンロードにしてStageを開いて(アセットをロードしていないので、配置情報だけのロードで済む)
使用しているアセット情報だけを取得したい、、、ということはよくあると思います。
そういう場合に、AssetInfoは使用することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
例としてKitchen_setで使用しているアセットの一覧を取得した場合。
StageはLodNone(アンロード状態)で開きます。
この状態だと、アセットの依存を取得できません。
ですがPrimのAssetInfoを見てidentifierやnameが指定されていれば、そこからデータを収集することができます。
上の例だと、アセットの中に別のアセットへのコンポジションがあると検索できませんが、
あらかじめ使用しているアセットをpayloadAssetDependenciesにセットしておけば
すべてのレイヤーをアンロードにした状態でも、そのStageを構成するアセットの一覧を取得することができます。
備考
Resolverは別の記事にてまとめ予定です。
TF_DEBUGでのAssetInfoの確認¶
USD・Hydra の環境変数と仲良くなる の記事にて、アセットの解決時に
どのように変化していくかを確認するためのDebug設定が紹介されていましたので
合わせて確認してみると、USDコンポジションの解決がどようにされているか確認できるので
試してみると面白そうです。
まとめ¶
以上AssetInfoについてとその使い方でした。
アセットを管理するのにAssetInfoはとても有効です。
Houdini19に新しく追加されたComponentBuilderでは、このAssetInfoを自動で追加してくれますので
レンダリングを実行する前に依存を解決してデータチェックをしたい時、
ShotGridでアセットを管理するときにアセット側にも情報を持たせたい時など
ぜひとも活用してください。