Open14

USD関連リサーチメモ

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

以下しばらく Dynamic File Formats を実装する用メモ

https://graphics.pixar.com/usd/docs/api/_usd__page__dynamic_file_format.html

DynamicFileFormat とは、 .usd ファイル以外のファイルフォーマットを解釈して
USDとしてロードするためのプラグインを作れる機能。
なので、これを使えばFBXだとかOBJとかといったファイルフォーマットを usdviewで見たり
usdからリファレンスなどでロードできるようにできる。

SdfFileFormatを継承したクラスを作り、必要な関数を実装する。

bool UsdSimpleFileFormat::Read(
    SdfLayer *layer,
    const string &resolvedPath,
    bool metadataOnly) const
{
    
    SdfLayerRefPtr editLayer = SdfLayer::CreateAnonymous(".usda");
    
    UsdStageRefPtr stage = UsdStage::Open(editLayer);
    UsdGeomSphere::Define(stage,SdfPath("/Root"));
    layer->TransferContent(editLayer);
    
    return true;
}

とりあえず、Read関数のSdfLayer に対してプラグイン内で構築したレイヤーを
TransferContent でレイヤーを転送すれば良い。

SdfAbstractData

Scene Description Data を格納するためのコンテナ。
任意のSdfPathに対して、SdfAbstractDataは1つ以上のキーと値のペアを保持できる。
その保持しているPathの値にアクセスしたり変更したりできる。

https://graphics.pixar.com/usd/docs/api/class_sdf_abstract_data.html#details

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

usdDancingCubesExampleのコードを読みながら、わからなかったC++の書き方をメモ。

_InitFromParams 関数内で、 .usd に記述されたメタデータを元にシーングラフを構築。
_primSpecPaths _primChildNames _leafPrimDataMap が
シーングラフのデータを保存している部分。
これを、 _HasPropertyTypeNameValue関数を経由して SdfAbstractDataのGet関数Has関数から
参照しているっぽい?

https://snippets.cacher.io/snippet/920913d35340215a969d

Tf~~関係はPythonではあまり使わないので、もうちょっと調べたほうが良さそう。

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

Getのうち、どのフィールドを取得するかは field の SdfFieldKeys で判定する。
その中でわからなかったこととか。

Specifier

https://graphics.pixar.com/usd/docs/USD-Glossary.html#USDGlossary-Specifier

SdfAbstractDataのGetで取得しているもの Speciferとは Prim定義の def over class のこと。

enum SdfSpecifier {
    SdfSpecifierDef,
    SdfSpecifierOver,
    SdfSpecifierClass,
    SdfNumSpecifiers
};

pxr/usd/sdf/types.h に enumで定義されていた。

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

Sdf (Scene Description Foundation)

Scene Description をUsdのフォーマットやプラグイン定義フォーマットにシリアライズするための基盤を提供する。
SdfPath SdfLayer SdfPrimSpec等、Scene Description とアクセスするための構造を提供するもの。
Usdは複数のレイヤーによって合成されたSceneGraphであり、SdfPrimSpecがどのように関係しているかを持っているが
Sdfは、他のレイヤーとどのように関係しているか どのように合成されているかの情報を持っていない。

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

Pcp (PrimCache Population - Composition)

Usdのレイヤー合成(コンポジション)
あるPrimがシーンディスクリプション(usdファイルすべて)がこのPrimにどのような影響を与えているか
どのように構成されているのかを司る。

PcpPrimIndexはコンポジション機能だけを担うもので、シーングラフの親子関係(階層構造)
は持たない。
Pcp自体は、あるPrimに誰が意見を持っているかを提供しているだけで
最終的な値はなにか とか、シーングラフのオブジェクトの型であったりスキーマ は
UsdPrimの役割として分離されている。

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

UsdStageは、あるレイヤーへのインターフェースで、Pcpによって提供されるルール介して
データを(シーングラフを)解釈する。
Pcpは、どのUsdPrimがステージ上に配置されるべきかをUsdStageに通知し、
Usdが効率的な値解決を行うことを可能にするPcpPrimIndexオブジェクトを提供する。
https://fereria.github.io/reincarnation_tech/11_Pipeline/30_USD_Programming/01_Python/04_pcp_compositionArc
それがこのあたり。
SdfはUsd(コンポジションされたシーングラフ)を知らないし、Pcpも最終的な合成された値などは持たない。
UsdではUsdPrimが親子階層を持ち、UsdStageがシーングラフへのアクセスやコンポジションへのアクセスを持つ。

あんどうめぐみ@れみりああんどうめぐみ@れみりあ

Omniverseの場合、Reference以下は編集不可なので
UsdSkelを利用してShotの構造をUSDで作ろうとしたら

s##c###_charname.usd に、Charをサブレイヤー アニメーションをReferenceして
この charname.usdを、s##c###.usd (ロード用)にリファレンスするような構造が考えられる。