全体のノード CtPでピースを複製するところまで
ノード全体の画像
ピース側
ピースを構成するノードの画像
メッシュ分割

よくあるやつ 今回はテストなので1回の分割だけ
RBDの設定
RBD Configureで設定 Packと名前つけもやってくれるのでおまかせ 特に設定は変えていない

Packする
次のCopy to PointのためにPackする

出現場所とタイミングの設定

発生する場所の点群を作る
いい感じにSpherとScatter お好みのやり方でどうぞ

向きをランダムにする

orientをランダムにする

ポイントごとにアトリビュートをつける

今回はConnectivityでclassに番号をつけた

VEXで i@class = @ptnum; でも良い
パーティクルのために一瞬表示する仕組み
(画像: Pasted image 20260405233435.png — ファイルが見つかりません)
ポイント分コピーする

Pack and Instance にチェックを入れてピースをパックする


ランダムに一つ取得する

Labs Random Selectionで一つ以外を消す 同時に2個出したい場合は2にする
Seedには現在のフレームを入れて変化させる

出現タイミングを決める
(画像: Pasted image 20260405233253.png — ファイルが見つかりません)
Switch ifで出現するタイミングだけ上の処理を流す
$F%3==0
フレーム数が3で割り切れる時に表示する

ハイポリメッシュに切り替えれるようにする仕組み
シミュレーションは最低限のプロキシメッシュで行い シミュレーション後はハイポリメッシュにするための準備 もっと良い方法あるのかな

Unpack
Copy to PointでPackしたものを解除する

Transfer Attributesでポイントごとのアトリビュートを保持するようにする

ランダムに選択されたポイントの番号がちゃんと残っている

RBDのUnpack
CopyToPointするためにPackしたものを解除する

ここでもポイントごとのアトリビュートを保持するようにする

name と class がアトリビュートにあり,どのポイントのどのピースか を管理できている

nameにポイントのアトリビュートを加える
name と classに分けれているのでnameだけにする

classを文字列に変換して nameの後ろに加えている nameが <ピース名>_<ポイント番号> となる
s@name+="_"+itoa(i@class);


高品質メッシュ側にも同じようにWangleを配置する
Shift + Ctrl + Alt を押しながらドラッグするとすべてのプロパティがリファレンスされた状態でノードを複製できる
シミュレーションをする
DOPでシミュレーションをする

DOP内のノード 難しいことはしていない

大事なのは上2つのノード

1つめのインプットのジオメトリを使うようにする

同じようにRBD Packed Objectも変更する

プロキシメッシュのシミュレーションができた!
ハイポリメッシュに置き換える
シミュレーション結果のポイントとname属性を使って置き換えていく
←ビプロキシメッシュ ハイポリ→
出現済みのピースを集める
solverで一瞬表示されたピースを残すようにする

今回は一瞬なのでマージするだけで良い

ピースを中心に持ってくる
次のTransform Piecesのために各ピースを中心に持ってくる
なぜこれをする必要があるかあまりわかっていない

PackしてあるのでPointsで @P を 0 にするだけ 簡単!
@P = 0;

シミュレーション結果を受け取る

DOP Importでパーティクルの結果だけを受け取るようにする
Import Styleでポイントを受け取るようにする

ピースとパーティクルを紐づける
TransformPiecesでつなげる

コンストレイントしたい場合
ここらへん修正する必要がある!!!!!!!!!!!!
RBD Unpackは コンストレイントにアトリビュートを転送しない(なぜ?)ので nameが一致しなくなる
なので他のピンからclassアトリビュートを取得して名前を変更する
コンストレイントのピンにWangleをつけて2つ目のインプットにプロキシのピンをつなぐ

同じ名前を探してclassを取得して名前を変えるようにする 位置も原点にいないといけないので変更する
string my_name = point(0, "name", @ptnum);
int match_pt = nametopoint(1, my_name);
if (match_pt >= 0) {
int class = point(1, "class", match_pt);
s@name+="_"+itoa(class);
@P-=point(1, "P", match_pt);
}
ハイポリメッシュと同じようにSolverで保持してDOPのConstraint Networkで使うようにする
おわり
ハイポリを使う方法 もっといいのがありそう。