今更だけどH18で変わったRBD周りをなるべく使ってのテストとメモ
今回はネットワークが広大なので全部は記事にできなそう。なので最後の回にはhipをアップしますが整理はできないです。
やはりレンダリングまでいくとモチベーションがだいぶ上がる。
完成品は以下の動画
はじめに
破壊モデルはREBELWAYで配布されているモデルを使用。
このシリーズの記事は↑のモデルを使用するので同じ状態になっているはずです。
紹介する手法は常にあらゆるパターンで可能なのを保証するわけではありません。
法線反転の混在
画像のような法線反転が混じっている場合。
穴を塞ぐ
まず穴が空いていないかをチェックして、「PolyFill」等で塞ぐ。
Connectivityでピースごと選べるようにする
ここはAssemble(Packはしない)でも可能。
Volumeを測る
「Measure」ノードで各Class(name)ごとにVolumeを測る。
色に惑わされないように注意。
法線反転する
「Reverse」ノードを以下の設定で法線反転する。
近接フェースの削除
パット見問題なさそう、でAssembleでも1個しか生成されない。
が、近寄ると中に謎のフェースがある。
一度Fuseする
範囲を見てちょっと高めの結合範囲に。
押し出す
ExtrudeしないExtrudeをする。Output FaceもBackのみ。
再度Fuse
2回目はちょっと低めの値
念の為Clean
CleanのFix Overlapsをチェックし、念の為かけておく。
今回はCleanに意味ないが、場合に寄ってはCleanのみでいけたりもする。
小さい破片の削除
スケール感を出すために必要な場合もあるが、小さすぎるとRBDがおかしくなることがあるので予期せずできてしまった場合の回避方法
ざっくりいうとできてしまった小さい破片はシムへの影響は少ないとみて削除していく方向です。
表面積を出す
Measureのareaで面積を出し、破片ごとにsumでPromoteして表面積をareaアトリビュートにします。
小さい破片と大きい破片を分ける
画像はSplitノードで分けた例。どの方法でもいいのでareaを閾値にして分けます。
大きいものを含ませすぎると当然ならがRBDのシムがおかしくなります。
小さい破片にアトリビュートを追加
このアトリビュートを頼りに削除するので判別できればんでも良い
小さい破片に大きい破片のnameを転送
rayで最近接へ転送します。この段階だとPointアトリビュートなので、Primitiveへfirst matchでPromoteします。
処理した小さい破片と分岐させた大きい破片をMerge
ここからConvex Decompositionはかけません。凸形状がおかしくなります。
Convex Decompositionを使用する場合は分岐した大きな破片にのみかけます。
Proxy Geometryの処理
小さい破片に設定した削除用アトリビュートを転送し、それをもとに削除します。
不正なメッシュ
色々パターンがあるが以下のような適切な割がはいっていないやつ。
RBD Material Fractureや、Boolean等でうまく割れない原因にもなるので先に直しておく。
直せるならMayaやBlender等で直したほうが早いっちゃはやい。
直し方1
「Divide」で三角形を生成する。Divideのほうだと分割時に不正が出やすい気はする。
こういう場合はBricker Polygonsは使用しない。また不正な面ができてしまう。
直し方2
「Remesh」で整理
あまり細かく割りすぎないことと、Hard Edgeをキープすること。
混在している場合はグループを作ろう。
作り方は以下のガタケさんのツイートが良かった。
以前面倒くさい方法しか思いつかなかったハードエッジのグループ化が、実はこんなに簡単にできた。。Vertex Split SOP のアトリビュートをNにするとハードエッジでポリゴンが別れるので、Unsharedをグループ化して、元のメッシュに転送。角だけにべベルをかけるのも楽ちん。 pic.twitter.com/vhEXNRXm1t
— ガタケ (@low_alt_flight) 2016年12月20日
複数の同じメッシュ
整理とは少しずれるが、場合によっては使える手法これを見越して整理するというのもあり。
以下のように同じ形状のメッシュが大量に配置されている場合(窓ガラスとかも)
配置の向きを取得する
N
(とup
)を取得して配置情報を取得する。
以下はBoundのNormalで向きを取得しているパターン
1つを取り出す
今回は4方向綺麗に向いていたので@N.z==1
で取り出した。
原点に戻す
「Match Size」を使用し、原点に戻す。場合によってはスケールを戻しても良いかもしれない。
法線を再設定
転送したNで法線がおかしいので再設定する
分割する
RBD Material FractureやVoronoi等で分割したりUVを作成したりする。
Packする
「RBD Configure」と「RBD Pack」を使用しPackする。半自動の場合は両方必要なので注意すること。
配置用のポイントを作成する
もともと配置されていた場合はN
とup
を作成し、Assemble等でPackし1点にする。
Copy to Pointsで配置
「Copy to Points」のPack and Instanceにはチェックを入れる。
シムする前の処理
「Unpack」、「RBD Unpack」を使用する。
RBD UnpackのEnforce Unique Name Attribute per Instanceにチェックを入れる。
チェックがあると自動的にインスタンスごとにname
の後ろに-インスタンス番号
がつく。
注意
一回使えばわかるが、SOPのRBD Bullet Solver以外だとちょっと使いづらい。
なぜかというと、このままだと異なるオブジェクト間のコンストレイントを生成できる「RBD Constraint from Rules」がエラーで使えない。
原因はメッシュがPackされているせいなのでメッシュを一度Unpackし、name
をプロモートする必要がある。
手間がかかるというのもあるが、一度PackしたものをUnpackする処理は、ピースが増えると激重になってしまうためあまりやりたくないというのが本音。
流れでハイメッシュがいらない場合はProxyだけを第一と第三につなぐのもあり。