blenderを使ってHoudiniのようにモデリングしてみましょう


# まえがき
blenderを愛用している皆さん、モディファイアは使っていますか？
便利ですよね。非破壊編集で、順番を好きに入れ替えることもできるし個々のモディファイアに対して表示非表示を好きに切り替えることもできます。

Houdiniはどうでしょう？何かとテクニカルでエンジニアリング～な印象を持たれることもありますがもっと素朴なモデリングに近いことも当然出来るんです。

実はモディファイアって割とhoudiniっぽいんですよ。ジオメトリノードはよく分からなくて手を付けられない人でもモディファイアなら多少は怖さが和らぎませんか？



今回はアドカレの枠をお借りしてプロシージャルモデリングの大得意なHoudiniでblenderのモディファイアによるモデリング再現をご紹介しようと思います。
（ついでにapprenticeアドカレのハードルもガンガン下げます）
（期日に間に合わずすみません）

# 作ってみよう

記事執筆時点における各ソフトウェアのバージョンはこちら
- blender　4.3.2
- houdini　20.5


---

早速この手すりを例にとって、blenderとhoudiniでそれぞれモデリングしてみましょう。最初はblender、次にhoudiniでの作り方をご紹介します。それぞれの似てるところと違う所を感じていただければと思います。


完成形はこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/8cdc9c0d-010d-fcdb-0485-641d48eb2a07.png)

幅２ｍ、高さ1.1ｍで１単位になる柵のようなてすりを考えます。
この物体は大まかに３つのパーツに分けられますから一つずつ作っていきましょう。

### 手すりの部分を作りましょう
１ｍサイズのキューブを高さ1.1ｍの位置に作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/438e8a8f-98d8-6bcb-7a43-4cb9fa0a7d68.png)
スケールに以下の値を入れると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/38e4bb01-5adb-4c19-0858-2cb9c523bec1.png)


横に渡る梁のようなものになりました。
今後の工程に影響するのでスケールに値を入れた後は**忘れずにスケールを適用して**おいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/26617f04-2774-9b7b-c72a-b0f7aba681c8.png)


ここから手すりを作るために早速モディファイアを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/16ca1f3a-80d1-c32a-2e68-954d53e46211.png)


「配列」はオブジェクトを一定のルールでコピペしてくれます。シンプルゆえにめちゃくちゃよく使うモディファイアです。
数を２にするとオブジェクト数のが二個に増えます。
オフセット（倍率）のチェックを切って一定のオフセットの距離Zに1と入れましょう。これでZ方向に1m離れた場所へオブジェクトをコピペしてくれます。

寸法が決まっている場合は「一定のオフセット」で絶対値を入れる方が管理しやすくて良いですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/b7817c18-c6d7-5efe-44ba-5bbaa7fe1968.png)


### 柱を作ります
次はチューブを出して半径と深度をそれぞれ１mにします。
※チューブの分割数はなんでもいいですよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/c199b25d-aa5e-8d93-c513-2e8c0190d362.png)

スケールのXとYに0.03を入れて棒の径をちいさくします。
終わったら忘れずに「スケールを適用」しておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/3b2fa7b4-4b87-421d-a1c5-69bfb52349ba.png)
トランスフォームのYZに値をいれて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/8ce33fb9-761e-4008-e89a-110efca4d61a.png)

柱を一つ生やしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/1034b898-390f-c40c-c4d6-63223314381e.png)

ここにモディファイアの出番です。先ほどのように配列で柱を増やします。

まず配列モディファイアの「数」を18にして、「オフセット（倍率）」のチェックをオフに、「一定のオフセット」にチェックをつけたうえでＸＹＺをそれぞれ 0, -0.1, 0の値にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/93c1398c-989a-7f92-eabb-a8dd3b8c3ddb.png)
-Y方向に0.1m間隔で合計18本の柱が無事生えました。

### 柱を作ろう　その２

次に地面に接地するための太い柱を作ります。
もう一度半径・深度が１ｍのチューブを出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/6ddc802d-7abf-e8f9-39ff-cbc7c1af6836.png)

トランスフォームとスケールに以下のような値を入れて、「スケールを適用」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/c4922848-c758-45ed-1c47-8f62b6d5be70.png)

大きいほうの柱も生えました。
これで柵パーツが完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/ebf9f291-7029-a047-3bf0-61b1b4312f52.png)
これだけでは柵っぽくないのでさらに配列を使って柵の幅を増やしていきましょう。やや強引なモディファイアの使い方をします。

配列の下に二つ目の配列モディファイアを追加しまして、「オフセット（倍率）」のチェックを切ったら「一定のオフセット」のYに-2を入れます。「数」は好きなだけ増やしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/6911c831-e263-2f6b-4981-c8de1f5c5fd2.png)

モディファイアは上から順番に処理されていくので上下の梁が数を増やすごとにどんどん-Y方向に伸びていきます。

同じ設定のモディファイアをほかの２パーツにも設定したいところですが少しだけ楽をする方法があります。

オブジェクトモードでモディファイアをペーストされる側の柱二つを選んで、最後に複製する側の梁を選び、コピペしたいモディファイアのオプション＞「選択にコピー」をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/fbcad02a-4e18-5a45-a119-9aff0e3a31ed.png)

するとあら不思議、モディファイアがパラメータごとコピペできるのです。普通に便利なのでこれだけでも覚えてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/add1beb1-919c-b3f7-2f27-8f3586b101a9.png)

今回は配列を二個重ねるだけのシンプルモデリングでしたが無事に柵っぽいものが完成しました。おめでとうございます。


# 次はHoudiniで作ってみよう
ではHoudiniを起動してblenderで作ったものと同じものをモデリングしてみましょう。
Houdiniは基本的にサブスクリプションでライセンスを買うものですがapprenticeという無料体験版的なライセンスがありますから、これを利用すればHoudiniのほぼ全機能を無期限に使用できます。（エクスポート等に制限あり）
Houdiniを持ってない方はぜひapprenticeライセンスではじめてみてください。

起動直後の画面はこんな感じです。右下にあるネットワークビューにノードを並べてモデリングしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/37db31a9-6618-cbb6-e266-6aeff5e76463.png)

blenderと同じようにこういう見た目を目指して作っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/13b5486d-628b-e42c-1f33-8e512cba0ced.png)


### 手すり部分を作ります
Houdiniでは右クリックもしくはtabキーでノードを作成します。
TABメニューが出ている状態でノード名を打ち込むと該当するノードの候補を出してくれます。目当てのノードをクリックしてネットワークビューに配置することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/44d83b28-b8b2-f3fc-d511-b102f6d37772.png)

最初はobj（SOP）階層にgeometryノードを作り、このgeo1というノードの中で柵を作っていきます。

ノードは横長の小さな形をしています。
これを上から下につなげていくことでhoudiniでモデリングや様々な処理を行うことができるんですね。上から下に処理するので実質モディファイアと言っても過言。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/cae1cc22-f7c9-03af-6d72-3b21d93f72ea.png)

さてgeo1ノードをダブルクリックして中に入り、boxノードを作ります。
ノード名をダブルクリックして「handle」に改名しちゃいましょう。えらく適当な名前ですが判別できればなんでもいいんです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/ca46226f-a024-3217-783f-002e283ca696.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/c2037d49-76b6-7e13-5cd6-f778298ead1b.png)
handleノードのパラメータを直接触って形状を変えてもよいですが、ここはtransformノードを作成してhandleの下につなげます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/f6ddcd6e-c949-94f8-21b2-0192b4989ff2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/3c9ffbd0-0e57-4f9d-cc4f-f204561dae6f.png)

tranformノードに以下のように数値を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/20fe54b4-5b03-fa93-efce-f275ee15a91b.png)
※Houdiniはblenderと異なり座標系がYアップであることに注意してください。軸の向きはビューポートの左下に小さく表示されています。

ここでtransformノードの右端が青くない場合は右端をクリックして青色にしてみましょう。このノード時点までオブジェクトを処理した結果がビューポートに表示されます。

__ノードの処理結果をビューポートで見たいときは右端をクリックして青くする！__ これも大事なので覚えてください。記事中も同様にビューポートに表示されているのは薄い青丸に囲まれている＆右が青くなっているノードの処理結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/040a6c66-e778-d92f-8fa6-5aab1e42f2c5.png)

梁が出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/fe7c18d6-d710-2983-22b8-31314227e457.png)
 
transformノードは文字通りオブジェクトを変形させるノードです。tlanslateが移動を表していますがそれ以外のscaleとrotateはblenderと同じ用語ですので多少はわかりやすいと思います。

次はcopy and transformと検索して同名のノードを出してください。実際に配置されるノードはcopy1のような名前になっているかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/0084f6d8-87a2-49fc-6369-7aa6ec21ec45.png)

transformのY欄（真ん中の列）に１と入れると1m上の位置に手すりがコピペされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/38e0cb92-2690-9414-af83-f1dea17963dd.png)
Total Numberはオリジナルを含んだ複製されるオブジェクトの合計数を指定します。
copy and transformはまさにblenderの配置モディファイアにそっくりです。説明しませんが割合によるオフセットや回転角度の指定もできます。

### 柱を作ります
新しいオブジェクトを作りましょう。handleの横にtubeというノードを出してください。
ノードの出し方は「ネットワークビューの空白を右クリックしてノード名を打ち込む」でしたね。tubeは二種類あると思いますがtube(polygon)を選んでください。
名前を「pillar」に変更してRadiusの値を1にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/24fbd934-66c4-1b75-6c17-f7a42a6132cc.png)

transformノードをpillarの下につないでtransformノードのtranslateとscaleへ以下のように値をセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/797c6c48-3ed1-2790-6d54-5cc90f934823.png)

こんな感じになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/3caaac79-8a1d-e5ec-18a7-3f552358d011.png)

copy and transformノードを出してtransformノードの下につなげます。
total numberに18、translateのZに0.1といれてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/bbd2bdb9-0068-7772-5b15-65cdd94ca7b1.png)
柱がいっぱいに増えました。これで細いほうの柱は終わりです。


二つのパーツが出来たのでひとつに統合してみましょう。
mergeノードを作って __名前を「merge」にします。__ ふたつのcopyノードを図のようにmergeノードにつなげてmergeの右端をクリックして処理結果を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/c69db95c-e0d3-4c67-af09-0399b98d3a15.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/bf5433be-beac-f771-1bdf-fc8fa5748628.png)
二つのオブジェクトが統合（マージ）されました。
ここはblenderと異なるところだと思います。すべての作成したオブジェクトが常にビューポートで見られるわけではなく右端が青いノード（display状態）だけがビューポートに表れるんですね。


### 柱その２を作ります
最後のパーツを作ります。先ほどの柱と同じようにtube(polygon)ノードを作成して名前を「bigPillar」に、radiusを１にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/e00396a6-5767-dff8-2b1a-d5cd31f6b8d2.png)


transformノードをbigPillarの下につなげて以下のように値をセットしてみてください。
（諸事情で途中からUIの見た目が変化していますが内容には関係ないので気にしないでください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/851f8c0d-d0e9-367d-3e44-dfafe9e43bd6.png)

大きい柱はコピーする必要がないのでこれで最後の柱は完成です。この柱も先ほど作ったmergeノードにつなげて合体させましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/23c505ff-ddeb-c5a8-4676-24f3d08ef97f.png)

ちょっと大柱の上下に隙間がありますね。
bigPillarの下につなげたtransformのscaleのY(緑の値)を1.1にして柱を伸ばすとちょうどよくなりました。この程度のちょっとした修正であればblenderでも楽々にできることですがもっと複雑な連動を伴う修正になるとだんだんhoudiniのすごさが出てくる…はず、でてくるんです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/00fb494e-1cef-34f2-857f-102367641f5f.png)

最後にmergeノードの下にcopy and transformノードを作って柵を横に並べていきましょう。blenderの配列モディファイアにおける「オフセット（倍率）」と同じようなことをしたいのですがここでちょっとHoudiniらしいテクニカルなことをします。

total numberに４とか５とか好きな数字を入れてください。このままだと全く同じ位置に柵がコピペされるだけなのですが…
translateのZ（一番右の列）に以下のような呪文を唱えてください。
```
bbox("../merge/",D_ZSIZE)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/8325687f-3473-9234-3d6d-c18d1b6de01a.png)

さっくり言えば先ほど作った「merge」ノードのオブジェクトのバウンディングボックスを測ってZ方向のサイズをtranslateのZに代入しています。mergeノードの名前がずれていると呪文が効かないのでノードの名前と呪文中の名前はそろえてください。
```python
# 意味のイメージはこんな感じ。不正確なので読まなくてもいいです。

bbox() = バウンディングボックスを計測する
"../merge/"　=　「merge」ノードの
D_ZSIZE　=　Z方向のサイズの値を取り出す

# この呪文にはエクスプレッションという名前がついています。覚えなくてもいいです。

```

呪文を唱えたことで柵が隙間なく並べられました。これで完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/c9c90b6d-5beb-2473-9cbe-5e68518dc0cc.png)
blenderであれば一瞬で出来ることをHoudiniではわざわざ呪文を唱えて実現したわけですが、ちょっとした応用をやろうとするとHoudiniの便利さが垣間見えてくるはず、見えてくるんです、きっと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159270/bf44f039-988c-2bf4-c83b-1daa13ced896.png)
※呪文の後ろに定数を足してスキマのある柵が作れるとか…

例えば柵の高さに合わせてほかの柱が連動したり、柵の幅に合わせて柱の数が増減する仕組みを作ろうとするとHoudiniが輝いてきます。私がすでに力尽きたためここでは紹介できないのが残念です。

# おわりに

「blenderのモディファイアとHoudiniのノードベースモデリングってなんか似てる」
かねてよりふわっと考えていた事とはいえほぼ思い付きで記事の内容を決めて、モデリングしながら同時に記事を書いたので結果としてなんか…なんかアレな感じになってしまいました。許してください。

それは置いておいてHoudiniのこと、すこしは好きになれそうでしょうか？
ノードベースやプロシージャルという考え方は一般的なポリゴンモデリングだと慣れないものですが段階を踏めば意外とできるものだと思っていただければ幸いです。