Point Deformを使って破壊表現をしてみる

#はじめに
この記事は [Houdini Advent Calendar 2020](https://qiita.com/advent-calendar/2020/houdini) 4日目の記事です。

初めまして、Twitterで[みずのり](https://twitter.com/mizunori556)という名前でやっている太田といいます。
(作品をあまり上げてませんが)
現在専門学生で、昨年からアドベントカレンダーを拝見していましたが、
まさか自分が書くことになるとは思いませんでした。
Apprenticeの方が良かったかもしれませんが、あまり変わらないとお聞きしたので、
参加者の方々がプロばかりで恐縮ですが、参加させていただきます。

##概要
今回は学校でのグループワークで使用した**Point Deform**を用いた破壊表現を記事にします。
構造は非常に簡単になものになっております。
また、パッと調べた感じなかったですが既出でしたら教えて頂けると幸いです。

1つご理解頂きたいのは、シミュレーションを行うわけではないのではありません。
<font color='red'>**物理的に100%正しくない表現**</font>というのはご了承ください。
バージョンは **Houdini indie** **18.5.351**を使用しています。
それではよろしくお願いします。

##Point Deform の紹介
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/eb380219-e488-f1f7-4b6b-0a2f313f0f00.jpeg)
[公式の日本語ヘルプ](https://www.sidefx.com/ja/docs/houdini/nodes/sop/pointdeform.html)を参考に説明すると、名前の通りポイントをデフォームしてくれます。

- 変更するオブジェクト (input1)
- ガイドになるオブジェクト (input2)
- ガイドと比較されるオブジェクト (input3)

の3つの入力が必要になります。
input2,3の<font color='red'>**ポイントやプリミティブ数は一緒**</font>にしないと不具合が起きる可能性があります。
input2,3の差を計算してinput1のオブジェクトのポイントをトランスフォームします。

##今回の使用例
実際に使用したカットです。
![groupwork.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/175d5f88-9ccf-ff5b-6f43-994efff81ffa.gif)
なぜシミュレーションをしなかったかというと、

- 渡された建物データのポリゴンがぶっさしまくり
- 締め切り間際に作業を割り振られた

(メンバーとの確認は本当に大事だと思わされました)
ポリゴンがめり込んでいると正常な計算がされずに破片が飛んでいったり・・・
話し合った結果、よく見えれば良いということになり、**Point Deform**を使い変形させました。
前述の通り、<font color='red'>**物理的に100%正しくない表現**</font>なので改めてご理解ください。

##1. 土台の準備
まずは、土台の準備をします。
破壊されるオブジェクト（以下：地面）と破壊するオブジェクト（以下：球）用意します。
今回はシンプルなBoxと、落下するだけのsphereでいきます。
![cap02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/24078a5b-d579-b64f-d869-ca81d80ee5d6.jpeg)
![cap03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/5d9534c3-aa78-3370-c0b4-eff86b2fd3b5.jpeg)
次に地面を破壊するために**Voronoi Fracture**で分割していきます。
球が地面に接地した時の、情報を参考にしました。
![cap04.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/79d66db1-02e2-e9b0-4f7c-1481187dada1.jpeg)
今回はこれでもよかったですが、情報量を増やすためにもう少し細分化しました。
実際の場合は、できるだけモチーフとなる物の形状や性質に合わせてください。
![cap05.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/508c6620-7aa0-6470-78c5-e44e020acf2e.jpeg)
これで準備はOKです。

##2. ガイドオブジェクトの作成
入力されたオブジェクトをデフォームするためのガイドオブジェクトを作成していきます。
この作業の全体です。
<img width="600" alt="cap07.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/bd7b3435-6c4e-ff94-7997-39baafcc3867.jpeg">
今回はGridをベースにノイズをかけて作っていきます。
まず、球が落ちた時の範囲を取得するときの準備のため、球にborderというアトリビュートを与えます。
<img width="600" alt="cap06.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/762c04a4-aac9-f5dc-af0b-4607c4eedeac.jpeg">
**Solver**内では、このborderをもとにGridへアトリビュートを移していきます。
そして、borderアトリビュートが1の範囲でグループを作ります。
**Solver**を使うことで、球が離れても継続してグループを維持します。
![cap09.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/6fa5956a-95a1-6183-fcb3-398f29959113.jpeg)
ここで設定したborderグループに**Mountain**でノイズを与えます。
もっと賢いやり方があると思いますし、キーフレームを打つのが少し手間ですが今回はボールの着地に合わせてキーフレームを打っていきます。
着地後も地面が動いたのが気になったので**Time Shift**で気になるところを止めて**Switch**で切り替えることにしました。
![cap10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/438df8c5-7360-307d-115c-855250eaaa4c.jpeg)

##3. Point Deformを使って変形させる
最後に**Point Deform**を使って変形させていきます。

- 変更するオブジェクト (input1)
- ガイドになるオブジェクト (input2)
- ガイドと比較されるオブジェクト (input3)

を繋げていきます。
![cap11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/6c9582f5-f691-87f1-ee12-ec795f940485.jpeg)
このRadiusの値が小さいほど影響される範囲が小さくなるので、強く狭く変形されます。逆に大きいほど広い範囲に影響するので、プレビューに合わせて調整する必要があります。
![cap14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/14f666af-fe87-e772-5e2b-25b4e5a1b79b.jpeg)
最後にいろいろ調整して完成！
![final_preview.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848699/a0e50633-3850-37c6-89fd-6c9617c6a560.gif)

##まとめ
以上、**Point Deform**を使った破壊表現の紹介でした。
作成したhipファイルはこちらになります。
https://drive.google.com/file/d/1IEb11mTYg0cSPm5vhRB-R3qJSfy2ES3d/view?usp=sharing

この方法だと問題が多いかもしれません。

- 貫通したり物理的に正しくない
- 非破壊的な構造ではない etc...

ただ、アニメーションではなく動かないアセットなどの破壊表現などには使えるかもしれません。

もし記事内で間違いや不明点等あれば書き込んでいただけると幸いです。
初めての記事で拙いこともあったと思いますが、最後までお読みいただきありがとうございました。

##おまけ
冒頭の使用例のグループで制作したショートムービーの紹介をさせてください。
見ていただけると嬉しいです。
[煩悩 BONNOU - 3DCG Animation](https://www.youtube.com/watch?v=-uCtaGNxyX8&feature=youtu.be)