ナレッジ

RBDでパーティクルをする

全体のノード

全体のノード CtPでピースを複製するところまで

Pasted image 20260405195110 ノード全体の画像

ピース側

Pasted image 20260405195133 ピースを構成するノードの画像

メッシュ分割

Pasted image 20260405195145

よくあるやつ 今回はテストなので1回の分割だけ

Pasted image 20260405160308

RBDの設定

RBD Configureで設定 Packと名前つけもやってくれるのでおまかせ 特に設定は変えていない

Pasted image 20260405195153

Packする

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

Pasted image 20260405195303

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

Pasted image 20260405210416

発生する場所の点群を作る

いい感じにSpherとScatter お好みのやり方でどうぞ

Pasted image 20260405160657

Pasted image 20260405160647

向きをランダムにする

向きをランダムにする

Pasted image 20260405210445

orientをランダムにする

Pasted image 20260405210519

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

Pasted image 20260405210948

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

Pasted image 20260405210956

VEXで i@class = @ptnum; でも良い

パーティクルのために一瞬表示する仕組み

(画像: Pasted image 20260405233435.png — ファイルが見つかりません)

ポイント分コピーする

Pasted image 20260405211542

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

Pasted image 20260405211621

Pasted image 20260405211537

ランダムに一つ取得する

Pasted image 20260405212149

Labs Random Selectionで一つ以外を消す 同時に2個出したい場合は2にする

Seedには現在のフレームを入れて変化させる

Pasted image 20260405212158

出現タイミングを決める

(画像: Pasted image 20260405233253.png — ファイルが見つかりません)

Switch ifで出現するタイミングだけ上の処理を流す

$F%3==0

フレーム数が3で割り切れる時に表示する

Pasted image 20260405212440

ハイポリメッシュに切り替えれるようにする仕組み

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

Pasted image 20260405212714

Unpack

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

Pasted image 20260405213022

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

Pasted image 20260405213033

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

Pasted image 20260405213118

RBDのUnpack

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

Pasted image 20260405213157

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

Pasted image 20260405213307

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

Pasted image 20260405213344

nameにポイントのアトリビュートを加える

name と classに分けれているのでnameだけにする

Pasted image 20260405213456

classを文字列に変換して nameの後ろに加えている nameが <ピース名>_<ポイント番号> となる

s@name+="_"+itoa(i@class);

Pasted image 20260405213607

Pasted image 20260405213733

高品質メッシュ側にも同じようにWangleを配置する

Shift + Ctrl + Alt を押しながらドラッグするとすべてのプロパティがリファレンスされた状態でノードを複製できる

シミュレーションをする

DOPでシミュレーションをする

Pasted image 20260405213802

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

Pasted image 20260405213850

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

Pasted image 20260405213939

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

Pasted image 20260405214013

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

Pasted image 20260405214258

プロキシメッシュのシミュレーションができた!

ハイポリメッシュに置き換える

シミュレーション結果のポイントとname属性を使って置き換えていく

←ビプロキシメッシュ ハイポリ→

Pasted image 20260405215059 Pasted image 20260405215117

出現済みのピースを集める

solverで一瞬表示されたピースを残すようにする

Pasted image 20260405215349

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

Pasted image 20260405215433

ピースを中心に持ってくる

次のTransform Piecesのために各ピースを中心に持ってくる

なぜこれをする必要があるかあまりわかっていない

Pasted image 20260405215733

PackしてあるのでPointsで @P0 にするだけ 簡単!

@P = 0;

Pasted image 20260405215935

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

Pasted image 20260405220031

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

Import Styleでポイントを受け取るようにする

Pasted image 20260405220212

ピースとパーティクルを紐づける

TransformPiecesでつなげる

Pasted image 20260405220341

コンストレイントしたい場合

ここらへん修正する必要がある!!!!!!!!!!!!

RBD Unpackは コンストレイントにアトリビュートを転送しない(なぜ?)ので nameが一致しなくなる

なので他のピンからclassアトリビュートを取得して名前を変更する

コンストレイントのピンにWangleをつけて2つ目のインプットにプロキシのピンをつなぐ

Pasted image 20260405235751

同じ名前を探して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で使うようにする

おわり

ハイポリを使う方法 もっといいのがありそう。