Houdiniでアウトプットして楽しもう

# はじめに

#### 自己紹介
どうも中村です。
2020.09から映像をメインにフリーランスとして活動しております。
実写VFX、フルCG等、主にCGを使ったものなら背景からコンポジットまでやらせて頂いております。

また、趣味でこういうものを作ってます。
https://masaki-nakamura.tumblr.com/

#### 趣旨

Qiitaという場所柄、技術的な記事が多い中、技術的な所が弱い僕が気楽に
Houdiniを使い面白そうなもの作るよという形の記事になります。


**難しいことを考えず、何か適当にノードを繋いでみて、レンダリングしてみて**
**良く分からないけど良い感じのもの作ってみる。**
**アウトプットして楽しんだもの勝ち**

---

#### 作るもの

<img width="300" alt="A.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/17b1ed1b-73ac-c6a7-4bc3-34ce8a3aa513.jpeg"><img width="300" alt="B.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/eabe17a9-066e-5afd-368b-6085903ffeba.jpeg"><img width="300" alt="C.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/f178f9c2-46c6-aabc-bfb6-fb4075e36622.jpeg">
よくあるStrand系の表現ですが、今回は以下の内容で制作しています。

+ 軽い処理
+ 色、アニメーションをコントロール
+ ポイントがラインのアニメーションに対応
+ ラインのアニメーションに追従しつつ、ポイントのアニメーションも行う



#### **HIPデータ**
[HIP](https://drive.google.com/drive/folders/1pDrt5lOcg1JFOxbRcYYfC820DCv6p0ak)

Redshiftでレンダリングしている関係上、Redshiftがインストールされていない場合は
一部ノードが破損する可能性があります。
念のため、TypeAのみMantraでもレンダリングできるようデータを用意しました。

#### 制作環境
|Tool|ver|
|--:|--:|---|
|Houdini Indie| 18.5.381|
|Redshift| 3.0.32|
|Mantra| ---|
|NVIDIA OptiX Denoiser|---|
  
# 制作過程

###  **全体図**
<img width="300" alt="node_tree.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/65a5427e-35a1-3732-7c33-afc5c17e9ee1.jpeg">


**①. ジオメトリのライン化、そしてアニメーション**
**②. ラインにポイントを配置し、大きさや色などを設定**
**③. ラインに沿うようにポイントを動かす**



### 1.ジオメトリのライン化、アニメーション
<img width="600" alt="001.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/15ff7136-be19-7455-4290-f2bf1ae9a5d0.jpeg">
> ノードを出した後、パラメータを変更すると太字になります。
> 今後ノードのパラメータ画像が複数でてきますが、変更点に注目してください。

...
#### ConvertLineノードでライン化
そのままです。便利ですね。
HIPデータを開いてる方は色々なオブジェクトを差し込んでみてください。
今回の例だとシンプルなラインの形状が欲しいので、ポリゴン数の多いものは**Remesh**や**PolyReduce**でポリゴンを削減してから使うと良いと思います。
でも正解はないと思います。好みです。

...
#### Transformでアニメーション
<img width="400" alt="transform.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/d69d61a0-c515-9207-1762-e99d23ca3467.jpeg">
**$F**で現在のフレームが取得できますので、Rotateのxとyに入れています。動きが欲しかったから回転させてみました。
そのままだと動きすぎたので適当な値を掛け算して抑えています。
好きなアニメーション入れてみてください。

...
#### バイパスしているMountain
最初はうねうねした動きをつけていましたが、うるさかったのでバイパスしました。
良ければ好きなように動かしてみてください。


### 2.ポイントの発生
<img width="600" alt="002.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/94a4159a-d970-5ad4-0af1-3ac587c24f38.jpeg">
> パラメータを変更すると太字になります。
> 今後パラメータ画像が複数でてきますが、変更点に注目してください。

...
#### Timeshiftで止める
<img width="400" alt="timeshift.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/90ae9d0e-a9ea-bc28-1836-374079ecdc86.jpeg">


デフォルトだと**Frame**に**"$F"**が入っていて動いてるので、削除して**"1"**をいれて**1フレーム目で固定**します。
やったことある人が多いと思いますが、アニメーションしたものにScatterすると毎フレームScatterされるのでパラパラします。**重いです**。
**重いは悪　軽いは正義**

...
#### Measureでラインの長さを測る
<img width="400" alt="measure.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/1af0c98b-73fe-9bad-6575-5284892c11d8.jpeg">
MeasurementのMeasureがデフォだと**"Area"**になっていますが、**"Perimeter"**へ変更。
OutputのAttibute Nameを分かりやすい様に**"perimeter"**へ変更。
> ここで作成したアトリビュートはPrimitivesに持たせています。GeometrySpreadsheetで確認してみてください。
> このperimeterアトリビュートは、Scatter時と、ポイントのアニメーションに使います。

...
#### Attribute PromoteでPrimitiveからPointへ
<img width="400" alt="atpr.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/97fdbd69-a676-3591-1f41-1b5ed712a500.jpeg">
Original Nameに先程作ったアトリビュート名 **"perimeter"**をいれます。
Original Classを**"Point"**から**"Primitive"**へ変更
> AttributePromoteノードは、任意のアトリビュートをPointからPrimitiveへなど移すことができます。詳しくはHelpへ
> 先程作ったperimeterアトリビュートはPrimitiveなので、Pointへ移します。


...
#### Scatterでラインにポイントをばら撒く
<img width="400" alt="scatter.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/9eac1aa3-cc45-c545-33bd-6bf4c9d21e95.jpeg">

Density Attiributeに先程AttributePromoteした**"perimeter"**を入れます。
これでperimiterアトリビュートの値を元にScatterしてくれます。
DensityScaleで密度感を調整します。
> 今回のような場合は、意図的にScatter用のアトリビュートを編集していないのでperimeterを使わなくても問題ありません。
> Scatterの密度をコントロールする場合によく使います。

...
#### ポイントの色と大きさを決める
<img width="400" alt="scatter.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/fdc83856-8c65-eea5-1150-dd33852c8ba2.jpeg">
**pscaleで大きさ決め**

```
@pscale = fit01(pow(rand((@ptnum + 1) * 321),chf("pow")),chf("min"),chf("max"));
```
pscaleアトリビュートを設定します。
randomとpowとfitの合わせ技です。よく使われると思います。
もっと細かく制御したい場合はpowでなくchramp使う感じでしょうか。

**Cdで色を**

```
@Cd = chramp("color",rand((@ptnum + 1) * 3215));
```
chramp関数で色を決めます。
好きな色でグラデーション作ると楽しいです。

### 3.ポイントのアニメーション
![WS000436.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/12e12a84-3fc9-9f60-f36a-bd8cd960d658.jpeg)

#### xyzdistとprimuvを使ってポイントを動かす

xyzdistとprimuvというお馴染みの組み合わせでラインに追従させます。
ただ追従させるだけだと面白くないので、uv.xのみアニメーションさせて、
ラインに追従しながらもポイントが流れるような動きを作ります。
xyzdistとprimuvに関しては、検索すれば丁寧に解説されてる方がたくさんいるかと思います。

<img width="400" alt="xyzdist primuv.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/622df1a5-d4ef-4929-6bd7-93cde9048fbc.jpeg">

```
xyzdist(1, @P, prim, uv);
```

先程タイムシフトで止めたノードを参照して、primitive番号とuvを取得しています。


```
float offset = @Time * fit01(rand(@ptnum),chf("min"),chf("max")) / @perimeter * chf("speed");
```
ポイントを動かすためのデータ作りです。
@Timeで現在の秒数を取得できるので、@Timeを使ってポイントを動かすのですが、そのままだと早すぎるので色々調整します。

全部が等速だと面白くないので、ポイントの大きさや色を決めた時と同じ手法を使って速度にバラつきを加えます。

また@perimeterで割ることによって、ラインの長さによってスピードが変わる事を防ぎます。
後はspeedパラメータで全体のスピード感を調整しています。
恐らく重くないので、タイムラインを再生しながらリアルタイムで調整できるのではないでしょうか。

```
uv.x = uv.x + offset;
uv.x -= floor(uv.x);
```

先程作ったアニメーション用データをuv.xに足します。
そのままだと1を超えてしまうのでfloor関数を使って0-1に納めます。
これで0-1の時間によってループした値が作れました。


```
vector P2 = primuv(2, "P", prim,uv);
```
最後に、先程取得したPrimitve番号とアニメーション用uvを使って、
動いているラインの位置情報を取得します。
P2になってる理由は謎です。思い出せません、、、
![strand.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/f7f339ff-efc1-e1d2-fee4-a7e28407a652.gif)

以上でSOP内での作業が終わりなります。

# レンダリング周り
> 今回はRedshift使ってレンダリングしていますが、
> このくらいシンプルなものならMantraでも変わらないと思います。多分。

###レンダリングする前の下準備
人によって様々だと思いますが、色々と処理する階層とレンダリング階層を分けている人が多い気がします。
リテイク等で途中を改変していっても、参照元が最終結果になっていればレンダリング設定がそのまま使えるのでよく使います。
今回もその形にのっとって制作しています。

![WS000439.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/5f647724-d404-b52b-d8d4-99c241466ace.jpeg)
オブジェクト階層です。
冒頭のレンダリング画像が3種類あったので、TypeA,TypeB,TypeCが用意されています。
赤色のノードがレンダリング用のノードになっています。
中身はobject mergeで、作業階層から紐づけて引っ張ってる形です。

![WS000440.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/8f522be0-1340-3823-367a-9db98a7fe55a.jpeg)
マテリアルです。
RS point attribute (ParticleAttributeLookup)ノードでポイントのアトリビュートが持ってこれるので
Cdを持ってきてエミッションに入れて自己発光させています。
ラインもポイントも殆ど同じマテリアルになります。

![aaa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/0814de15-a944-7e93-0f27-0a087e3a419e.jpeg)
マテリアルを割り当てます。
ラインをレンダリングする時はStrandsタブのRender Object as Strandsにチェックいれます。

![WS000443.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/0e1877cd-5728-d754-7ace-7669419f3538.jpeg)
ポイントの場合はParticlesタブのRender Objects as Particlesにチェックです。

### レンダリング設定
![WS000444.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/53993b88-9046-6a94-9b35-5404105b120e.jpeg)

後はRedshiftRenderでレンダリングです。
今回はDenoiseを使ってます。ボケ量が多いとどうしてもノイズがとり切れないのと、
静止画でレンダリングする想定だったのでそういう場合はDenoiseがすごく役に立ちます。
ただ動画になるとDenoiseが悪目立ちすることもあるので、そのあたりは調整してみてください。

細かな設定は、太字になってる所を見て貰えれば良いかなとおもいます。
雰囲気設定です。難しいことは分かりません。


**キラキラ光っていて、ボケていて、グローがかかっていれば何かそ良い感じに見える気がします。**
**素材も大事ですがコンポジットというか後処理も大事！と思っています**

### 試しに
![WS000445.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535639/1d5f4fd6-f5ef-ef0e-ed46-cd918753dae0.jpeg)

レンダリング画像がかなり玉ボケしてると思うのですが、僕がよく使うのは実際にカメラで撮影した玉ボケ画像をテクスチャとして設定します。
今回は外部参照無しでいこうということで、玉ボケテクスチャをCOPで作ってみました。



# 最後に
#### お礼
ここまで読んでくださった方ありがとうございます。
文章を書くのに慣れていないのもあり難しいなと改めて感じました。
僕の中でターゲットがボケてるのが一番の原因だとは思います。
きちんとターゲットを定めて一貫してそこにフォーカスしながら文章書ければ良かったでしょうか。
ただ書き直すのも中々に大変なものでお許しください。

**難しいこと考えずにHoudini使ってアウトプットして楽しもう**

長々と記事をかいてきましたが、一番伝えたかったのはこれです。