【Houdini】道路に沿ってモデルを配置させてみた

#はじめに
Houdiniで道路を作成し、道路の脇にモデルを配置させるものを遊びで作ってみました。
今回はこれの作り方を解説します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/1daefeb8-65e3-418f-e578-0abac30b9f49.png)

## 作ったものについて
カーブラインを変更すると、道路の形状と建物の配置が変化します。
![1.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/005841a1-68f4-b465-e49d-36b3aae5934b.gif)

## 環境
Houdini Apprentice 17.5.173

# 1.道路の作成
カーブをベースに簡易的な道路を作成してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/624351ad-2130-fb10-cc12-412e9de74591.png)

## STEP1. センターラインの作成
Curveノードを使用してカーブを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/f637ce62-3012-6c48-3c95-57e5ab7fe5db.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/b5ea6250-68ee-11be-d802-087d12c909c9.png)

## STEP2. センターラインに幅を持たせる
```PolyExpand2D``` ノードを使用して、ラインを水平に広げて幅を持たせます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/47f7079f-ba59-13ac-282d-667a2c938af0.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/c30fb642-f2eb-3483-1038-5810ee20e10f.png)

## STEP3. センターライン厚みを持たせる
```PolyExtrude``` ノードを使用して、センターラインに厚みを持たせます。

押し出した側面を別の```PolyExtrude``` ノード側で押し出す用途に使いたいので、
```SideGroup``` のチェックをONにて押し出した面の側面にグループを付与しておきます。

前面と背面にはセンターライン用のマテリアルをアタッチしたいので、```FrontGroup``` と```BackGroup``` にもチェックをいれておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/38db399b-a4f6-bfc3-c201-5e37c7382dc0.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/5b298c29-984f-a5bd-9bed-e19a6826a29f.png)

## STEP4. 側面を押し出す
Step3で作った ```PolyExtrude``` ノードに ```PolyExtrude``` ノードを接続します。
今回はStep3の側面を押し出したいので、Step3にて側面として割り当てておいたグループ ```extrudeSide``` を入力します。
押し出した部分には道路用マテリアルを割り当てたいので、```Front Group``` と ```Side Group``` にチェックを入れておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/ade1600d-0f75-6458-3f70-2924cc71ed78.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/b847e3a4-6a7a-e485-da43-42ba1e727b83.png)

最後に、法線計算を行うNormalノードを接続しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/8a3615d3-7e25-0005-98a9-90f27f0482f5.png)

## STEP5. 道路用のマテリアル作成
次に道路に割り当てるマテリアルを作成していきます。
道路のノードと同じ場所に ```MaterialNetwork``` ノードを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/ceac420d-d12b-b9ed-051b-cf4c8609e452.png)

```MaterialNetwork``` ノードの中に入り、```Principled Shader``` ノードを2つ作成します。
片方はノード名を ```road_surface``` にし、```BaseColor``` をグレーにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/53f38833-1661-9407-47cf-dad38a36924d.png)

もう片方はノード名を ```road_centerline``` にして、```BaseColor``` をオレンジ色にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/c37382e7-d22f-b7f9-64f1-ed709a3fa4ed.png)

以上でマテリアルの作成は完了です。　次にこれらのマテリアルを道路に割り当てていきます。

## STEP6. 道路にマテリアルを割り当てる
STEP4で作成した```Normal``` ノードに ```Material``` ノードを接続します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/a74069b0-81e9-5169-a2ec-f46c821e8481.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/e11d1422-36af-0283-1e5b-d50683392ca7.png)

```Material``` ノードではどのグループがどのマテリアルを参照するかを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/76617b25-f3d3-c6dc-e923-71a615823b08.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/0f4fce92-0818-df7d-57b8-2fc43cfa66d4.png)

設定が終わると道路は以下のような見た目になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/624351ad-2130-fb10-cc12-412e9de74591.png)


# 2. モデルを配置する
## STEP0. 配置用のモデルの用意
今回は下記URLのモデル(.fbx)を使用させていただきました。
https://free3d.com/ja/3d-model/watch-tower-made-of-wood-94934.html

fbxデータの.rarをダウンロードし、これを展開すると中に 
**wooden watch tower2_61.fbx** というファイルがあるので今回はこれを使用します。

## STEP1. モデルを読み込む(Houdini)
```File``` ノードを使ってStep0で用意したFBXデータをロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/f1efba9c-be12-fecc-e4c3-5c3b5a41126f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/6ec18bed-55ee-f56e-9b6d-45912b7aa70a.png)


## STEP2. モデルを原点に合わせる
Step2でロードしたモデルですが、Y方向にすこし浮いています。
<img height= 140, src = "https://qiita-image-store.s3.amazonaws.com/0/44288/22df4b31-9e4d-ee4c-7860-f7f52cb7cd4f.png">

これは都合が悪いので原点にぴったり合わせます。

まずは ```Transform``` ノードを ```File``` ノードに接続し、TranslateのYの部分に以下を入力します。

```
-bbox("../file1", D_YMIN)
```

<img height = 640, src = "https://qiita-image-store.s3.amazonaws.com/0/44288/a6d650b7-f611-e2a3-54c8-0770ba191975.png">

ぴったり合うようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/01f844e7-ca11-6b92-b531-10bfa574556e.png)


### ヒント : -bbox("../file1", D_YMIN)の意味
```bbox``` は「バウンディングボックスを取得する」という意味になります。

そして、```bbox("../file1", D_YMIN)``` は ```file1``` ノードのバウンディングボックスのY座標の **最小値を取得** するという意味になります。

マイナスをつけて ```-bbox("../file1", D_YMIN)``` とすることでバウンディングボックスの下の部分がY=0の部分にフィットするようになります。

## STEP3. モデルを小さくする
```Transform```ノードをSTEP3の```recenter```に接続し、```UniformScale```を```0.1``` にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/fd0be161-4f5d-bedf-8685-4ca139969283.png)

STEP1~STEP3で作成したノードの全体は以下のようになっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/97801bf7-d6ad-cd8d-f9d5-dfc9aafe4922.png)

## STEP4. モデル配置用のベースライン作成
道路を作るときに作成した```Curve```に```PolyExpand```ノードを接続します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/1bfe0fa3-47b8-28f7-4546-b925cf69f87c.png)

```PolyExpand2D``` ノードの ```Offset```を```1```に設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/2f072e97-bfac-7398-256b-713644f4716d.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/65bbbb39-5924-8f85-ea8b-919b33a17979.png)

## STEP5. モデル配置用のポイント作成
次にベースライン上にポイントを並べていきます。

```PolyExpand2D```ノードに```Resample``` ノードを接続します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/d5d5f654-5811-4245-32d7-734b84f924cb.png)

```Resample```ノードは```Length``` を```2``` に設定してポイント同士の間隔を**2**にします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/db231ea8-e338-1eea-f202-5bdc3379af9c.png)

ポイントが並びました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/74757f85-939e-caaf-7043-7292987c6cb7.png)

次に、このポイントにモデルをコピーして並べていきます。

### ヒント: ポイント表示のON/OFF
Sceneウィンドウの右側にあるメニューの丸ポチアイコンをクリックすることでポイントのON/OFFを切り替えることができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/1fb82c54-d8b9-fc74-f16a-42642c3cfa8a.png)

## STEP6. モデルをポイント上にコピーする
```CopyToPoints``` ノードを作成し、左側のコネクタにはモデルを接続。
右側にはSTEP5.で作成した```Resample``` ノードを接続します。`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/316cbc50-f44d-6771-ffd2-aa93cc362200.png)

モデルがポイント上へコピーされて以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/8461118f-b01f-8a16-a329-80ed2eac2843.png)


## STEP7. モデルの向きを修正する
モデルが横を向いてしまいましたが、これはコピー先のポイントの **法線が正しく設定されていない** ことによって起きている問題です。

これを修正するため、今回は```PolyFrame```ノードを使ってポイント上に法線情報を設定します。

```PolyExpand2D``` ノードと ```Resample``` ノードの間に ```PolyFrame``` ノードを挟みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/f9ce8498-d0ac-ed79-c9eb-320cf2583c95.png)

```PolyFrame``` ノードは以下のように設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/d0c95b29-cd2b-50c0-56b9-dab9ea3a215c.png)

モデルの接線(```Tangent```)を Nアトリビュートとして保存するということをやっています。 NアトリビュートはHoudini上では法線情報として扱われます。

```PolyFrame``` で法線情報を設定すると、以下のようにモデルが上を向くようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/29269873-90e5-7366-ddcb-fb70ee616602.png)

##STEP8. 道路とモデルを合成する
最後に、```Merge``` ノードを利用して道路とモデル群を合成して完成となります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/f3e86535-d614-39cc-a8a5-27f1bd1a2ee6.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/5c40d159-995b-ec8f-69b1-22e98169061d.png)

# 完成
カーブを編集すると道路と建物が自動で配置されるようになりました。
![2.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/ddacef5a-7ab7-43a6-0dfc-a11467e58d7b.gif)

# ノード全体
ノード全体は以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/73fde56d-fa86-2085-2be9-80ed37db84e9.png)