【Houdini】ランダムな形状を持つローポリクリスタルの自動生成

# はじめに
Unityでゲームを作ろうと思った場合に、複数のバリエーションを持った3Dモデルをたくさん用意したい、というシチュエーションがあると思います。
今回は無料のHoudini Apprenticeを使って**ローポリのクリスタルを複数まとめて出力**させる、ということをやってみました。

## 環境
Houdini Apprentice 17.0
Windows 10

## 成果物
以下はクリスタルのOBJファイルを6個まとめて出力し、Unityに入れたものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/9b0029b7-691a-3f8f-e784-a1bd6e5a472e.png)

# 作り方
クリスタルを一括生成するノードは以下のような感じになりました。<br>
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/dd2327e4-8cd0-dc28-04de-2a272304368a.png" height = 400>

# ノード解説
## ノードその1: Sphere(球体を作る)
Sphereノードを使ってクリスタルのベースとなる、**ローポリの球体を作成します。**
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/0a97bd4f-1984-dd2a-65df-08bdb81204b9.png">
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/d069c486-442a-1758-0626-1cf3b7f32a33.png" width = 480>

## ノードその2: UV Unwrap(UV展開)
モデルにテクスチャを貼り付けることができるようにするため、UV展開をします。
モデルを変形させる**前**にUV展開をしてところがポイントです。
変形させた後にUV展開をするとUVが汚くなりやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/d9891228-82e2-a040-3ed9-aedba835b390.png)

### UVを確認してみる
SceneViewにマウスポインタを乗せて、Space+5を押してUVを表示させると以下のようになっています。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/f9c952ae-62dc-492e-366c-09232b0297b3.png" width = 400>

SceneViewにマウスポインタを乗せて、Space+1を押すとSceneViewをPerspective Viewportに戻せます。


## ノードその3: Transform(スケーリングをかける)
クリスタルっぽさを出すために、**Y方向に1.5倍のスケーリング**をかけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/363979f5-0c8e-3b2b-dc82-1d4f902d077f.png)
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/a3803ea0-a31e-a50d-06d6-fb6f686ba379.png" width = 400>

## ノードその4: Point Jitter(モデルを変形)
Point Jitterで**頂点をランダムに動かします**。
ネットワークの最後(ROP Geometry Outputノード)でOBJを出力する時のフレーム番号$Fを乱数シード値として利用し、フレーム毎に異なる変形が行われるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/9bdfa80b-0ebd-c513-f7b0-34fa7bc34964.png)
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/cd694cf4-c004-222f-9609-13b2bc7e3891.png" width = 400>

## ノードその5: Normal(法線の再計算)
モデルの法線の再計算を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/48a76138-a696-376c-8b83-9aa547b776db.png)
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/d6b708f0-8e18-742f-fcce-c241e368b3a6.png" width = 400>


## ノードその6: ROP Geometry OUTPUT(モデルの一括出力)
ROP Geometry OUTPUTノードにはOBJファイルの情報を設定します。
OBJファイルの出力先にUnityのAssets以下のパスを指定しておくと、すぐにUnity上で確認できて便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/e423f469-3c55-795d-62a9-8c94ad673831.png)

Save to Diskをクリックするとファイルが出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/770355c3-2f6e-50d0-e82a-84ade1981211.png)

出力されたOBJファイル群をUnity上で表示させると以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/3bd5e3b1-17f5-4b64-6484-a40ae68cc99e.png)

## おまけ : HDRP環境のUnityに入れてみる

HDRP環境のUnityに取り込んで、マテリアルを設定してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/5a88867a-4b97-39bc-5b39-fbb3ef464378.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/770d650c-99e0-4fab-c190-62ff48b57b36.png)