USD関連リサーチメモ
SubsetのHelpはここ。
GeomMesh取得して、Subsetを作って、Assignする。
Assign方法はPrimに対してと変わらずだけど、Subsetを経由することでFaceID単位でのマテリアルアサインを可能にする。
以下しばらく Dynamic File Formats を実装する用メモ
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の値にアクセスしたり変更したりできる。
usdDancingCubesExampleのコードを読みながら、わからなかったC++の書き方をメモ。
_InitFromParams 関数内で、 .usd に記述されたメタデータを元にシーングラフを構築。
_primSpecPaths _primChildNames _leafPrimDataMap が
シーングラフのデータを保存している部分。
これを、 _HasPropertyTypeNameValue関数を経由して SdfAbstractDataのGet関数Has関数から
参照しているっぽい?
Tf~~関係はPythonではあまり使わないので、もうちょっと調べたほうが良さそう。
参照カウンタ
サンプルで動作や書き方などを確認。
Getのうち、どのフィールドを取得するかは field の SdfFieldKeys で判定する。
その中でわからなかったこととか。
Specifier
SdfAbstractDataのGetで取得しているもの Speciferとは Prim定義の def over class のこと。
enum SdfSpecifier {
SdfSpecifierDef,
SdfSpecifierOver,
SdfSpecifierClass,
SdfNumSpecifiers
};
pxr/usd/sdf/types.h に enumで定義されていた。
こんなページあったんだ。。。
SdfとPcpとUsdの関係性を改めて確認するためにドキュメントを見る。
ちゃんと読み直すと、色々説明かいてある
Sdf (Scene Description Foundation)
Scene Description をUsdのフォーマットやプラグイン定義フォーマットにシリアライズするための基盤を提供する。
SdfPath SdfLayer SdfPrimSpec等、Scene Description とアクセスするための構造を提供するもの。
Usdは複数のレイヤーによって合成されたSceneGraphであり、SdfPrimSpecがどのように関係しているかを持っているが
Sdfは、他のレイヤーとどのように関係しているか どのように合成されているかの情報を持っていない。
SdfPathは、SdfLayerに保持されている値をアドレス指定してアクセスするためのストレージキー
あるいは、あるシーングラフオブジェクトまでの Namespaceであったり
他のオブジェクトを参照するための方法を提供する。
Pcp (PrimCache Population - Composition)
Usdのレイヤー合成(コンポジション)
あるPrimがシーンディスクリプション(usdファイルすべて)がこのPrimにどのような影響を与えているか
どのように構成されているのかを司る。
PcpPrimIndexはコンポジション機能だけを担うもので、シーングラフの親子関係(階層構造)
は持たない。
Pcp自体は、あるPrimに誰が意見を持っているかを提供しているだけで
最終的な値はなにか とか、シーングラフのオブジェクトの型であったりスキーマ は
UsdPrimの役割として分離されている。
UsdStageは、あるレイヤーへのインターフェースで、Pcpによって提供されるルール介して
データを(シーングラフを)解釈する。
Pcpは、どのUsdPrimがステージ上に配置されるべきかをUsdStageに通知し、
Usdが効率的な値解決を行うことを可能にするPcpPrimIndexオブジェクトを提供する。
それがこのあたり。
SdfはUsd(コンポジションされたシーングラフ)を知らないし、Pcpも最終的な合成された値などは持たない。
UsdではUsdPrimが親子階層を持ち、UsdStageがシーングラフへのアクセスやコンポジションへのアクセスを持つ。
UsdSKelまとめ。
Omniverseの場合、Reference以下は編集不可なので
UsdSkelを利用してShotの構造をUSDで作ろうとしたら
s##c###_charname.usd に、Charをサブレイヤー アニメーションをReferenceして
この charname.usdを、s##c###.usd (ロード用)にリファレンスするような構造が考えられる。