すあまの備忘録

誰得内容の自分のための非営利目的備忘録ブログ(筆者がわかっても内緒にしてください)

Solaris - Transform Piecesをする

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

Sublayerの場合

Referenceの場合