PrimCompositionQueryの使い方
USD の Stage で表示される Prim は、いくつかの Layer を合成した結果組み立てられたものです。 たとえば、Kitchen_set を見てみると、
ある Prim を選択し、Composition を見ると
このように、この Prim がどの Layer から作られたのか確認することができます。
この情報を Python で取得しようとすると、PCP などを使用してシーンをトラバースしなければいけなくて それなりに手間です。 その手間を簡単にできるようにしたのが、PrimCompositionQueryです。 このクラスは、その名の通り、指定した Prim の Composition の構造を取得することができます。
つかってみる
まずは基本的な使い方から。 CompositionQuery で Kitchen_1 の Prim の Composition を確認してみます。
from pxr import Usd
stage = Usd.Stage.Open(r"D:\Kitchen_set\Kitchen_set\Kitchen_set.usd")
prim = stage.GetPrimAtPath("/Kitchen_set/Arch_grp/Kitchen_1")
# CompositionQueryを使用する
compQuery = Usd.PrimCompositionQuery(prim)
for comp in compQuery.GetCompositionArcs():
print(comp.GetArcType())
print(comp.GetTargetLayer())
実行結果は
このようになります。 見ての通り、Composition タブに表示されていた内容と同じものが確認できます。
GetCompositionArcs を使用すると、Layer を強い順に並んだリストで取得します。 リストは、UsdPrimCompositionQueryArc型のリストになっているので、具体的な内容は UsdPrimCompositionQueryArc クラスを確認して、必要な情報を取得します。
サンプル の場合、ArcType は Enum 型で、指定の Layer がどのように合成されているのかが確認できます。
特定の Composition のみ取得する
filter を使う
最初の例だと、すべての Composition が取得されます。 しかし、そうではなく「特定の Composition のみ取得したい」場合もあるでしょう。 その場合は、PrimCompositionQuery に Filter を指定することで実現できます。
filter = Usd.PrimCompositionQuery.Filter()
filter.arcTypeFilter = Usd.PrimCompositionQuery.ArcTypeFilter.Reference
compQuery = Usd.PrimCompositionQuery(prim, filter)
for comp in compQuery.GetCompositionArcs():
print(comp.GetArcType())
print(comp.GetTargetLayer())
最初の例に、Filter を追加しました。
これが実行結果です。
関数を使う
それ以外に、専用の関数も用意されているので、それでも取得できます。
query = Usd.PrimCompositionQuery.GetDirectReferences(prim)
for comp in query.GetCompositionArcs():
print(comp.GetTargetLayer())
まとめ
PrimCompositionQuery を使用すれば、コンポジションの情報を簡単に取得できる ことがわかりました。 ある程度 PCP への理解は必要ですが 再帰を書いたりといった手間が減るので、基本的に Composition の情報を取得したい場合は PrimCompositionQuery を使用するのが良いと思います。