今更ながら過去記事のうまく行っていなかった部分をヘルプ読みながら整理してアップデート
古い方の記事は何日かごに削除しようと思います。
RBD_deform_pieces.hiplc - Google ドライブ
4kモニターからキャプチャしてるせいかキャプチャ画像がでかいのどうにかしたい。
ずっとわしゃわしゃ動いているのはボックスが飛んできてぶつかっているからです。
先に大きく割るパターン
メリットは断面のディテールが乗せやすく、良い断面になりやすいところ。
デメリットは分裂しない塊を先に生成するので塊自体を変更する場合に一番最初に戻らないといけないところ。ディテール入れすぎると重い。
最初の分割(大きい方)
普通に割ります。ここの段階で断面の形状と塊具合をしっかり決めます。
ここのAssembleはPackにするのではなくname
を整理するのに使用します。とりあえず「cluster」で始まるようにします。
Attribute Createでparentpiece
をname
から作成します。
二回目の分割(小さい方)
先程のparentpieceごとに更に分割します。
この際に再分割しているVoronoi Fracture(RBD Material Fractureでも可)のInterior Groupの名前を変更しておきます。
blastで先程作成したInterior Groupの名前を指定して削除します。
これで再分割した部分の断面のポリゴンが削除できる。
RBDのシム後に以下のように「RBD Connected Faces」と「RBD Disconeccted Face」を使用しても消せる。あとで消す場合はこのblastはなしでいい。
ピースのRename
Attribute Createで以下の画像のようにnameを再設定する。
Constraintの作成とシム用の整理
Proxy Geometry
Convex Decompositionで作成。insideを先に消してしまうとConvex DecompositionでProxy Geometryを再度作成する必要が出てくる。
その場合はMerge Nearby Segmentsにチェックを入れておくといい。
Constraint Geometry
Connection Typeは、Adjacent Pieces from Pointsにすること。よくRBDで使用するAdjacent Pieces from Surface Pointsにすると中心点でConstraintが作成されるため、Deform時の各ピースの位置が大きくずれてしまう。
その後Primitive WrangleでConstraint Geometryの始点終点のClusterが違う場合に「breakable」というグループに入れる処理をする。
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へ以降させる。
RBD Configure
RBDに必要なものをまとめる。場合に寄ってはFriction等も設定する。
RBD Sim
よくあるRBDのセットアップ。Glueを壊すためにboxを飛ばしてCollisionさせている。
Constraint Relationship
Glue, Softの設定を全て1に変更している。この部分の値はSOPでの設定にMultiplyされるため、SOPの値と変わってしまうのを防ぐ。
SOP Solver
よくあるDistanceで分離する方法をSOPで作成した「breakable」グループにのみ適応。distance以外は過去記事も参照 godofsuama.hatenablog.com
if(@distance > chf("distance")) { removeprim(0,@primnum,0); }
RBD Deform Pieces
ここでようやくRBD Deform Pieces
先にTransform Piecesでハイポリを動かす。
RBD Deform Piecesの第一入力にハイポリ、第三にProxyをつなぎ、画像のように設定する。
後でClusterでまとめるパターン
最初の分割(小さい方)
メリットは後でクラスターで塊を作るのでとりあえず最初は細かく割っておけばOKなことと細かく割るという一番重い処理を手直しする回数が減る。
デメリットはクラスターの形になりやすい。断面を良くするにはかなり分割する必要がある。
普通に分割し、作成されたname
からoldname
を作成しておく。
クラスターでまとめる
RBD Clusterでいい感じのまとまりになるように調整して塊を作る。この塊がDeformする塊になる。
Cluster番号からparentpiece
を作成する。
name
をparentpiece
とoldname
から作成し、上書きする。
insideのPrimitiveを削除する
この処理見返してたら不安になったけど動いているので...
For-Loopをparentpiece
で回す。
EnumerateでPrimitiveのidを作成し、
Pritimiveごとに中心点を取得する。
Wrangleで2番めに近いポイントを取得する。この際に2番めが検出できないくらい小さい距離を検索させる。
float maxdist = chf("maxdist"); int an_array[] = nearpoints(0, @P, maxdist); i@nearPrim = an_array[1];
indexが同じポイントから2番めに近いポイントの番号を取得
i@delprim = point(1, "nearPrim", @index);
2番めに近いポイントの番号が0以外の場合は削除する。insideのPrimitiveの1番目に近いポイントは自分自身になり、2番目はくっついている反対側のPrimitiveになるはず。
Constraintの作成とシム用の整理
ここから先は「先に大きく割るパターン」と同じ。