山里ぽん太

Zigsaw Puzzle

14 April 2019

山里ぽん太はジグソーパズルを組み立てました。


Chapter 1 ジグソーパズル
というわけで、僕はジグソーパズルが好きです。
ときどき組み上げて、家の中やなんかに飾っています。
というわけで、Houdini でジグソーパズルを作ってみようと思いました。
マジっすか?。
Houdini に AI 機能なんて搭載されていましたっけ?。
Crowds のシミュレーションは、なんとなく AI って感じですけど。
でも、Crowds をジグソーパズルに応用できるのでしょうか?。
大丈夫です!。
Houdini は魔術師です!。
不可能はありません!(おおー)。
だがしかし、ぽん太さんは凡人です。
無理です(笑)。
Chapter 2 アニメーション
というわけで、ジグソーパズルの解法を Houdini の AI で計算するのではなくて、単純なアニメーションにします。
絵は、テキトーな絵を使います。
毎度おなじみのこの絵です(笑)。

Chapter 3 ピースを作る
というわけで、ジグソーパズルのピースを作ります。
都合、4種類作ればいいはずです。
ほんとうでしょうか?。
ジグソーパズルのピースの形は、いろいろあって、しかも、同じ形のピースはありません。
実は、大きな板を、ジグソーの切れ目みたいに切り抜く方法がないかと、少し考えました。
たぶん、方法はあると思います。
でも、難しくなりすぎるので、今回はパスします(笑)。
というわけで、次の4種類のピースを用意しました。


Chapter 4 とりあえず組み上げる
というわけで、とりあえず、ジグソーパズルを組み上げてみました。
こんな感じです。
最初は、ダイナミクスを適用することだけを考えて、transform と merge で作っていましたが、途中でやめて(笑)、Copy to Points で作り直しました。

ネットワークはこんなことになっています。

Chapter 5 絵を投影する
というわけで、組み上げたジグソーパズルに、絵を投影してみました。
絵を投影する方法にもいろいろありますが、とりあえず、2通り試しました。
まずは、uv quick shade です。
こんなんなりました。

次は、uv texture と attrib from map を使って、色データをアトリビュートに格納する方法です。
こんなんなりました。
色味が違います。

Chapter 6 壊す
というわけで、組み上がったジグソーパズルを壊しましょう(え)。
もう壊すんですか?(悲)。
いいんです。
Houdini は魔術師です!。
元に戻すことなんて簡単にできます!(おおっ)。
壊すことはさらにずっと簡単です(笑)。
シェルフツールで、組み上がったジグソーパズルに RBD を適用して、テーブルに static object を適用すればいいのです。
というわけで、壊れてゆく途中の1枚は、こんなんです。

ところで、RBD を適用すると、uv quick shade で投影した絵は、消えてしまいます。
なので、ここでは、 attrib from map を使っています。
Chapter 7 組み上げる
というわけで、ジグソーパズルを組み上げるアニメーションを作りましょう。
ここは、ポイントの操作なので、attribute wrangle をつないで、VEX でちょちょいのちょい、です(笑)。
もちろん、ベクトルフィールドや、フォースを使ってもできます。
こちらは、uv quick shade を使っています。
もちろん、uv quick shade のほうは、attrib from map よりもずっと負荷は軽いです。
というわけで、組み上げている途中の1枚は、こんなんです。

Chapter 8 レンダリングする
というわけで、レンダリングして動画にしてみました。
ジグソーパズルが組み上がって、壊れる、という動画です。
組み上がるところと、壊れるところの色味が違っています(笑)。

Chapter 9 メモ
① uv quick shade で絵を投影したデータは、RBD のダイナミクスの中では保持されないのか、表示されなくなってしまいます。やむなく attrib from map を使いましたが、絵の解像度を上げるためには、ピースのジオメトリを細かくしなければならず、負荷が重くて困りました。ジオメトリを細かくしたあとで RBD を適用しようとして、Houdini があちらの世界へ行ってしまったので、ジオメトリが粗いままで RBD を適用して、そのあとで、ジオメトリを細かくしたところ、なんとか処理してくれました。

② 今回のレンダリングでは、light を配置していません。

③ uv quick shade 、attrib from map のいずれも、ジオメトリの両面に投影されます。今回は、裏面の投影を隠す等の処理はしていません。