Houdiniでハロウィンかぼちゃのバリエーションを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/6fd3df24-fafa-c358-ab49-86bf05c4ef8a.png)

# はじめに
こちらはHoudini Apprentice Advent Calendar 2023 (12/19) の記事になります。

クリスマス間際にハロウィンの話題で申し訳ないですが、ハロウィンのカボチャって顔に色々なバリエーションがありますよね。
誰しも、今年のハロウィンかぼちゃの顔どうしたらいいかしら…と考えているうちにハロウィン当日になってしまった、という経験はあると思います。
<img width="200" alt="IMG_3898.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/9bf73478-a9f4-8a51-6a4f-7ae3a569d1b7.png">

そこで、HoudiniのTOPsを使って様々な目・鼻・口の組み合わせを試せればお手軽に
**最強のハロウィンカボチャ顔**が作れるのではないか？
という仮説を立て、実際にハロウィンかぼちゃのモデリングに挑戦した内容になります。

ハロウィンかぼちゃを作る時にしか役に立たなそうな内容ではありますが、つまづいたところ、工夫したところなどを書いていきたいと思います。

　「こんばんは サンタクロース
　　全てを理解した者は皆…　
　　死ぬまでハロウィンの事しか考えられなくなるのです」


## 目次
[1.カボチャ本体の形状を作る](#1-カボチャ本体の形状を作る)
[2.カボチャの顔を作る](#2-カボチャの顔を作る)
[3.カボチャのヘタを作る](#3-カボチャのヘタを作る)
[4.TOPsで顔のバリエーションを検討する](#4-topsで顔のバリエーションを検討する)
[5.反省点](#5-反省点)

## 1. カボチャ本体の形状を作る
まずはカボチャが無いと顔を掘ることができないのでカボチャ本体を作ります。
<img width="200" alt="IMG_3898.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/13a3c262-8169-cdae-0120-6bed79e2440b.jpeg">
↑スーパーで買ったリファレンス

### カボチャの房を作る
ネットでカボチャの画像を漁ると、だいたいのカボチャは10コの房に分かれていることが多いようです。
そこで、房を1つ作って円形に10個並べてカボチャっぽくする作戦で行きました。

#### Sweepと格闘
まずは陸上のトラックのような形のカーブを作り、そこに半円状のカーブをSweepさせて房の形を作ることにしました。

LineとCircleを使って下図左のようなカーブを用意し、半円状のカーブをSweepさせた結果がこちらです。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/f7bade22-4d5b-925e-754b-4f3132548118.png"> どうして…

初手から躓いていますが、**自前で作ったキメラカーブにSweepさせようとするとねじくれる問題**に遭遇してしまいました。
今までも起こったことはあるものの適当に回避してきたので、今回は **きちんとSweepの[マニュアル](https://www.sidefx.com/ja/docs/houdini/nodes/sop/sweep.html)を読む** ことにしました。
マニュアルを開くとのっけから背骨曲線や断面曲線など初見の四字熟語に圧倒されます。
問われる国語力。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/53b0a2b9-c309-8a63-cccb-fac1dea57132.png">　
見ていくとCopy to Pointsとかでも必要になるアトリビュートが散見されます。
　　N君「オブジェクトのZ軸をどっちに向けたいの？」
　　upさん「オブジェクトのY軸をどっちに向けたいの？」

ということはつまり、他ならぬこの私自らが回転を完全にガチ指定してあげれば上手く行きそうです。
**「断面曲線の回転をHoudiniに握らせるな!!」** ってことですね。

まず半円カーブの法線はOrient Along Curveでつけることにしました。
実はこのノードでupアトリビュートも追加されます。
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/5de0a01c-45f1-9196-c48d-e041ea994196.png">　<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/a9383aeb-7cc5-2224-f047-733ffd27e965.png">←青い線がN、黄色い線がupです
↑実は用意されているup。自分は「使うとこ以外見えない病」なので見落としがちです。

LineのほうにもAttribute Wrangleで半円カーブと合うようにNとupを追加しました。
<img width="170" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/9a548ff0-9e13-7db3-504c-9dad0f3c3ceb.png">　<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/cf2747ae-f855-1d37-dcf6-c00d0061a58c.png">



これらのカーブをMirrorで上下左右対称にしてFuseしたものがこちらです。
<img width="185" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/95984797-0dda-2779-6159-68f586f1de4f.png">　<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/ad5e8cbb-3d41-85bf-1091-f52912b8b6a3.png">　



満を持してこのカーブにSweepさせると…
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/5a950fff-a047-651b-9bca-140c244b6279.png">　そなたは美しい…
これをカボチャの房の形の土台にします。

#### Lattice備忘録
Fuseでくっついていないポイント同士をくっつけてからPolly Fillで真ん中にもポリゴンを張り、Latticeでカボチャの房っぽい感じに歪ませたいと思います。
Latticeの真ん中と右の入力にいつもBoxをそのままつないでエラーを出すのが個人的恒例行事なのですが、Boxの場合はPrimitive TypeをPolygonにしてDivisionを合わせる必要があります。もしくはBoxでなく**Bound** も便利です。
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/dc1ad730-d40d-d5df-903b-b49d4c0d890e.png">
BoxのPrimitive TypeがPolygon Meshのままだといくら分割を合わせても無駄なので気を付けましょう（自戒）

<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/22026fe0-d93b-bf8d-fdc8-684413ca7c72.png">

### Copy to Pointsで円形に並べる
房ができたら後はこれを円形に並べます。
Copy to Transformで角度を変えて並べるだけでも十分かと思いましたが、この時はやる気に満ち溢れていたので、Circleで作成したpointのpscaleに多少ランダムを与えて房をCopy to Pointsし、房のサイズが少しばらつくようにしています。
Circleのサイズを調整することでカボチャの直径も変更しやすくなります。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/2065775b-f14c-8847-331a-a9daaccb9478.png"> → <img width="220" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/212df9f5-03a5-db00-d1f5-a4600a805582.png">



後で色々な形状を試していて気づいたのですが、直径の大きいカボチャを作ろうとすると、房が中心から離れていき真ん中に穴が開いてしまいます(下図左)。
そこで、真ん中をいい感じに埋めるTube型のメッシュを最後にマージしています(下図右)。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/13085780-130e-013f-6ba4-c1acf7e64ca3.png">

### VDB化→スムース→再度ポリゴン化する
現実のカボチャの房同士はパッキリ分かれていることは少なく、緩やかな谷間のようにつながっているので、一度VDB化してスムースをかけ、再びポリゴンに戻してからMountainで歪ませることで有機的な形を目指します。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/9e9b0457-e591-f09d-d656-d501c6e9020c.png">　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/41a53d2d-58cc-1fd4-47f8-c64b29b56f9a.png)
[さつき先生の動画](https://youtu.be/CbuHYTyyIbU?list=PLAsWwUHApt3P92c3R1VjJrPJQNIfEijrT&t=684)で知って以来この手順が好きでたまりません。

### UVの作成とRayでリトポロジー
一応テクスチャを書き出すことも想定してUV展開も考えてみました。
一度VDBにしているのでトポロジーも有機的になっていて、このままだとUVを整えるのが大変そうでした。
そこでハイポリゴンなSphereを用意してUV展開しておき、Rayでカボチャの内側から貼り付けたれ、と思ったら案外うまく行きました。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/79c065f9-aa8e-0c57-4be3-ed063e6f9e36.png">　<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/e69a6897-eb81-333f-3884-fd265d45c21a.png">
↓これならSphereの分割を変えるだけでポリ数の調整も簡単そうです。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/820bc3df-a0fa-ad65-9591-0ba98c976ada.png"> ローポリ版( )

### 裏面を作る
ハロウィンかぼちゃの場合、中身をくりぬいて顔を掘るので、厚みと裏面が必要になります。
当初はメッシュ全体を内側か外側にExtrudeする作戦で行ったのですが、どうしてもメッシュの破綻が起こりやすく後の作業に支障が出たので、単純にスケールを小さくして法線を反転させたものをマージしました。
（この単純なことに気づくまでにけっこう時間を要してしまったんですが…）
マージした後Clipで真っ二つにしてみたのが下図右です。うまく行っていそうです。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/f5cb631f-904f-7353-6274-b72eaf551e44.png"> <img width="280" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/e3ef3088-e4d6-fbb6-5516-6da79571ade8.png">

裏面は表ほどUVの面積はいらなそうなので、適当に小さくして並べておきます。
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/3080cf80-6d8f-bc15-468d-f5f3a466130e.png">


### Subnet化する
後でカボチャを大量生産しやすいように、ある程度できたところで一度subnet化し、調整時にいじるであろう数値をパラメータに出しながら作業していました。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/db0f28e4-622b-9aab-6198-8e2c3dcec6fe.png">

## 2. カボチャの顔を作る
カボチャ本体が出来たら本命の顔パーツを作っていきます。
流れとしては平面ポリゴンで各パーツを作成して(下図左)、Extrudeで立体化し(下図右)、
先ほど作ったカボチャ本体をブーリアンでぶち抜く、という至ってシンプルな方法で行いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/6edb8c2b-9cf1-74fb-ba4d-98e8054eb52a.png)
↑口のうちの1つ

顔パーツの平面ポリゴンの形をHoudini内でガチンコ作成するか、Photoshop等で書いてTraceでポリゴン化するか迷ったのですが、~~Photoshopを起動するのが面倒だったので~~今回はHoudini内で作りました。
結論から言うとHoudini内で作るのはかなり手間だったので、大人しくPhotoshopを起動すべきだったかもしれません。

のちのちTOPsで組み合わせを試したいので、目・鼻・口それぞれのパターンをSwitchで切り替えられるようにまとめておきます。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/56219f46-4bc4-e280-fb37-003cfa4a20a7.png">

パーツができたらいよいよカボチャをぶち抜くのですが、目をBooleanして、鼻をBooleanして、口をBooleanする…というBoolean祭りをやったところ、一度Booleanした後のメッシュはどこかに破綻を抱えがちで、エラーが出て次のBooleanができない、ということが多々あったので、目鼻口は一つにマージしてBooleanは1回で済ますことにしました。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/ac957822-3a62-5112-405c-395768cd23b1.png">
余談ですがそれでもBooleanがうまく行かなくなったことがあり、なぜかSphereの割り数を変えたら無事Boolean出来ました。
このカボチャはガラスのような繊細さで成り立っております (堅牢度ェ…)

## 3. カボチャのヘタを作る
やはりヘタが無いとどこか締まらないので、ヘタも作っていきます。
こちらも数パターン作りました。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/47427a97-b62e-b753-5577-81216682384b.png">
カーブにStarノードをSweepさせているだけです。

## 4. TOPsで顔のバリエーションを検討する
TOPsの使い方は[さつき先生の動画](https://www.youtube.com/watch?v=kadOc7yEsuY&list=PLAsWwUHApt3PSPZogXiQqejWecHM2NngW&index=3&ab_channel=StudioSatsuki)で予習済みなので、いよいよTOP Networkノードを作り、TOPsを組んでいきます。
総当たり戦をすれば全ての組み合わせを確認できるハズです。
もうやり方は[さつき先生の動画](https://www.youtube.com/watch?v=kadOc7yEsuY&list=PLAsWwUHApt3PSPZogXiQqejWecHM2NngW&index=3&ab_channel=StudioSatsuki)を見てくださいとしか言いようがないほど組み方から書き出しまで同じ方法でやりました。

Generic GeneratorノードでItem Countを用意したパターン数にし、
Attribute Createノードでアトリビュート("eyes"とか)を作り、Valueは@pdg_indexをパターン数で割った余りを出して繰り返させます。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/46401dbd-5798-1ae2-368c-471349fd468a.png">
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/bb23810e-8079-f670-d2ce-fca46a4b786e.png"> 
↑バリエーションが増えてもeyesは0～7を繰り返してくれます。
これを目・鼻・口の分用意します。
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/22117c55-8225-8734-5ae8-ace65712bc45.png">

TOP Networkを出て、パターンをまとめているSwitchノードのSelect Inputに作成したTOPsで作成したアトリビュート（@eyesとか）を記入し、TOP Networkノードの丸ポチをクリックしてパーツのパターンを切り替えられれば一安心です。
<img width="220" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/6c23e9c2-df77-800b-9fe7-a21d32035697.png">　<img width="180" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/596a1ed5-29c3-62a0-d48b-351147503a5c.png">


今回はタイムスライダを動かすことでパターンを確認したかったので、総当たり戦を連番で書き出しました。
↓それがこちらです。

https://x.com/nakamurakki/status/1715754374935531714?s=20

↑この時はカボチャ本体のパターン、ヘタのパターンも一緒に総当たりしたので数がすごいことになり途中で書き出しを諦めました。実際には顔パーツだけで十分そうです。

しかしバリエーションを確認するならタイムスライダではなく **画像一覧** を出すような仕組みのほうが見やすかったかもしれません。そちらはまた挑戦したいと思います。

<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348794/1226414a-eb51-aa26-af3d-1013a7fd8f49.png">

↑なんだか爬虫類っぽくてかわいいですね。あんたが優勝！
というわけで個人的 **「今年の最強ハロウィンかぼちゃ顔」** が決定しました。

## 5. 反省点
### すべてをプロシージャルにしようとしたことで大切なことを見失った
元々本来の目的としてはハロウィン的なイケてる画像でもアップしたい、ついでにTOPsも試そうくらいのノリで始めたのですが、実際に絵作りやTOPsにかけた時間はごく僅かで、カボチャジェネレーターを作ることに夢中になってしまいました。

あれもこれも、後から変更するかも、ランダムに出来たほうがいいかも…とやってるとキリがなく、気づけばあと5分でハロウィンが終わっちまう…というところで何とか画像を投稿した形となりました。

https://x.com/nakamurakki/status/1719367474834260159?s=20

いかがでしたでしょうか？
先人たちが「プロシージャルは組んでも呑まれるな」と仰るのが少しわかった気がした、思い出深いハロウィンとなりました。
このカボチャジェネレーターはもったいないので来年のハロウィンにも改良して使いたいと思います。

ハロウィン！ハロウィン！