出る順! Houdini Nodes

　こちらの記事は、[Houdini Apprentice Advent Calendar2020](https://qiita.com/advent-calendar/2020/happrentice) / 12日目の記事になります。

　[bechica](https://twitter.com/bechica) と申します。 Qiita で記事を書くのは初めてです。

　特に界隈で知名度も肩書もない私ですが、 Houdini 自体の注目度のためか「どうやって勉強したらいいんですか？」とご質問いただくことがぼちぼちあります。
　それぞれチュートリアルを紹介するなど個別対応していたのですが、とりわけノードベースの概念が初めての方にはとっかかりにくいのか、スムーズに人を沼に沈めることが出来ず、歯がゆい思いをしていました。

　でも、そもそもどんなノードがあるのか知らないと何が出来るのか想像しにくいよなあ、めちゃくちゃノードの種類あるもんなあ......
　**せや！公式チュートリアル全部見て頻出順にまとめたら学習指針になるんじゃね？** とパワーで解決しようとした記事がこちらになります。

#最初に集計結果
　**スプシにまとめてみました
　 [出る順! houdini nodes](https://docs.google.com/spreadsheets/d/1j_e7WZQKSx7kOyRtdhbTbDBMB6C3DTMDYlg26EyYzCQ/edit?usp=sharing)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/2abc0c4e-8e96-5016-02ea-be2e32567245.png)
　タブ毎の内容は下記のとおりです。
**CountUp ：ノードの発生回数**
項目は左から「a. ノード名」「b. 使用回数」「c.使用回数/全動画(%)」
「d. 使用回数/全使用回数計(%)」「e. d.の累積(%)」
**Raw Data ：計算用データ**
項目は左から「a.ID(ソート用)」「b. 参照した動画」「c. ノード名」「d. 公式docsへのリンク」
**Videos ：参照動画リスト**
項目は左から「a.ID(ソート用)」「b. 参照した動画」「c. 動画へのリンク」

　上位10位分だけまとめると、こんな感じでした。

1位 : Geometry / ( 発生回数 26 回, 登場率 33.33% )
2位 : Null / ( 発生回数 23 回, 登場率 29.49% )
3位 : Box, Sphere / ( 発生回数 19 回, 登場率 24.36% )
4位 : Transform / ( 発生回数 18 回, 登場率 23.08% )
5位 : Group Create, Copy to Points / ( 発生回数 17 回, 登場率 21.79% )
6位 : Color, Merge(SOP), PolyExtrude / ( 発生回数 15 回, 登場率 19.23% )
7位 : Grid / ( 発生回数 13 回, 登場率 16.67% )
8位 : Attribute Randomize / ( 発生回数 12 回, 登場率 15.38% )
9位 : Attribute Wrangle / ( 発生回数 11 回, 登場率 14.10% )
10位 : Scatter / ( 発生回数 10 回, 登場率 12.82% )

##もうちょっと細かいルール設定（読み飛ばし可）
　最初にお詫びですが、全部見るのは時間的に無理でした......。
とはいえ本数がないと話にならないので、とりあえず80本ほど見てみました。

　参照した動画はすべて 公式 Learning Path の Getting Started に含まれる記事です。
https://www.sidefx.com/learn/getting_started/
　ただしユーザ登録が必要だったり、Houdini 17以前製っぽかったり、有償プラグインが必要そうなチュートリアルは省いています。

　チュートリアルを読破するにあたってどのノードを知っていればよいか？という観点でまとめたかったので、同一ノードが１チュートリアルに複数回登場する場合は１回として丸めました。ガチの「使用回数」だと全然違う結果になると思います。
　続きもので、前回動画で作成したノードをコピー＆ペーストした場合であっても、動画中で初出なら各１回としてカウントしています。

　シェルフから Box や Sphere 作ったらどうカウントすんのよ？と少し悩みましたが、動画中で下位コンテキストに潜って説明しなかった場合は Geometry として計算しています。

　**目grepしているので、データ不備は平にご容赦ください。**

　作業環境としては Houdini 18.5.351 を使用しています。

#ノード一言解説
　頻出ノードについて解説していきます。詳しい解説が読みたくなったらスプシにリンク張ってありますので、公式ドキュメントを読みましょう。
　ドキュメントはオンライン上にありますのでググってもいいですし、実際にノードを作成してこのボタンを押すとヘルプを確認することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/e1ceb3b6-4740-1676-3d86-836a6dd4487a.png)

##1位 : Geometry
　いきなりですが、先述した通り Houdini にはアホみたいに大量のノード種類があります。
ノードを作ったり、繋げたりするパネルをネットワークビューというんですけど、ここで右クリックしたりTabキーを押すことでノードを作成できます。
(画面構成と基本操作についてはこれを見ましょう : https://www.youtube.com/watch?v=Tsv8UGqDibc)
　
　でも、操作した途端、存在する全ノードが出たらめちゃくちゃ困ると思いませんか。
 普通に困るので、Houdini には「いまどういう作業をしているの」＝「どんなノードがほしいの」＝「今作れるノードはなんなの」を場面場面で変えることになっています。具体的にはネットワークビューのここに書いてある文字列ごとに呼び出せるノードが変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/daf18ff6-cd48-f955-8bc4-1c76c1bb0e43.png)
　空のシーンを作成したら、上記のスクショのように、"Objects" と書いてあるはずです。
Houdini を触れる人は試しにネットワークビューでTabキーを押して、"g"と入力してみてください。
賢い Houdini はいい感じに予測変換してくれて目的のノードを提案してくれます。geometry ノードを作成してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/19c41dbf-c06e-7a1c-6abe-66cdc051ac75.png)
　こんなかんじでノードを作れます。ところでこのノード、影がついていますね。こういうノードはダブルクリックすることで、深い階層に入ることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/555582b6-646f-c94a-ad2b-e6a438442e9b.png)
　入ってみると、右上の文字列が"Geometry"に変わり、Tab で呼び出せるノードリストも変わっているはずです。この Geometry 階層というのは、ざっくりいうとモデリング関連の作業をする階層です。Surface OPerator の略で SOP 階層と言います。

　モデリング？興味ねえんじゃ、ワシぁかっこえぇエフェクトが作りたいんよ、という人もちょっと待ってください。エフェクトの発生源になるオブジェクトを作るにも、飛んでいくパーティクルの形状を作るにも、モデリングが必要ですよね？　だから使用頻度が高いのです。

　ちなみにですけど、シミュレーションをするための Dynamics 階層を DOP, レンダリング設定をするための Rendering 階層を ROP と言います。他にもVOPとかCHOPとかいっぱいあるんですけど、まあおいおいで大丈夫です。どういうものがあるのか先に知りたい人はこの動画をどうぞ。 
https://vimeo.com/228373576　
##2位 : Null
　何もしないノードです。
なんで何もしないノードが２位なんだ？？？と思いますよね。大きく分けて２つ使い方があります。

　１つは処理の締めなどに差し込んでセーブデータ的に使用するやり方です。

　基本的な考え方として、Houdini ではノードを接続し、接続した流れに沿って処理を進めます。例えばこういう感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/64639d5c-645b-f1b4-5a4b-0c26120e50cd.png)
　でもときどき特定のノードを指定して、そこを起点に新しい流れを作るタイプのノードがいるのです。Object Merge (11位) とかがそれにあたります。その場合こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/ba29d425-66f6-1acd-73a4-473635bd0a9d.png)
　さて、このように処理を追加したあとで、この部分にノードを追加して、その結果を受け渡したくなったら、受取先でそのように再設定しなけれなばらず、だるいと思いませんか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/b609fbd8-afa4-7e27-1c9d-9277cb2c04a8.png)
　そんな時に最後に Null を設定して受け渡しに使えば、間に変更が加わってもいちいち繋げ直す必要がないですよね。修正対応に強くなるので、こんな方法をとるのです。何もしないからこそ流れに影響を与えないセーブポイントとして利用できるんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/54d6efe9-7524-ec29-abe5-9bbbbe525a02.png)
　もう１つはパラメータ操作のためのコントローラとして使う方法です。
「Copy Parameter」と「Paste Relative Reference」、さらに「Edit Parameter Interface」という機能を使うのですが、多分動画で見たほうが理解しやすいと思います。
　具体的な方法はこの動画に出てきます。
https://vimeo.com/387411473#t=348s

##3位 : Box

　箱を作るノードです。基本形状なので、よく使われるのも妥当っぽいですね。

　Box と書いてもノードを作成できるのですが、Cube と書いても呼び出せます。
May...もとい、とある支配的なCGソフトを使っている皆さんも安心ですね。

　ネットワークビューから Tab キーなどでも作れますが、Objects 階層で シェルフからドラッグ＆ドロップすることで「Geometry ノードの中にある Box ノード」を一発で作ることもできます。

　デフォルトだと Primitive Type の項目が Polygon になっていて、各辺の分割数などは設定できないのですが、Polygon Mesh に変更すると Divisions の項目で設定できるようになります。同様にNURBSに変更することもできますし、Primitive Type を Points にすれば頂点だけ生み出すこともできます。

　頂点だけ作るって何に使うねんと思った方は、5位の Copy to Points についてもあわせて読んでみてください。

##同率3位 : Sphere
　同率３位、球体を作るためのノードです。これも妥当感ありますね。

　デフォルトだと Primitive Type は Primitive になっています。
　Polygon Mesh に変更するととある支配的なCGソフトっぽい球体になりますし、Polygon にすると Max...もとい、とある支配的でない方のCGソフト[^1]でいうところの Geosphere っぽい球体に変更することもできます。こっちの方が頂点数が少なく済むんですよ……。

　ところで、Platonic Solid (17位)で、なんとティーポットも作れるんですよ！嬉しくないですか！？

##4位 : Transform
　対象に移動・回転・スケールをかけるためのノードです。

　余談なんですが Houdini は エクスプレッションと言って、パラメータにスクリプトっぽいものを仕込むことが出来ます。例えば下記のように Translate X に "$F"と書いてプレイバーを動かすと、繋げたオブジェクトが X+ 方向に動き出します。
![expression.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/2d7d1cb0-8d44-2232-b94e-d4acd178eab9.gif)
　\$Fとは現在フレームのこと。カレントフレームを Translate X(Position X)に流し込んだ形になったわけです。では、 Translate X に sin(\$F), Translate Z に cos(\$F)と書くと……？
![circle.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/cc0e1d18-43bd-7130-8247-11512985a0b9.gif)
　なんだかヤバそうな雰囲気が出てきましたね。文系各位のどよめきが聞こえてきそうです。
気持ちは分かりますが大丈夫です。私も文系ですし。具体的に何が大丈夫とかは言えませんが。
##5位 : Group Create
　指定した Group Type に名前を付けるノードです。 Group Type とは、他のツールで言うところのコンポーネントですね。頂点単位とかフェース単位で名前を付けておいて、のちの処理に役立てることが出来ます。
　例えば Transform ノードと組み合わせるとこういうことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/a02c5905-d0f5-e603-8a76-f4842b95e29a.png)
　Group Type の話ですが、Houdiniのコンポーネント名は他のツールと少し変わっていて、
頂点が Point と Vertex に分かれています。雑に言うと前者が位置座標、後者がUVみたいな感じです。
エッジは Edge ですが、フェースが Primitive 、オブジェクトが Detail に置き換わっています。
　この辺りの話はこの辺りで詳しく解説されています。
https://youtu.be/XZiDLTthieU?t=224

　また、頂点番号１個ずつ置きに指定するとか、少し高度な指定が出来る Group By Range というノードもあります。この辺りもあわせて参照してみてください。
https://vimeo.com/442789391

　説明の順番的にコンポーネントの話は適当にしゃべってきたのですが、ここからは Point と Vertexについてはちゃんと分けて解説していくことにします。

##同率5位 : Copy to Points
　このノードは頭に接続する場所が２つあります。
右に刺したオブジェクトが持つ Point に、左に刺したオブジェクトを複製するというノードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/ce095d4a-f6f6-06d5-f49c-f50aefdc209b.png)

　このノードが面白いのは、右に刺したオブジェクトの Point が色やスケールなどの情報を持っていた場合、複製先に引き継ぐ設定が出来ることです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/ef083791-9d9f-a297-3236-6ac60bfe4e8b.png)

　見た目にもわかりやすいので、このノードを使ったチュートリアルは数多くあります。
　https://vimeo.com/375782612
　https://vimeo.com/384503562#t=110s
　https://vimeo.com/442789390#t=118s
##6位 : Color
　色を付けるノードです。こんな感じで色が付けられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/130b07f2-70d1-33ef-b36a-43cfc2ce174a.png)
　ところで、Houdini には Geometry Spreadsheet という機能があります。コンポーネントごとに、座標情報などの情報＝アトリビュートを表示できるものです。

　これを使って、Color ノードを接続する前後の結果を見比べてみると、Cd というアトリビュートが増えていることがわかります。Cd は Color Diffuse の略ですね。
![color.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/f654a4f0-a294-4656-ebf4-debdb026ac53.gif)
　Classの項目を変更してみましょう。ビューポート上の見た目は変わりませんが、 Geometry Spreadsheet 上では結果が違っていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/24cbe529-909c-c468-07d9-c8821b8b10f1.png)

　つまり、Color ノードは 狙ったコンポーネントに Cd アトリビュートを一括追加するノード、と言い換えることも出来そうです。

##同率6位 : Merge(SOP)
　処理の流れを１つにまとめるノードです。 (SOP)としてあるのは、DOPネットワークや LOPネットワークにも同名のノードが存在しているからです。役割は似てますが。

　こんな感じでいくつでも接続することが出来るのが特徴です。が、接続する順番が重要になるケースもありますので、注意が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/a3b65773-95c5-e9b7-7b5f-e8c482c2d71c.png)　
##同率6位 : PolyExtrude
　いわゆる押し出しをするノードです。このチェックボックスをオンにすることで面ごとに押し出すこともできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/722fe5a1-7ad5-7a8c-a89a-06be5a5b388e.png)
　また、Insetの値を調整することでテーパーさせることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/b9a74574-f1f7-da4b-743d-e344d040152a.png)

　このノードを上手に使った面白いチュートリアルがあります。Loop の機能を併用するものですが、一見の価値ありだと思います。
https://vimeo.com/385696551

##7位 : Grid
　平面を作成するノードです。

　今更ですが、実は Houdini では分割数の考え方が他のツールと違います。
こんな風にタテヨコのエッジの数で設定するわけです。分割しない場合は2になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/cfeb97cc-1097-c476-463a-40fcd2378676.png)
　では分割数1に設定すると……？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/07eb41f6-258d-45e6-2338-c5634c5659b2.png)
##8位 : Attribute Randomize
　指定した名前のランダムな値をアトリビュートに設定するものです。例えばこんな風に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/348ba194-e0e9-df90-6ad6-3be43bdca868.png)
　この例では primitive ごとにランダムな Cd アトリビュートを設定しています。

　ジオメトリスプレッドシートで見てみましょう。RGBの各パラメータに 0 ～ 1 の間で、ランダムな値が設定されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/19adb4d4-3108-b64e-add7-c35ed331c344.png)
##9位 : Attribute Wrangle
　Houdini やりましょう！と鼻息荒く沼に誘ってくる人が、Houdiniやるなら やっぱり VEXやらないとね！とフンスフンスしているのを見たことがありませんか？　私はよく見かけるのですが。それがこいつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/e8427019-906d-52c3-aef7-b4b968fb49b4.png)
　このアメリカンな警察の帽子のアイコンが出てきたら気を付けろ。こいつが出てきた瞬間に Houdini という沼は一段と深みを増す。
　**一言でいうとこいつは、コードベースでアトリビュートを直接操作することができるノードです。**
例えばこんなことができます。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/13d8291c-ec15-b413-aec9-c05f8bd5abdf.png)
　日本語で説明するなら「もしも頂点についている色の赤成分が0.5以上だったら 頂点の高さを1.0に置き換えろ」です。これがどんなにヤバいことかわかりますか？

　Transform の項目で Translate などに \$F などを設定して可変にしたことを覚えているでしょうか。あれは、全体を操作するためのパラメータを可変にしているイメージです。例えるなら、「レベルがあがったから"ちから"と"すばやさ"を+2にするね」という感じです。

　一方、アトリビュートを直に操作できるということは「右半身だけ"ちから"を9999にします。あとそんなアトリビュートなかったけど、"人種"は"エルフ"にするし。今そういうことにした。"出身地"は"惑星マンダロア"だし、"血潮"は"鉄"で"心"は"硝子"です。」みたいなこともできる。チートですよ、チート。

 　お前、今までHoudiniはノードベースって言うてたやんけ、なんやねん急に、という感じでめっちゃびっくりする。やめてほしい。**ただ、前述のとおりこれは非常に強力な機能で手放すのは惜しい**。

　VEX をノードベースで表現するためのという VOP という概念もあります(13位の Attribute VOP で呼び出せます) 。全部ノードベースでやろうってことで VOP で頑張るのも全然いいと思います。
　ただ、わかっている人にとってはVEXの方が早いんですよ。四則演算一つとってもノードを繋げなければならない VOP に対して、コード1行で済んでしまう手軽さがある。速さが違う。

　なので、**Houdiniを頑張るのであれば、いずれは触れた方が良いと思います。**
今回チェックしたチュートリアルの中で参考にするなら、この辺がおすすめです。
https://vimeo.com/375782658
　
　また、今回紹介するリンクはすべて公式だけで揃えたい気持ちもあるのですが例外的に、このシリーズのチュートリアルがめっちゃいいです。公式になってほしい。
https://www.youtube.com/playlist?list=PLzRzqTjuGIDhiXsP0hN3qBxAZ6lkVfGDI

##10位 : Scatter
　オブジェクトの表面に大量に Points をばらまくノードです。
これまでに紹介したノードだと、Copy to Points との組み合わせが強力です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/dc887e11-44de-d94f-c395-6eee96540146.png)

　さらにAttribute Randomize で Cd と Rot(角度)をランダムにしてみると......
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932690/8e955b4e-086d-85b7-0098-667769e75de4.png)
みたいな感じです。

　Scatter 単体だと 表面だけにしか Points をばらまけないので、Iso Offset (72位)とかで中身を作ってあげると立体的な点群を作ることも出来ますよ。このあたり、参考になるかもしれません。
https://vimeo.com/384503562

##11位以下のノード群
　ここまで触れてないノードで言うと、分割数を上げる"Subdivide"(11位)、線を生成する"Line"と角をベベルする"PolyBevel"(同率15位)、曲げたり捻ったりする"Bend"と法線を設定する"Normal"、エッジを等分割する"Resample"(同率18位) など、SOP系のノードは遅かれ早かれ出会うことになるでしょう。

　ビギナー向けのチュートリアルに出てくるノードのほとんどがSOPノードでした。さもありなんという感じですが。累積%の上位50%以内でSOPノードでない方を探したほうが早い。Camera、Lightなどのシーン構築系、基本シェーダの Principled Shader くらいで、DOP Networkがぎりぎり圏外という結果でした。

#学習のすすめ
　さて、今回は上位ノードにばかりフォーカスしてみてきましたが、本当は下位ノードにこそ目を向けてほしいのです。**使用回数が1回しかないノードって、逆に言うとそのチュートリアルにしか出てこないのです**。

　スプレッドシートの Raw_Data と Videos のタブを引けば、どのチュートリアルで作例に使用されているかわかるはずです。是非参考になさってください。

　猛者の方で「は！？あのノードの解説がないやんけ、めっちゃ使えるんやが？？？」と思った方、むしろチュートリアル動画を作る上での狙い目かもしれませんよ。
#終わりに
　担当日につき、今回はここまでで投下しますが、せっかくなので全チュートリアル舐めて完全版を作れたらいいなーと思っています。年内くらいで書けたらいいなあ。
　どうでもいいけど、続きやってめっちゃ順位変わったらヤバいですよね。途中までNullがずっと１位に居座ってて胃が痛かったんですよね……。[あとこれ使えばよかったんじゃね、説も......。](https://www.sidefx.com/ja/docs/houdini/hom/nodesearch.html)

　ともあれ、めっちゃ頑張るだけで書ける記事ではありましたが、めっちゃ大変だったので微力ながら皆様のお役に立てれば幸いです。 Enjoy!!

　明日は [sho7noka](https://qiita.com/sho7noka)さんの"Houdini Engine API Python 書いてみる" です。お楽しみに。

[^1]: 諸説あり