すあまの備忘録

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

Tips - RBDをEmitしたあとのデータをInstance化して軽くする

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を何かしらのアトリビュートとして保持させる。

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に持っていっても破綻がほぼ起きない。