Houdini Apprentice Advent Calendar 2023の12/3の記事にしました。(空いていたので)
実はタイトル詐欺で、ジオメトリと移動回転スケールを別データでUSDファイルに書き出したのち、Solarisに持っていく方法の記事です。
Solaris上のデータをとてもキレイなデータにすることができます。仕事で使う場合はこういうデータ構成のほうがいいかなと思います。

hip
usdTransformPieces.hiplc - Google ドライブ
Houdini 20.0.506 Python3.10
既存の手段
SOP ImportのPacked Primitives
これを使うと読み込み時にInsatnce状態=ほぼTransform Piecesに一発でできます。
ですが、ジオメトリと移動情報を別で扱えないため、それぞれ分けての更新ができません。
気をつけないとレンダリング時に自動で別ファイルとしてUSDを書き出してしまう。

Solaris上のInstance
これは上記SOP Importの処理を手動で作ることでジオメトリとポイントは別にできます。
ですが、階層が複雑なジオメトリの場合とInsatnceの設定が若干ややこしいです。
この方法はそれぞれ分けての更新はできますが、ジオメトリと移動回転スケールを別USDファイルにはなっていません。
レンダリング時にレンダーシーンのUSDにすべて書き込まれるため、レンダーシーンが重く、デバッグしづらくなる。

今回の方法
まず普通にRBDシムをして、Pointとハイポリを用意します。


pathを作る
ジオメトリにpathアトリビュートを作成します。pathは必ず全体をまとめる階層を1つ作ります。

name,pathをPointにPromoteしてシム後のポイントにCopyします。


ジオメトリ書き出し
ジオメトリは一度USDファイルとして書き出します。Relative Path Prefixは後で使うのでpathの先頭階層と同じ名前にします。

ジオメトリ読み込み
LOP上でReferenceノードを使って書き出したジオメトリを読み込みます。
Primitive PathはReference File's Default Primitiveを選択します。

シムポイント書き出し
シムポイントの書き出しはHDAを作ってSOP上からやるのがベスト
今回はHDA作る場合の中身の処理の説明になります
LOPにSOP Importで読み込みます。

Scene Graph Treeが下記画像のような状態のはずです。

Transformの復元
Attribute Wrangleで%type:Pointsに対して以下を実行します。この処理でPonitの一つ上の階層にP,orient,scale,pivotを元にしたTransform情報が書き込まれます。

//get parent string parent = usd_parentpath(0, @primpath); //get houdini point attrib vector _trans = usd_attribelement(0, @primpath, "points", 0); vector _pivot = usd_primvarelement(0, @primpath, "pivot", 0); vector _scale = usd_primvarelement(0, @primpath, "scale", 0); vector4 _orient = usd_primvarelement(0, @primpath, "orient", 0); //fix value vector _rot = degrees(quaterniontoeuler(_orient, 0)); _trans -= _pivot; //add xform matrix xform = maketransform(0, 0, _trans, _rot, _scale, _pivot); usd_cleartransformorder(0, parent); usd_settransformreset(0, parent, 1); usd_addtransform(0, parent, "override_packedtransform", xform);

Pointの削除
Restructure Scene GraphですべてのPointを削除します。

Pointの書き出し
USD ROPを使用して、Save StyleをFlatten All Layersで書き出します。

Sublayerで取り付け
Referenceで読み込んだジオメトリに対して、Sublayer(階層一緒ならReferenceでも可)で書き出したPointのUSDファイル読み込みます。


