爆発で硬い地面がえぐれた様な跡を作るよ

どうも、Houdinistです。
たまにはゲームエフェクト屋らしくエフェクト表現をお題に記事を書いてみます。

# 爆発で硬い地面がえぐれた様な跡
今回は爆発で硬い地面がえぐれた様な跡を作っていきます。
こういうのは手で描くとなかなか難しくどうしても手で描いた感がぬぐえないですし
バリエーションを作ろうと思った時に工数がものすごくかかりますのでHoudiniに計算させて
楽してしまった方が良いでしょう。

**Houdiniでひび割れジオメトリを作る　→　ゲームエンジンで視差マップを使って表示する**

まずはジオメトリとしてこういうものをHoudiniで作ります。

![groundCrack2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/86ca1add-935a-98a0-5f1b-cd8dcc36017c.gif)

### 地面をえぐるためのもの
まずSphereをボロノイで割って外側を剥がします。
ここは難しいことは無いと思いますがめんどくさい人は左上のシェルフのModelのShatterを使ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/225061b8-7513-059c-d553-8c316ed21673.png)
勝手にノードを作ってつなげてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/a94d3543-e126-68f5-5e5b-ac5df8d60c1e.png)
外側を剥がす際はこの様にGroupExpandを使ってFlood Fill to Connected Geometryで外側を破片単位でグループ化しておき
Blastで削除しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/26c7ab92-df2c-971d-ff52-8622a2775708.png)
そしてCleanで内側の重複した面(Primitive)を削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/dd4d39bd-d758-5cbd-61af-7d731ce210d0.png)
これを地面をえぐるためのパーツAとします。
次にひび割れ部分を作っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/f8f46a1e-1af1-ebfe-02fe-c580adb5d88b.png)
Circleをwrangleで歪めてRemeshし、ひび割れの為のエリアを作ります。
次にPARTS_Aの領域内にある点群を**start**という名前でポイントグループを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/d5abe22f-368f-22da-dc03-7bdd9a44516a.png)
ボーダーエッジの部分に**border**というポイントグループを作り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/9ffc4fa5-e5c8-13e1-7878-d02a942ca8a4.png)
ボーダーポイントの中からランダムにエンドポイントのグループ(**end**)を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/3c6568f1-e652-ced0-35ac-d50b18ad6f4e.png)
設定した**start**と**end**のポイントグループを使ってFindShortestPathにひび割れのラインを描かせる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/3e9a6a76-a886-1d95-debc-04afef2637cf.png)
FindShortestPathでヒビのラインと同時に生成されたcostというstartからの距離のアトリビュートをリマップして**pscale**アトリビュートを
調整して**sweep**にヒビのメッシュを生成させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/9ce0c421-e185-d94e-98bf-723ca51eb7b2.png)
Transformで縦方向に膨らませてPARTS_Bとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/9761b483-24a2-73b3-67ab-07a083e860ba.png)
PARTS_AとPARTS_BとBooleanでUnifyしてからgridにthickenかけたものでBoolean(Intersect)して上半分をバッサリ切ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/8cabf98b-d4b6-7de1-7e5a-792b6fd18de1.png)
上の面を削除して面を反転させてこれを**ヒビの断面(下部)**とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/4889b68f-b91f-b0f0-79ad-a7a8a608444d.png)
gridから先程PARTS_AとPARTS_BのUnifyの結果で削ります。
あとSweepで使った**pscale**もAttributeTransferで持ってきておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/a1ebf235-6f19-dfbe-1ba9-f087bb02258c.png)
PolyExtrudeでちょっとだけ上にふくらませてwrangleで**pscale**をrampパラメータで盛り上げます。
これを**ヒビの断面(上部)**とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/aba7e7de-0e8a-c4c0-4ce7-2d99a52c81c1.png)
**ヒビの断面(上部)**と**ヒビの断面(下部)**をMergeしてNormalかけてFuseでPointをくっつけてSmoothでなじませて
多少Magnetで反り返らせて形を微調整かけてヒビ形状の完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153910/d88d2b03-60b6-4864-d4f8-d405c48fe7ec.png)

これをゲームエンジンに持っていってUnrealとUnity上の視差マップでそれっぽく見える様にしてみます。
そのうち書こうと思います。

今回はこの辺で。

hipは[コレ](https://drive.google.com/file/d/1E873QSCSQgVX1-9yVUCG-WbJUKyFjwCW/view?usp=sharing)です。