すあまの備忘録

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

破壊(RBD)の流れメモ vol.2 分割とコンストレイン

はじめに

以下のように割と手抜きでメッシュを分割しています。

  • 同じメッシュの箇所は1度だけ割ってインスタンス配置
  • 割るエリアは絞らない
  • ディテールは数増やしてごまかす
  • タイル一枚、レンガ1個等は分割しない
  • UVも取り敢えず展開する

実際に割る場合は割れる部分をしっかり決めてBoolean等で断面を作った後に割っていくほうがより良い結果になると思います。

壊れるエリアを決めて丁寧に分割したりしたほうがクオリティは高くなりますが、今回はそれよりも効率とかいうことにしています。

分割処理だけでも画像のようになっているので一部だけの紹介です。

f:id:godofsuama:20201025192714p:plain

外壁

こんな感じの一番外側の壁です。

f:id:godofsuama:20201025193146p:plain

整理
識別用アトリビュート

複数パーツがある場合は後でコンストレインの処理やグループ分けを楽にするためにアトリビュートを作成します。

f:id:godofsuama:20201025193312p:plain

Primitiveにasset_nameと、typeを追加、Detailにもassetを追加。

最終的にはasset_nameを何度か使用しています。

インスタンス

今回は4面別れているのと全て同じメッシュなのでインスタンスで処理します。

そのために1箇所取り出します。

4箇所全部同じ割り方になりますが、パーツがある程度別れていればコンストレイン等で意外とごまかせたりします。

自動化もしやすく、処理も全部割るよりは軽いです。

f:id:godofsuama:20201025193609p:plain

分離したら「Divide」等でメッシュを整理し、「Match Size」で原点に移動させます。

あとでインスタンスするのでZ軸と正面が一致するように処理(選ぶ)します。

f:id:godofsuama:20201025194015p:plain

f:id:godofsuama:20201025193935p:plain

UV作成(outside)

今回は一切UVがなかったので雑UV展開をします。

最初に割る前の部分にUVを作ります。

以下がよく使う雑UV展開三点セットです。

f:id:godofsuama:20201025194258p:plain

基本デフォルトから変更するのは「UV Flatten」の2箇所だけです。

f:id:godofsuama:20201025194504p:plain

場合によっては「UV Auto seams」も変更したりします。

f:id:godofsuama:20201025194436p:plain

こうなります。三角メッシュなどが少なければもっと綺麗に展開することが可能です。

f:id:godofsuama:20201025194531p:plain

分割
RBD Material Fracture

「RBD Material Fracture」で分割します。こいつは割と重いです。速いマシンを使うか、サーバーに投げましょう。

雑分割なので特筆することはしてないです。

Edge Detailを入れてしまうことと、Fracture Namespaceを先程作成したDetailアトリビュートにすることです。

最初に設定したアセット名が各ピースのnameの接頭詞になるため、かぶってしまうミスを減らせます。

details(0,"asset")

f:id:godofsuama:20201025195120p:plain

f:id:godofsuama:20201025195412p:plain

UV作成(inside)

f:id:godofsuama:20201025195719p:plain

また雑UV展開三点セットをベースにします。

変更箇所もほぼ同じですが、各ノードのGroup設定をinsideのみにします。

必ず上流を接続する前にグループまで設定してしまうか、Cookを一度止めます。

好みですが、最後に「UV Transform」でinsideのUVのみをずらします。

f:id:godofsuama:20201025195756p:plain

めちゃめちゃ雑なUVですね。

f:id:godofsuama:20201025195905p:plain

分割のキャッシュ

必要であれば、コンストレインやProxy GeometryもRBD Packで一度Packし、キャッシュします。

RBD I/Oでも良いですが、あちらはどちらかというとシムのキャッシュ用です。

f:id:godofsuama:20201025200034p:plain

インスタンス
ポイントの作成

取り出したベースのメッシュを原点に戻す前の位置でPackして1点にします。

f:id:godofsuama:20201025200341p:plain

ポイントの配置

upとNを作成します。今回はZ方向をもとから向いているため、手入力です。

f:id:godofsuama:20201025200503p:plain

「Copy Transform」ノードで90度ずつ回して4箇所もとの位置になるようにします。

f:id:godofsuama:20201025200526p:plain

f:id:godofsuama:20201025200613p:plain

各ポイントにidを振ります。かぶらないようにpackedIdとしました。

f:id:godofsuama:20201025200739p:plain

メッシュの再配置
Copy to Points

f:id:godofsuama:20201025200803p:plain

「Copy to Points」はデフォルトのまま変更しません。

このあたりの処理や注意点はvol.1にもあるのでそちらもどうぞ。

作成したpackedIdをPrimitiveへPromoteします。

f:id:godofsuama:20201025201049p:plain

nameの更新

そのままだと各インスタンスのnameが同じになってしまい、シムの際に一緒に動いてしまいます。

そのためpackedIdを使用してnameを更新します。

f:id:godofsuama:20201025201322p:plain

RBD Unpack後、@name_@packedIdのnameを作成します。

f:id:godofsuama:20201025201412p:plain

Constraint GeometryとProxy Geometryもnameを更新する必要があるので、「Convex Decomposition」と、「Connect Adjacent Pieces」で再度作成します。

元のをどうしても使いたい場合はそれぞれのnameを同じように更新しましょう。

Constraintの調整

f:id:godofsuama:20201025202220p:plain

f:id:godofsuama:20201025202551p:plain

Constrain Geometryに対してClusterを設定し、4面全部同じ感を軽減しようという作戦です。

RBD Cluster

Cluster TypeをGroup Constraintへ変更することでConstraint GeometryにClusterを設定することができます。

さらにその際に勝手にグループを作成し、クラスター内なのか、クラスターとクラスターの間なのかわけれるようになっています。

f:id:godofsuama:20201025202318p:plain

RBD Constraint Properties

上記の作成されたグループを使用してConstraintのTypeや強さを設定します。

f:id:godofsuama:20201025202525p:plain

intracluster(各クラスター内の各ピースごとの接続)とclustertocluster(各クラスター同士の接続)をよく使います。

クラスターを大きめに設定し、clustertoclusterは弱めにするのが多いです。

f:id:godofsuama:20201025202652p:plain

f:id:godofsuama:20201025202742p:plain

その後RBD Packしてキャッシュします。

f:id:godofsuama:20201025202857p:plain

全体のコンストレイン

Mergeに繋がっている大量のラインがそれぞれパーツごとに分けた分割処理です。¥

この全体へ対するコンストレインの処理は必須で、この処理をしないと各パーツ間に接続がないため、シムをかけた際にすぐ崩れていってしまいます。

f:id:godofsuama:20201025203132p:plain

f:id:godofsuama:20201025203248p:plain

ガラスと枠のコンストレイン

f:id:godofsuama:20201025203420p:plain

上流でグループを作成しておいてもいいでしょう。

不要なグループを削除し、「Partiton」で、一番最初に作成したasset_nameアトリビュートを使用してグループを作ります。

f:id:godofsuama:20201025203539p:plain

「RBD Constraint from Rules」でグループ間にコンストレインを作ります。

Group nameは他とかぶると「RBD Constraint Properties」が使えなくなるので必ず変更します。

f:id:godofsuama:20201025203714p:plain

「RBD Constraint Propeties」で作成したグループにのみコンストレインの強弱設定を行います。

f:id:godofsuama:20201025203901p:plain

ガラス以外のコンストレイン

f:id:godofsuama:20201025203950p:plain

GlassGp以外の全てを含んだグループ、を作成します。

f:id:godofsuama:20201025204044p:plain

「RBD Constraint from Rules」でグループ内のasset_nameが違うものすべてに対してコンストレインを作成します。

f:id:godofsuama:20201025204158p:plain

こうすることでガラス以外全てのジオメトリにコンストレインが貼られます。

「RBD Constraint Propeties」で作成したグループにのみコンストレインの強弱設定を行います。

f:id:godofsuama:20201025204307p:plain

シム前のキャッシュと注意

f:id:godofsuama:20201025204436p:plain

「RBD Configure」を使用することで、RBDのシムに必要なアトリビュートの設定や、各ピースのPack処理をしてくれます。

ただし、RBD Bullet Solver(SOP)を使用しない場合、ハイポリの接続(第一入力)は接続しないほうが良いです。

接続すると、ハイポリも処理をかけてくれます。が、破片の数が多い場合にその処理が重すぎてキャッシュが遅くなります。

シムにはProxy Geometryしか使わないので、第一入力は必要な場合以外は接続しないほうが良いと思います。