RBD Material Fracture [Mardini2024]

これはMardini2024のDay13 RBD Material Fractureの動画を視聴してまとめたものです。

[動画](https://www.youtube.com/watch?v=IMyE6fNdgWI)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/036c958d-f19e-ce1c-0569-110ff22d51e8.png)

[公式のサンプルファイル](https://media.sidefx.com/uploads/contests/mardini2024/moeen_videos/mardini_examples_day13_rbdmaterialfracture.zip)

[Day12 Vellum Configure Grains](https://qiita.com/jyouryuusui/items/50c7f13cf5583fca4e84) | Day13 RBD Material Fracture　|　[Day14 Cloud Shape Generate](https://qiita.com/jyouryuusui/items/e47eedbf5ab6aa155fb8)

RBD Material Fractureノードは、ジオメトリをマテリアル（材質）に基づいて破壊するために使用されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c717276f-25d4-ccf3-20d8-699862419f0d.png)

# 要約

- コンクリート、ガラス、木材などの材質タイプを選択できます
- ノイズパターンやスキャッタリングされたポイントに基づいて破壊パターンを制御できます
- チッピングやエッジのDetail、内部のDetailを追加して、リアルな破壊表現が可能です
- プロキシジオメトリを使用して、シミュレーションのパフォーマンスを最適化できます
- 破壊後のピースをつなぐコンストレイントの強度を調整できます
- 破壊をピースごとに適用することで、均一な破壊が可能になります
- ガラスの破壊では、放射状と同心円状のクラックの強度を個別に制御できます
- RBD Connected FacesとRBD Disonnected Facesを使用して、ガラスの破壊をより現実的に表現できます

# サンプル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b3f88b9e-cab5-2cb7-397a-a2d1da7827c3.png)

RBD Material Fractureノードの基礎の例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f800e67c-e0f5-6e27-9843-c059bfce1982.png)

複数のジオメトリを破壊する場合の例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8b1bce75-41da-7047-5bb5-14f0dc0b6728.png)

ガラスの破壊をシミュレーションの例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/14382677-a7b3-5070-1732-3e47f3e59003.png)

木材の破壊をシミュレーションの例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/21f96a10-389a-a6a2-6468-ecaccac2ae93.png)



## RBD Material Fractureノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ca129f82-1fa2-32e7-6abb-e205c6b4372e.png)

RBD Material FractureノードはSOPレベルで作成します。ジオメトリを接続することで、内部のエッジや面を持つ破壊状態を作ることができます。

- ジオメトリを作成し、「RBD Material Fracture」ノードを追加します
- 材質タイプ(コンクリート、ガラス、木材など)を選択します　※デフォルトはコンクリートです
- 破壊表現が見えにくい場合は、ExplodedViewを使用できます


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a8e8b16d-204c-abba-3955-0fe7da34c663.png)


コンクリート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6c9d85c5-0909-aa81-6f1a-51c693d57c38.png)

ガラス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/cdd2f2c8-8c47-70da-8df1-475b1b3a3ac9.png)

木材

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1aae628b-9c0e-e699-3914-6a896842fdbe.png)

### Primary Fracture:破壊のレベルとスキャッタリングパラメータ調整

実際の破壊の形状は、このPrimaryFractureによって設定されます。デフォルトでは2つのFractureLevel（破壊レベル）があります。レベル1とレベル2のタブがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d777ce8f-68cc-5f71-a78a-401a96f36f90.png)

デフォルトではこの設定ですが、実際にはいい感じに値を変更したりFracture Levelを追加したりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/04dc20d2-05b2-eb6e-1b01-7bd889c982d5.png)

仕組みとしては、ボリューム内にポイントをばらまいて（スキャッタリングして）います。
フォグボリュームは、ノイズパターンの影響を受けます。破壊しようとしているジオメトリが小さいほど、Frequency(周波数)とResolution(解像度)を上げる必要があります。場合によってはノイズパターンが破壊しようとしているジオメトリをカバーできない状況になることがあるからです。

- 小さいジオメトリを扱う場合は、Frequencyを上げる

ここで、Fracture Levelを２から1に落としてみると、ピースの数は５つになります。
各ポイントがボリューム内でスキャッタリングされ、各ピースの中心点になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/fe7d0186-2877-70c5-98b5-94c37d2d458e.png)

ジオメトリスプレッドシートでもPiece数を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/cd0263ae-914e-9303-fef9-b7e1b1b46903.png)

Scatter Seedを変更すると、中心となるポイントの分布が変化し、フラクチャの形状が変化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/67485cc6-0011-0c0d-b44a-9d016b670b4f.png)

そこまでランダムに分布させたくない場合は、RBDMaterial Fractureの4番目の入力を使って、フラクチャの発生箇所を正確に定義することができます。Scatter（Force Total Count:20）をSphereの下に配置し、GroupでSphereのプリミティブの上部を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c49ecf04-464e-299c-cc18-8220bfb1ae2d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7f91f047-c43f-9add-1946-b98fef7f2f62.png)

しかしそのままの設定では何も変化はありません。ScatterPointを0に設定し、代わりにInput Pointsを有効にします。もしFracture Levelが２であれば１に。これで入力したポイントを元に破壊することができます。ポイントが散布された場所が最もフラクチャの破片が集中しています。便利！ここで一度減らしたFracture Levelを元に戻すと、Fracture １では入力ポイントベースで、Fracture 2ではボリュームベースで組み合わした状態で破壊することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a86aafc5-37fa-b87d-11ef-d75cfb89a96c.png)

### Detail:エッジと内部のDetail追加

現状すべてのエッジが完全に直線であり、小さな欠けもありません。もう少し複雑な感じにしたい場合は、チッピングを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1d63f491-fdc4-0af3-ee85-3b1fb5184de7.png)

Enable Chippingを有効にすると、小さな破片のフラクチャージオメトリができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/982494af-3848-a4b9-4ef2-ebc70ecb0c93.png)

チッピングを一度無効にして、Detailタブに移動します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b3c72512-30f7-fc3a-8018-bebef67dc01a.png)

Detailタブ内は、エッジの形状などを制御することができます。ここでEdge Detailを追加すると、内部ジオメトリの解像度が上がり、エッジに形状が追加されます。Noise Height(高さ)とNoiseElementSize(ノイズサイズ)でノイズを制御できます。このノイズはジオメトリのサイズに依存します。大きなジオメトリでは、それに応じたノイズサイズにする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5bbc8cd0-ecf0-f758-2e83-0f74a191cb36.png)

内部により複雑なノイズを追加する場合、ここのInterior Detailを有効にします。これでけっこう現実的な破壊表現になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/23bfbf87-39b2-0466-3023-a0c27775d616.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1aad64e0-16db-b114-eb68-35bf4823450e.png)


### Proxy Geometry:プロキシジオメトリの設定

Proxy Geometryは、ノイズを加えた高解像度メッシュの低解像度バージョンで、シミュレーションに使用するものです。
RBD Material Fractureノードの３番目の出力から確認できます。これがシミュレーションされるものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/22702d39-5d00-59fe-16c7-f2d49394d392.png)

プロキシの他の設定は、Convex Decomposition(凸分解)、PackedSphereがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d83c473f-1b74-10bb-88ef-623161ff087a.png)

これは前回の記事でも見たように、Vellum Configure Grainノードに関連しています。最大球、最小半径、最大半径、入力ジオメトリの解像度を定義するボクセルサイズなど設定できます。

### Constraints:破壊後のピースをつなぐコンストレイント強度

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0cd8dd8e-1180-8bd1-bffe-e335093a2a5e.png)

Constraintsタブのデフォルトでは、すべてが接着された状態となります。つまりBulletソルバー（GroundPlane追加）に入れて実行しても壊れません。なぜ壊れないかというと、ConstraintsのPrimary Strengthが非常に高いためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6cfe9d6a-9879-c6fc-3f1e-fda3406dfb4f.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2a3888ca-4d3b-83ba-323b-7cb64a76b07a.png)

デフォルトでは10000という大きい値になっているので、10に下げてみます。もう一度落下させると今後はバラバラになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4a7b9c4e-ed06-1014-806d-86cf675c54d1.png)

#### RBD Material Fracture + RBD Exploded View

これらのコンストレイントの状態を表示したい場合は、RBD Exploded Viewが便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9e18b9e3-421e-ddda-0356-60c3fd5afffc.png)

- 白い輪郭線：プロキシジオメトリ
- 各ピースを接続するコンストレイントのプレビューが可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/048e2b01-fd94-b9a3-adce-791c733bea64.png)

## 複数のジオメトリを破壊する場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/53592656-e817-1dbd-ca3e-74e75e7f21c7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/facdaf4f-3114-1834-15c9-666c12a72bd3.png)

ボックスの束を持つこのジオメトリを使った1ピースあたりのフラクチャー例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c43520bd-0f37-6b4e-52e7-30a734fd56e6.png)

デフォルトでは、RBD Material Fractureを使用するとジオメトリが破壊された状態になります。しかし破壊表現としては微妙で、フラクチャがされていないものもあれば、一部のピースが他のピースよりも多くフラクチャができているのが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/dfd90e77-a9c7-f5ac-2a9e-bb3c992ed8c7.png)

Fracture Per Pieceを有効にすることでこれを修正します。チェックを入れると均一な結果になりました。
Piece のAttributeを使用して、ピースごとに破壊を適用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ca57b6da-22da-a120-b299-cc934e8c4c44.png)

## ガラスの破壊をシミュレーション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2859694b-393e-e60d-88d5-5131a18a38e9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/cb24bdb1-911e-0f51-e22e-44bf6f651904.png)

少し角度が付けられたBOXにRBD Material Fracture(ガラスタイプに設定)が接続されています。

まず、第４インプットに入力ポイントを入れない場合を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/015c2c3b-1b65-11c1-ed6a-aa44adffa695.png)

１つの破壊ポイントが追加されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4584d49e-97c9-3b86-65f4-112e6efe6466.png)

これはImpact Pointsタブで設定している１ポイントです。Scatter Seedによって位置が変わります。
当然このポイントを増やすと破壊点の数を増やすことができます。下図はポイントを3にした場合です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9763594d-f70d-4dad-b9a1-70ce92394915.png)


しかしここに破壊点がほしい。という場合は指定した場所にインパクトが欲しいですよね。その場合は先ほどと同様に第４入力に入力ポイント（Addノードで追加したポイント）を接続します。Addノードの位置を移動させるとインパクトのポイントも追従するので便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/08da0765-003d-fa50-61a1-a6052b6f2d8f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/17f84f32-a883-cfed-bc0b-2f75795523ee.png)

Cracksタブでは、Radial Cracks（放射状のひび：中心から出ている真っ直ぐな線）とConcentric Cracks（同心円状のひび：ひびの輪）のパラメータを調整できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/47050842-3aa5-150b-5595-198ae4383993.png)

コンストレイントタブの下で、放射方向の強度と同心円方向の強度それぞれの強度を調整できます。先程の設定同様、デフォルトは非常に大きな値になっているので、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6dd04442-5ef6-110e-0bd6-17931b4bddc2.png)

Bulletソルバーでガラスの落下と破壊をシミュレーションする場合は、Radial Strengthを10000から5に。Concentric Strengthを10000から20に変更します。

- この2つの間の比率を維持することが大事です。同心円方向の強度は放射方向の強度の4倍以上です。もちろん、ガラスの種類によって異なりますが、基本的に放射方向の強度は同心円方向の強度よりも低くなります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ee901ded-26e0-051e-a007-b19371309deb.png)

#### RBD Material Fracture + RBD Connected Faces

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d35c49dc-963d-3d02-21f9-57bb2b5d507a.png)

ガラスを使用するのに非常に便利なノードは、RBD Connected Faces(粉砕ジオメトリの内側フェースの反対側にあるフェースのプリミティブ番号とそこまでの距離を格納してくれます)です。RBD Connected Facesノード内のCreate Constraint(コンストレイントの作成)をまず無効にしてください。そうしないと、RBD Material Fractureからのコンストレイントが上書きされてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/62ca68f2-1db8-a72d-5701-c062786d4246.png)

このノードは異なるエッジ間の距離をチェックしてくれます。その距離情報を後ほど使用して、互いに近すぎる面を削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/172c7f5e-be4a-c37a-b6be-7479a2a40b1a.png)

#### RBD Material Fracture + RBD Disconnected Faces

RBD Bulletソルバーを接続し、今度はRBD Disconnected Faces(繋がったフェースが分離されたタイミングを検知してくれます)を続けてつなぎます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7c2173ae-1ed9-081c-68ed-4d0921094740.png)

やりたいこととしては、「Delete Connected（繋がってたフェースを削除する）」モードを使用して内部の面を削除します。かなり低い距離のしきい値を使用することで融合ガラスが得られます。

融合ガラス（FUSED_GLASS）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e270ed6f-ded1-9e5f-c84a-fa3cfd1e6926.png)

Exploded Viewで見ると、内部の面が削除されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d0bc1448-5520-24ee-5c68-683086d1c36a.png)

融合ガラスがある場合とない場合を用意することで、レンダリング時に活用することができます。
Stageに移動してみるとガラスのネットワークが用意されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/17079529-9170-60d9-1dff-880ed2566d3d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4a23e459-6170-9cdc-7c2d-1be0365130ac.png)

左のFused_glassは地面に衝突して初めて亀裂が現れ始めますが、右のUnfused_glassは地面にぶつかって壊れる前にすでに最初から亀裂が見えるのがわかります。右よりも左のほうが良さそうです。RBD Connected FacesとRBD Disconnected Facesの組み合わせは、ガラスのマテリアルタイプを扱う際に本当に便利です！

## 木材の破壊をシミュレーション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6cec16ac-af13-a36b-9940-f5adc279eb79.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a0cb22eb-799d-8602-89b3-e649da1c13d5.png)

RBD Material Fractureのタイプにはウッドタイプがあります。
基本的にこれらのパラメータは木材の外観を制御するために用意されているものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1fe3ec33-ed4f-6251-2fe6-567fac648ef5.png)



興味深い機能として、Constraintsタブ内に「Switch to Soft Constraint when Broken」機能があります。これはジオメトリが壊れる際、ソフトコンストレイントに切り替えが行われます。結果として、木材が剛体っぽく壊れないようにすることができます。木材には少し曲がりがあるためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7f2c02af-684a-c1d5-8471-f9a49e1dfd17.png)

# まとめ

RBD Material Fractureノードを使ってジオメトリを材質に基づいて破壊し、リアルなシミュレーションを作成できます。
単一のジオメトリや、複数のジオメトリのセット、またはさまざまなタイプの材質であろうと、ジオメトリを破壊するための最初の選択肢となるほど便利なノードです。