TOPでUSDを扱ってみる
Houdini アドベントカレン ダー 2023 16 日目は、普段書いている LOP...ではなく
TOP 内で USD を使用した処理を試していこうと思います。
TOP とは
まず、前提として Houdini の TOP について軽く触れておきます。
TOP とは TaskOperator の略で、様々なタスクをプロシージャルに実行を可能にするものです。
たとえば、あるフォルダ以下にある画像ファイルを指定サイズにリサイズし、1 ファイルに結合する...
といったように、A が終わった後に B をする、そして最後に C をする のように
連続した処理を実行したい場合があったとします。
TOP では、そうした連続した処理を構築して、実行できるようになります。
TOP と USD
そんな TOP という世界ですが、実は非常に USD(SOLARIS) と相性が良いです。
という記事でも書いたのですが、USDというのは非破壊な処理はおおむねPythonで可能なのですが 破壊的編集に関してはPythonでは難しいものの、SOLARISではそうした破壊的処理が簡単に構築できます。 この破壊的な処理をしながらファイルを複数出力しつつ...みたいなことをやろうとすると SOLARISだけではできず、TOPを使用したほうが便利なことが多いです。 また、USDという複数のファイルを合成して何か処理をする 都合 バッチ処理的なことをするのに向いています。 そういった処理は、SOLARISだけで頑張るよりもTOP上でやるほうが良いです。 ので、今回はTOPを利用してUSDを操作する方法を試していこうと思います。
デフォルトで用意されているノードを確認する
USD に関連するノードは Houdini20 から増えているようですが( Cat Diff Stitch Zip 等は GenericGenerator)
その中で使いそうなのをいくつか試してみます。
USD Import Data
usdImportData は、ある USD のシーンから WorkItem を生成します。
ファイルを指定することも可能ですが(Input のファイルから WorkItem を作るなど)
LOP Path で指定したノードのステージを使用して WorkItem を作ることが可能です。
例えば、このようなステージを指定した場合、Primitives を * にしているので、
ステージ内に含まれている Prim だけ WorkItem を作ります。
ROPUSD
ROPUSD ノードは、その名の通り指定の LOP ノードを USD としてエクスポートできるノードです。
指定の LOP ノードを指定して、そのノードを Export します。
使い方としては、複数カメラを Switch で作っていたら
そのスイッチした数分だけ出力するとかなどが考えられます。
Export する Prim を指定する...みたいなことはできなさそう
USDModifyPaths
USDModifyPaths とは、USD 内にあるアセットパスを見つけて、パスを修正するノードです。
アセットパスとは、USD のアトリビュートタイプの 1 つです。
文字列とは違い、AssetPath の場合は
「AssetResolaver を使用して USD プラグイン内でパス解決を行う」ことができます。
例えば、このようなあるところへのファイルパスをもつアトリビュートがあるとします。
def "C"{
asset testPath = @D:/test.usda@
}
usda だとこのようになります。
このパスは、現在フルパスになっていますが、
例えばこれらのパスをすべて SEARCH_PATH からの相対扱いにしたいとします。
その場合は、PythonCode に条件と置き換える文字列処理(結果を return で返す)
するコードを書くか、 Find Prefix と Replace Prefix を使用して文字列置換します。
手元だとすべてローカルディレクトリを見るようにするが
リリースするときにはパスを一斉置換したい時などに使えそうです。
USDAnalyze
USDAnalyze ノードは、その名の通り、USDFile あるいは指定の LOP ノードのステージ情報を
解析してアトリビュートとして取得します。
例として、totalPrimCount や、usedLayerCount などのようなシーンにまつわる情報を取得します。
このノード自体で何かをするわけではないですが、この情報をもとに Wedge で複数の WorkItem を生成したり
条件分岐に使用する(例として Model を含む場合は次の処理を実行する、など)等が考えられます。
今回紹介した以外だと、レンダリング関係のノードがありますが、
専門外なので今回は割愛します。