すあまの備忘録

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

RBD Deform Pieces とCluster

今更ながら過去記事のうまく行っていなかった部分をヘルプ読みながら整理してアップデート

古い方の記事は何日かごに削除しようと思います。

RBD_deform_pieces.hiplc - Google ドライブ

4kモニターからキャプチャしてるせいかキャプチャ画像がでかいのどうにかしたい。

ずっとわしゃわしゃ動いているのはボックスが飛んできてぶつかっているからです。

f:id:godofsuama:20201007183521g:plain
先に大きく割るパターン

f:id:godofsuama:20201007183712g:plain
後でClusterでまとめるパターン

先に大きく割るパターン

f:id:godofsuama:20201007192825p:plain

メリットは断面のディテールが乗せやすく、良い断面になりやすいところ。

デメリットは分裂しない塊を先に生成するので塊自体を変更する場合に一番最初に戻らないといけないところ。ディテール入れすぎると重い。

最初の分割(大きい方)

普通に割ります。ここの段階で断面の形状と塊具合をしっかり決めます。

f:id:godofsuama:20201007184749p:plain

ここのAssembleはPackにするのではなくnameを整理するのに使用します。とりあえず「cluster」で始まるようにします。

f:id:godofsuama:20201007184853p:plain

Attribute Createでparentpiecenameから作成します。

f:id:godofsuama:20201007185055p:plain

二回目の分割(小さい方)

先程のparentpieceごとに更に分割します。

f:id:godofsuama:20201007185227p:plain

この際に再分割しているVoronoi Fracture(RBD Material Fractureでも可)のInterior Groupの名前を変更しておきます。

f:id:godofsuama:20201007185440p:plain

blastで先程作成したInterior Groupの名前を指定して削除します。

f:id:godofsuama:20201007185717p:plain

これで再分割した部分の断面のポリゴンが削除できる。

RBDのシム後に以下のように「RBD Connected Faces」と「RBD Disconeccted Face」を使用しても消せる。あとで消す場合はこのblastはなしでいい。

f:id:godofsuama:20201007185950p:plain

ピースのRename

Attribute Createで以下の画像のようにnameを再設定する。

f:id:godofsuama:20201007190054p:plain

Constraintの作成とシム用の整理

f:id:godofsuama:20201007192940p:plain

Proxy Geometry

Convex Decompositionで作成。insideを先に消してしまうとConvex DecompositionでProxy Geometryを再度作成する必要が出てくる。

その場合はMerge Nearby Segmentsにチェックを入れておくといい。

f:id:godofsuama:20201007190704p:plain

Constraint Geometry

Connection Typeは、Adjacent Pieces from Pointsにすること。よくRBDで使用するAdjacent Pieces from Surface Pointsにすると中心点でConstraintが作成されるため、Deform時の各ピースの位置が大きくずれてしまう。

f:id:godofsuama:20201007190909p:plain

その後Primitive WrangleでConstraint Geometryの始点終点のClusterが違う場合に「breakable」というグループに入れる処理をする。

f:id:godofsuama:20201007192240p:plain

int pts[] = primpoints(0, @primnum);
string name1 = point(0, "name", pts[0]);
string name2 = point(0, "name", pts[1]);
name1 = split(name1, chs("split"))[0];
name2 = split(name2, chs("split"))[0];

i@group_breakable = name1 != name2;
Constraint Properties

ConstraintのTypeや強さを設定する。GlueからSoftへ以降させる。

f:id:godofsuama:20201007192510p:plain

RBD Configure

RBDに必要なものをまとめる。場合に寄ってはFriction等も設定する。

f:id:godofsuama:20201007193055p:plain

RBD Sim

よくあるRBDのセットアップ。Glueを壊すためにboxを飛ばしてCollisionさせている。

f:id:godofsuama:20201007193307p:plain

Constraint Relationship

Glue, Softの設定を全て1に変更している。この部分の値はSOPでの設定にMultiplyされるため、SOPの値と変わってしまうのを防ぐ。

f:id:godofsuama:20201007193419p:plain

f:id:godofsuama:20201007193455p:plain

SOP Solver

よくあるDistanceで分離する方法をSOPで作成した「breakable」グループにのみ適応。distance以外は過去記事も参照 godofsuama.hatenablog.com

f:id:godofsuama:20201007193647p:plain

f:id:godofsuama:20201007193731p:plain

if(@distance > chf("distance")) {
    removeprim(0,@primnum,0);
}
RBD Deform Pieces

ここでようやくRBD Deform Pieces

f:id:godofsuama:20201007193945p:plain

先にTransform Piecesでハイポリを動かす。

RBD Deform Piecesの第一入力にハイポリ、第三にProxyをつなぎ、画像のように設定する。

f:id:godofsuama:20201007194035p:plain

後でClusterでまとめるパターン

f:id:godofsuama:20201007194414p:plain

最初の分割(小さい方)

メリットは後でクラスターで塊を作るのでとりあえず最初は細かく割っておけばOKなことと細かく割るという一番重い処理を手直しする回数が減る。

デメリットはクラスターの形になりやすい。断面を良くするにはかなり分割する必要がある。

f:id:godofsuama:20201007194714p:plain

普通に分割し、作成されたnameからoldnameを作成しておく。

f:id:godofsuama:20201007194756p:plain

クラスターでまとめる

f:id:godofsuama:20201007194908p:plain

RBD Clusterでいい感じのまとまりになるように調整して塊を作る。この塊がDeformする塊になる。

Cluster番号からparentpieceを作成する。

f:id:godofsuama:20201007195033p:plain

nameparentpieceoldnameから作成し、上書きする。

f:id:godofsuama:20201007195116p:plain

insideのPrimitiveを削除する

この処理見返してたら不安になったけど動いているので...

f:id:godofsuama:20201007195514p:plain

For-Loopをparentpieceで回す。

f:id:godofsuama:20201007195305p:plain

EnumerateでPrimitiveのidを作成し、

f:id:godofsuama:20201007195406p:plain

Pritimiveごとに中心点を取得する。

f:id:godofsuama:20201007195441p:plain

Wrangleで2番めに近いポイントを取得する。この際に2番めが検出できないくらい小さい距離を検索させる。

f:id:godofsuama:20201007195618p:plain

float maxdist = chf("maxdist");
int an_array[] = nearpoints(0, @P, maxdist);
i@nearPrim = an_array[1];

indexが同じポイントから2番めに近いポイントの番号を取得

f:id:godofsuama:20201007200055p:plain

i@delprim = point(1, "nearPrim", @index);

2番めに近いポイントの番号が0以外の場合は削除する。insideのPrimitiveの1番目に近いポイントは自分自身になり、2番目はくっついている反対側のPrimitiveになるはず。

f:id:godofsuama:20201007200348p:plain

Constraintの作成とシム用の整理

ここから先は「先に大きく割るパターン」と同じ。