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ファイル読み込みます。