USDPython ドキュメントの読み方
概要まわりの文章化がうまくいかないので 最近大分 USD を Python で弄るのも分かってきた
ので、よく使うコマンド類とざっくりと公式ドキュメントから
Python のコードを書く時にはまったりわかりにくいところなどをメモをば。
モジュールの Import と、使い方
USD の API ドキュメントは
https://graphics.pixar.com/usd/docs/api/index.html
こちらにあるのですが、基本 C++なのと説明もとても難解なのでわかりにくいです。
ので、ものすごいざっくりと Python への読み替え方を説明。
まず、Python の Import について。
from pxr import Usd, UsdGeom, Sdf, Gf
USD のモジュールは pxr モジュールで、その中の各種スキーマやツール類を
インポートします。
ドキュメントの「Classes」下にライブラリのクラスや各種関数が並んでいるのですが
Python から使用する場合は頭の文字が import で読み込むモジュール名になります。
上の画像のよく使う UsdStage の場合は Usd モジュールの Stage になります。
from pxr import Usd
prim = Usd.Stage.CreateInMemory()
こうなります。
クラスの関数の調べ方
USD の各種クラスは、クラスの継承によって構造化されています。
「Inheritance diagram for #### 」を確認するとその継承関係がどのようになっているのか
ダイアグラムで確認することが出来ます。
例えば図の UsdGeomCube というクラスは UsdGeomCube に、使用できる関数が羅列されています。 ですが、ここにおあるのは UsdGeomCube 固有の機能だけであって移動したりバウンディングボックスを取得したりといった 機能は書かれています。
そのような、ほかのオブジェクトでも共通している機能は親のクラス (~ able という名前のことが多い)で定義されています。 Xformable なら移動を可能にするし、GeomBoundable には BoundingBox を取得する機能があります。
なので、ヘルプを見るときには、調べたいクラスのページを確認した後 Inheritance diagram を確認して、欲しい値がありそうな親クラスを確認します。
スキーマ関係の継承関係について
スキーマを定義したい場合、主に UsdGeom を使用することになります。
このスキーマの定義は「IsASchema」と呼ばれる 「A は B です」の関係によって定義されています。
たとえば、
UsdGeomXform は、UsdGeomImageable で UsdXformable です。
これらのダイアグラムの末端以外は「AbstractSchema」と呼ばれるもので
共通の定義をしてある基底クラスです。
ので、これらのクラスのインスタンスを作る事はできません。
これに対して、末 端の UsdGeomXform や UsdLuxDistantLight 、UsdGeomCamera などのスキーマは
「ConcreteSchema」と呼ばれるスキーマで
実際にスキーマとして定義(Define)することができるスキーマになります。
stage = Usd.Stage.CreateInMemory()
xform = UsdGeom.Xform.Define(stage, "/hello")
たとえば Xform スキーマを定義したい場合はこうなります。
UsdGeom.Xformable.Define(stage,'/hello')
これはエラーになります。
stage = Usd.Stage.CreateInMemory()
xform = UsdGeom.Xform.Define(stage, "/hello")
xform.GetXformOpOrderAttr() # Xformableで定義
xform.GetPrim() # UsdSchemaBaseで定義
当然のことですが、Xform は Xformable の関数も使えます。
すべてのスキーマで共通して使用する GetPrim などのような関数は UsdSchemaBase に定義されているので
ドキュメントを見るときは、継承関係を確認します。
引数の確認方法
USD のドキュメントは、C++のドキュメントのため Python のライブラリドキュメントと比べて非常に見づらいです。
その中でいくつか見方を紹介します。
ただし、そもそもドキュメントにある関数がなかったり、全く別の名前になっていることも 結構あるので、あくまでも参考までに。
const ~ <型>
const は、C++の 編集不可で参照渡しをするときに使用するものですが Python のドキュメントとして読み替えると <型> の値を引数で指定しろという意味になります。
たとえば、 ApplyAPI(const TfToken ~)とすると TfToken 型(↓ に詳細を書いてますが、Tftoken は string 型)を引数として渡せば OK です。
UsdGeomCube の場合、 const UsdPrim &prim=UsdPrim() のように、 = UsdPrim() とあります。 これは、Python の
def hogehoge(arg = 0):
return
このような、デフォルト設定付きの引数と同じで、指定がなければ prim=UsdPrim() の UsdPrim がデフォルトとして使用されます。
cube = UsdGeom.Cube()
なので、これでもエラーになりません。
指定したい場合は「Prim」型なので
prim = stage.GetPrimAtPath("/cube")
cube = UsdGeom.Cube(prim)
このようにすると、指定の Prim のスキーマオブジェクトを取得する...といったコードを書くことができます。