【Houdini】プロシージャルモデリングで多用するSOPまとめ

Houdiniでプロシージャルモデリングをする際に頻繁に使うSOPをカテゴリごとにまとめたもの。随時追加。
対応バージョンは18.5。
使用頻度は独断と偏見で設定しているので参考までに。

# 汎用ノード
### Null（使用頻度：★★★★★）
「何も入っていない」空のノード。
何もないということは、何でも入れられるということである。
ネットワーク上のパラメータをまとめて入れてコントローラの役割にしたり、区切りとして置くことで可視性を高めつつ後からの編集に強くしたり（これをやらないと上流を編集する際にノードを繋ぎなおす手間が増え面倒）、Switchノードなどに空の情報を受け渡すときなどに使う。

### Merge（使用頻度：★★★★★）
上に繋がれたあらゆるジオメトリを合体させるノード。
上流で作ったパーツを合流させる際に使う。

### Switch（使用頻度：★★★★★）
入力に応じて、上に繋がれたノードのいずれかを選択して下に流すノード。
複数のパターンをスイッチさせたいときに使う。
少しテクニカルな使い方としては、下流に繋いだStampノードのVariable変数をSelect Inputに設定することで、Switchノードに繋がれた複数のジオメトリをバリエーションさせながらスタンプすることができたりする。


### For-Each Loop SOP群（使用頻度：★★★☆☆）
指定した数だけ処理をループさせるノード。
ループには役割ごとに複数種類のノードを使用するので、それぞれの役割を大まかにでも理解しておくとスムーズ。

### Solver（使用頻度：★☆☆☆☆）
フレームごとに処理を反復フィードバックさせるときに使う。
アニメーションを使うことが少ないプロシージャルモデリングではごく限定的な状況でのみ使用する。

# プリミティブノード
### Grid（使用頻度：★★★★☆）
四角形のプリミティブを生成する。
プロシージャルモデリングの場合、いきなりBoxなどの立体を出すよりもGridで平面を出してからExtrudeした方が融通が利くため、使用頻度が高い。

### Box（使用頻度：★★★☆☆）
文字通り箱型のプリミティブを生成する。
前述の理由でGridもよく使うが、Boxで済む場合はこちらを使う場面も多い。

### Circle（使用頻度：★★★★☆）
円/多角形のプリミティブを生成する。
立体のベースとしてはもちろん、後述するSweepノードに使う背骨曲線としてCurve(曲線)を作る際にも多用する。

### Tube（使用頻度：★★★☆☆）
円柱/多角柱のプリミティブを生成する。
GridとBoxの関係と一緒で、Circleを出してからExtrudeして円柱を作った方が融通が利く場合が多いが、細かい操作が必要なければこちらで済ませる。

### Line（使用頻度：★★★☆☆）
直線を生成する。
平面や立体のベースとしてはもちろん、Sweep用の断面や背骨曲線を作るときなど、意外と出番は多い。

### Point Generate（もしくはAdd）（使用頻度：★★☆☆☆）
指定された数のポイントを生成する。
プロシージャルモデリングでは事前に作った形状を複数コピーするときにポイントを使うので、単一の点を生成したいときなどにこのノードを使う。
(厳密にはポイントはプリミティブではないが、ほかに置く場所がないのでここに書いておく)

### File（使用頻度：★★★☆☆）
外部で作ったジオメトリを読み込む。
Houdiniは手作業で細かいモデリングをするのには向いていないので、MayaやBlender等で作った形状やフリーアセットを読み込んで組み込むことも多い。

### L-System（使用頻度：★★☆☆☆）
反復処理によって簡単に複雑な形状を作ることができる、独特のシステム。
分かりやすいところで言うと木や血管のような有機的に枝分かれしていく複雑な形状を簡単に作ることができる。
ハードサーフェスのプロシージャルモデリングでは、家の形状ベースを作ったり、柱の断面形状を作ったりなどに使える。
少し難解だが使いこなせれば表現の幅がかなり広がるノードである。

# ポリゴンノード
### Extrude（使用頻度：★★★★★）
言わずと知れた、ポリゴン形状を押し出すノード。
Houdiniでは押し出しの距離だけでなく、押し出し後のサイズ、ひねり、分割数など細かく設定できる。
押し出す際の正面・側面・背面それぞれのポリゴンのグループ化もできるので、押し出した形状を後で編集する際に便利。

### Transform（使用頻度：★★★★★）
位置の移動、回転、サイズのスケール、ピボットの移動など、ほとんどの基本的な操作をこのノードだけで実行できる。
その汎用性ゆえ12を争う使用頻度だが、勢い余ってポイントやエッジを直接指定したり、定数値で操作してしまったりするとプロシージャル性を失うことには注意したい。
またそれぞれの操作が実行される順番はTransform Orderから指定できる。

### Soft Transform（使用頻度：★★☆☆☆）
指定した点を動かすと、周辺の点も含めて指定した形状に沿って移動させる。MayaでいうところのSoft Selection。
ジオメトリの形状に滑らかな曲線・曲面を作りたいときに使う。

### Match Size（使用頻度：★★☆☆☆）
2番目に入力された形状に合うように1番目のプリミティブを移動・スケールする。
事前に作った形状を他の形状に合わせてスケーリングしたい場合など、複雑な計算なく簡単に処理でき便利。

### Delete（使用頻度：★★★★★）
ジオメトリ(プリミティブやポイント)を削除する。
形状の一部を削除する場合にも使うが、指定した範囲だけをいじりたいときに、それ以外の部分を非表示にするような使い方も多い。

### Sweep（使用頻度：★★★★☆）
1番目に入力されたCurve(曲線)に沿って、2番目に入力された断面形状のサーフェスを作る。
柱を直線に沿って作る場面など、非常に出番が多い。

### GameDev Edge Group To Curve（使用頻度：★★★☆☆）
グループ化されたEdge(ポリゴンに属した辺)を、Curveに変換する。
Sweepノードに受け渡す背骨曲線を作るときに、ポリゴンの一部を切り取って使いたい！　そんな場面で役立つノード。
Game Development Toolsetというプラグインを導入しないと使えないが、シェルフからすぐに入れることができ、便利なノードがたくさん詰まっているので是非導入しておこう。

### Divide（使用頻度：★★★★☆）
ポリゴンを分割するノード。
デフォルトではすべてのポリゴンを三角形に変換する。これだけでも不正ポリゴンを消したりUEに持っていくための下準備に使える。
しかしそれ以上に使うのはBricker Polygonsという機能で、ポリゴンを格子状に分割してくれる(分割の比率も当然指定できる)。
単純に形状の割りを増やしたいときや、UVを開くときの処理、ランダマイズする前の下準備など、シンプルな機能ゆえに用途は多岐に渡る。

### Subdivide（使用頻度：★★☆☆☆）
表面の形状を滑らかにしつつ割りを増やす。Mayaでいうところのサブディビジョンサーフェスやスムース。
コップや車など滑らかな曲面を作りたいときに使う。

### Boolean（使用頻度：★★★★☆）
プリミティブどうしの論理演算を行う。おもに、ある形状に他の形状で穴を開けたいときなどに使う。
ほぼ確実に不正ポリゴンが発生するので、Mayaなどでは忌避されがちな機能だが、手作業が苦手なHoudiniではBooleanを使って強引にモデリングせざるを得ない場合も多く、不正ポリゴンを取り除く機能も豊富にあるので、かなりの頻度でお世話になる。

### Fuse（使用頻度：★★★☆☆）
近接点や重複した点をスナップ・結合する。複数のプリミティブを一体化させるときや不要な点の削除に使えるほか、Booleanを使った場合のクリーンアップにこれを挟むことが多い。
これを使うと結合した点に帰属したNormalが荒れるので、基本的に後述のNormalノードとセットで使う。

### Mountain（使用頻度：★★★★☆）
ポリゴンを歪ませることができる。
おもにプリミティブのランダマイズ(歪ませ)に使う。
ノイズの種類や周波数、粗さなどを指定でき、「山」というあまりにド直球かつシンプルな名前とは裏腹に、多彩な表現を提供してくれる。

### Point Jitter（使用頻度：★★★☆☆）
ポイントの位置(またはポリゴン)を歪ませることができる。
Mountainノードと比べるとノイズの種類などの表現の幅は狭いが、法線の向きを変えずに歪ませるときにはこちらの方が使いやすいなど、シンプルさゆえの強みがある。

### Copy Stamp（Copy To Points）（使用頻度：★★★★☆）
入力されたポイントにプリミティブを複数コピーする。
徐々に形状を変形させたり複数のパターンを入れ替えながらコピーしたりもできる。
プロシージャルモデリングの強みはこれを使った大量配置にもあるので、アナログなDCCツールを使ってきた人がこれを使った日にはあまりの便利さに涙を流す。

### Resample（使用頻度：★★★★☆）
CurveやEdgeを分割し、ポイントを生成する。
Copy Stampに使うポイントの生成や、基準点の設定など、カーブ上のポイントを増やしたい場面は多いので頻繁に使う。

# グループノード
### Group（使用頻度：★★★★★）
グループを作る。
Houdiniは編集する範囲をグループで管理・操作するので、特に使用頻度の高いノードである。
Keep in Bounding Regionsという機能はバウンティングボックスをその場で作ってグループ化する範囲を指定できる機能で、直感的に使いやすい。

### Group by Range（使用頻度：★★☆☆☆）
プリミティブに振られた番号を使って、グループ化する範囲を指定しグループ化する。
番号の1つ飛ばしや2つ飛ばしなども指定できる。が、ポイントの順番整理が必要で、かつ直感的でないので、使用頻度はそれほどでもない。

### Group by Lasso（使用頻度：★☆☆☆☆）
投げ縄ツールを使って、手動で指定した範囲をグループ化する。
直感的だが、プロシージャル性が損なわれるので、プロシージャル性の必要ない固定パーツ以外ではあまり使わない。

### Group Delete（使用頻度：★★★★★）
グループを削除する。
グループを使った後はちゃんと消しておかないとごちゃごちゃして大変なことになるので、こまめに整理しておこう。

# ノーマルノード
### Normal（使用頻度：★★★☆☆）
Normalを計算するSOPであるが、歪んだNormalが混在していても全て再計算するので、法線情報の正規化・平坦化に使える。
特にBooleanを使った際、Fuseを使ってクリーンアップするとほぼ間違いなくNormalが荒れるので、Vertices(必要ならPrimitivesも)を対象にこれを挟んでおくことはほぼ必須になる。Cusp Angleは30~60がおすすめ(高すぎても不必要な対象を拾いすぎてあまり良くないようである)。

### Poly Frame（使用頻度：★★☆☆☆）
ポイントに対して法線、接線、従法線ベクトルといった座標情報を生成する。また法線情報を接線情報で書き換えるなどといったこともできる。
たとえば曲線上やポリゴン表面にあるポイントに対して、曲線の向きに合わせてモノを配置したいときなどに使える。

### Reverse（使用頻度：★★☆☆☆）
フェースの向きを逆向きに裏返す。
反転複製した後やノードの都合でフェースが裏返った場合など使う。


***
使うノードは他にもあるが、これらが使えればプロシージャルモデリングの基本的な操作はできると思われる。
「これもよく使うだろ！」というノードがあればコメント欄へお気軽に。

またクリーンアップに使うノードは別でまとめているので、下記を参照されたい。
https://qiita.com/nenne_1729/items/3c74002faf5047ad136e