RBDをエミットした後、レンダリング時のジオメトリを軽くすためにInstance化したい場合の方法
Find Instance, RBD Find Instanceとか追加されたけど、Pointだけでは動作しないし、いまいちのぞみの動作をしてくれないので。
Scene File
rbd_reinstance.hiplc - Google ドライブ
作り
エミットするメッシュの準備
大抵の場合GeometryをCopy to Pointsする際に、pscaleやN,upなどでランダムさを出すと思うのでそういうセットアップを組む。
Scatterが毎フレーム動き、pscaleとNも毎フレームランダム。
SampleではMerge PackedやAttribute from Piecesなどを使っているが、手で作成してもOK
以下が重要
Instance前を識別できるnameなどのアトリビュートを作っておく。
Copy to PointsしたあとがPackになっていてPrim Intrinsicsのpackedfulltransformに値が入っていること。



後処理で使うアトリビュートを作る
Copy to Points後に以下のVEXでpackedfulltransformを何かしらのアトリビュートとして保持させる。
- restxformというアトリビュート名はBullet Solverが使用するので避けること。
4@xform_org = primintrinsic(0, "packedfulltransform", @primnum);
Unpackし、Pointのnameは邪魔なので削除
Connectivityでclassを作成し

以下VEXで各ピースごとに異なるnameをつけつつ、Instance前を識別するためのnameをname_orgとする。
- Bullet Solver SOPはEmit RBDsをオンにするとさらに毎フレームnameを変えてくれるが、DOP Netでゼロから作る場合は自分で毎フレームnameが変わるようにすること。
s@name_org = s@name; s@name = s@name +"_"+ itoa(i@class);
作成したname_orgとxform_orgをPointにPromoteする。
RBD Configure / AssembleでPackする際にTransfer Attributesにxform_orgとname_orgを追記する。

RBD Sim
Bullet Solver SOPの場合はEmit RBDsをオンにするだけ。
DOPで組む場合はBullet Solver SOPを参考に組みましょう。


Instance化処理

Attribute Swapでnameとname_orgを入れ替える。(これ以降はnameとname_orgの中身が入れ替わっているので注意)

Attribute Deleteでname,name_org,xform_orgを残してすべてのアトリビュートを削除し、@Pを0,0,0にしてすべてのポイントを原点にする。

Copy to Pointsでnameを元に元のジオメトリをコピーする。
Transform by Attributeをxform_orgで行い、Emitした瞬間の状態に再度戻す。

name_orgでTransform Piecesを行い、元のRBDの動きを適応する。

ハイポリへの差し替え
この方法だとnameさえ一致していれば後処理のCopy to Pointsでメッシュをいくらでも差し替えられるので、ハイポリへの差し替えがしやすい。
赤矢印の部分が違うメッシュでもnameさえ一致すればOK(もちろん形状が違いすぎる場合はコリジョンがおかしくはなる)

きれいなデータになるので、Solarisに持っていっても破綻がほぼ起きない。
