はじめに
以下のように割と手抜きでメッシュを分割しています。
- 同じメッシュの箇所は1度だけ割ってインスタンス配置
- 割るエリアは絞らない
- ディテールは数増やしてごまかす
- タイル一枚、レンガ1個等は分割しない
- UVも取り敢えず展開する
実際に割る場合は割れる部分をしっかり決めてBoolean等で断面を作った後に割っていくほうがより良い結果になると思います。
壊れるエリアを決めて丁寧に分割したりしたほうがクオリティは高くなりますが、今回はそれよりも効率とかいうことにしています。
分割処理だけでも画像のようになっているので一部だけの紹介です。
外壁
こんな感じの一番外側の壁です。
整理
識別用アトリビュート
複数パーツがある場合は後でコンストレインの処理やグループ分けを楽にするためにアトリビュートを作成します。
Primitiveにasset_name
と、type
を追加、Detailにもasset
を追加。
最終的にはasset_name
を何度か使用しています。
インスタンス
今回は4面別れているのと全て同じメッシュなのでインスタンスで処理します。
そのために1箇所取り出します。
4箇所全部同じ割り方になりますが、パーツがある程度別れていればコンストレイン等で意外とごまかせたりします。
自動化もしやすく、処理も全部割るよりは軽いです。
分離したら「Divide」等でメッシュを整理し、「Match Size」で原点に移動させます。
あとでインスタンスするのでZ軸と正面が一致するように処理(選ぶ)します。
UV作成(outside)
今回は一切UVがなかったので雑UV展開をします。
最初に割る前の部分にUVを作ります。
以下がよく使う雑UV展開三点セットです。
基本デフォルトから変更するのは「UV Flatten」の2箇所だけです。
場合によっては「UV Auto seams」も変更したりします。
こうなります。三角メッシュなどが少なければもっと綺麗に展開することが可能です。
分割
RBD Material Fracture
「RBD Material Fracture」で分割します。こいつは割と重いです。速いマシンを使うか、サーバーに投げましょう。
雑分割なので特筆することはしてないです。
Edge Detailを入れてしまうことと、Fracture Namespaceを先程作成したDetailアトリビュートにすることです。
最初に設定したアセット名が各ピースのnameの接頭詞になるため、かぶってしまうミスを減らせます。
details(0,"asset")
UV作成(inside)
また雑UV展開三点セットをベースにします。
変更箇所もほぼ同じですが、各ノードのGroup設定をinsideのみにします。
必ず上流を接続する前にグループまで設定してしまうか、Cookを一度止めます。
好みですが、最後に「UV Transform」でinsideのUVのみをずらします。
めちゃめちゃ雑なUVですね。
分割のキャッシュ
必要であれば、コンストレインやProxy GeometryもRBD Packで一度Packし、キャッシュします。
RBD I/Oでも良いですが、あちらはどちらかというとシムのキャッシュ用です。
インスタンス
ポイントの作成
取り出したベースのメッシュを原点に戻す前の位置でPackして1点にします。
ポイントの配置
upとNを作成します。今回はZ方向をもとから向いているため、手入力です。
「Copy Transform」ノードで90度ずつ回して4箇所もとの位置になるようにします。
各ポイントにidを振ります。かぶらないようにpackedId
としました。
メッシュの再配置
Copy to Points
「Copy to Points」はデフォルトのまま変更しません。
このあたりの処理や注意点はvol.1にもあるのでそちらもどうぞ。
作成したpackedId
をPrimitiveへPromoteします。
nameの更新
そのままだと各インスタンスのnameが同じになってしまい、シムの際に一緒に動いてしまいます。
そのためpackedId
を使用してnameを更新します。
RBD Unpack後、@name
_@packedId
のnameを作成します。
Constraint GeometryとProxy Geometryもnameを更新する必要があるので、「Convex Decomposition」と、「Connect Adjacent Pieces」で再度作成します。
元のをどうしても使いたい場合はそれぞれのnameを同じように更新しましょう。
Constraintの調整
Constrain Geometryに対してClusterを設定し、4面全部同じ感を軽減しようという作戦です。
RBD Cluster
Cluster TypeをGroup Constraintへ変更することでConstraint GeometryにClusterを設定することができます。
さらにその際に勝手にグループを作成し、クラスター内なのか、クラスターとクラスターの間なのかわけれるようになっています。
RBD Constraint Properties
上記の作成されたグループを使用してConstraintのTypeや強さを設定します。
intracluster(各クラスター内の各ピースごとの接続)とclustertocluster(各クラスター同士の接続)をよく使います。
クラスターを大きめに設定し、clustertoclusterは弱めにするのが多いです。
その後RBD Packしてキャッシュします。
全体のコンストレイン
Mergeに繋がっている大量のラインがそれぞれパーツごとに分けた分割処理です。¥
この全体へ対するコンストレインの処理は必須で、この処理をしないと各パーツ間に接続がないため、シムをかけた際にすぐ崩れていってしまいます。
ガラスと枠のコンストレイン
上流でグループを作成しておいてもいいでしょう。
不要なグループを削除し、「Partiton」で、一番最初に作成したasset_name
アトリビュートを使用してグループを作ります。
「RBD Constraint from Rules」でグループ間にコンストレインを作ります。
Group nameは他とかぶると「RBD Constraint Properties」が使えなくなるので必ず変更します。
「RBD Constraint Propeties」で作成したグループにのみコンストレインの強弱設定を行います。
ガラス以外のコンストレイン
GlassGp以外の全てを含んだグループ、を作成します。
「RBD Constraint from Rules」でグループ内のasset_name
が違うものすべてに対してコンストレインを作成します。
こうすることでガラス以外全てのジオメトリにコンストレインが貼られます。
「RBD Constraint Propeties」で作成したグループにのみコンストレインの強弱設定を行います。
シム前のキャッシュと注意
「RBD Configure」を使用することで、RBDのシムに必要なアトリビュートの設定や、各ピースのPack処理をしてくれます。
ただし、RBD Bullet Solver(SOP)を使用しない場合、ハイポリの接続(第一入力)は接続しないほうが良いです。
接続すると、ハイポリも処理をかけてくれます。が、破片の数が多い場合にその処理が重すぎてキャッシュが遅くなります。
シムにはProxy Geometryしか使わないので、第一入力は必要な場合以外は接続しないほうが良いと思います。