2012年2月7日火曜日

メモ:Basics : ForEach I (ビデオチュートリアル)by Peter Quint

Basics : ForEach I by Peter Quint

foreachSOPの概略

-ForEach SOP
-For Eachの代わり
-プリミティブグループに対する繰り返し処理
-アトリビュートによる繰り返し処理
-ある操作を複数回繰り返す


FroEachは複雑で、最もデバッグするのが難しいので、できれば使用は避ける方がよい。
同じような効果を、ほかのSOPのパラメータにエクスプレッションを入れることで実現できる。


<<forEachを使わない例>>
1)gridSOPを作成し中に入る。
2)gridSOPのOutputにPolyExtrude(SOP)を作成。
 Translate Z: rand($PR)


<<forEachの使用例>>
1)gridSOPを作成し中に入る。
grid1(SOP):
Orientation: XY plane
Rows: 2
Columns: 2
これによりPrimitiveは1つになる。
(マス目一つの状態。もしRow3,Coumns3にすると一つのGridが4分割され4マスできる、この場合はPrimitiveは4となる)

2)grid1(SOP)のOutputにPolyExtrude(SOP)を作成。
PolyExtrude(SOP)
Inset: -1(入力例)

※このInset値「-1」はAbsolute値となる。
プリミティブのサイズに対するRelative値ではないため複数の異なるサイズプリミティブを、一つのforEachを通して使用するときは危険である。
そのため、forEachを通す前に、バウンディングボックスなどを利用して値をRelative値にしてやると良い。
Inset値: -0.1* max(max($SIZEX, $SIZEY), $SIZEZ)
$SIZEX,$SIZEY, $SIZEZはバウンディングボックスのサイズである。

maxエクスプレッション:二つの値を比較して大きい方を返す。
http://www.sidefx.com/docs/houdini11.1/expressions/max
使い方:max(value1, value2)
例:  max (5,3) = 5
このエクスプレッションではバウンディングボックスの最大値を取得している。
まず$SIZEXと$SIZEYの値を比較し、最大値を取り出し、
さらに、それを$SIZEZ比較し最大値をだしている。
ようするにバウンディングボックスの一番大きな値を取得してそれを-1/10している。
Gridのサイズが10ユニットで、中心から+X側5ユニット、ーX側5ユニットである。
結果的にこのエクスプレッションで「-1」という結果を得るわけだが、
グリッドのサイズが(現在の10x10から)変更して5x5になっても1/10である「-0.5」が得られるようにしている。
スケール比で必ずInsetがGridサイズの1/10になる。


3)Polyextrude1(SOP)を選択した状態でPolygonタブからPolysplitをクリック
ビューで右クリックメニューからsnap  to perpendicularを選択し、底辺から1/4ぐらいの位置を分割。
右クリックメニューからFinish Splittingをクリック。(Enterでもよい)
Polysplit1(SOP)が作成される。

ノート:forEachを使うとうことは、Houdini内ではこのフローを毎回繰り返し処理するということである。
ここでフェイス番号を表示すると分割した部分の下の方の番号は「5」であることがわかるが、毎回同じこのフェイス「5」を処理することになる。


4)Polysplit1(SOP)のアウトプットにPolyextrudeSOPを作成
Group: 5
Translate: -0.5*max(max($SIZEX, $SIZEY),$SIZEZ)
これでバルコニーの形状ができる。
ーーーーーここまでが複製したい元形状を作るフロー

5)
Polyextrude1(SOP)
Polysplit1(SOP)
Polyextrude2(SOP)
の3つを選択し「コピー」

6)
forEach(SOP)を作成。
For: Each Group
foreach1(SOP)の内部に入り「貼り付け」する。

7)each1のアウトプットをpolyextrude1のインプットに接続する。

7)Geometryレベルに戻りgrid(SOP)を作成。
gird2(SOP)
Rows: 5
Golumns: 5
Orientation: XY plane

※ここでのforEachは各「Group」に対して働くので、このプリミティブを個別のグループに分離する必要がある。

8)grid2(SOP)のアウトプットにpartitionSOPを作成。
Patition SOP:
ユーザーにより用意されたルールに従いポイントやプリミティブをグループ化する。
例えば、各ポイントをそれぞれpt_(ポイント番号)という名前のグループに入れたければ「pt_$PT」とういルールを入力する。
http://www.sidefx.com/docs/houdini11.1/nodes/sop/partition

partition1
Rule: face_$PR
これにより各フェイス(プリミティブ)はface_1などの通し番号がつき、それぞれが1グループとなる。

9)partition1(SOP)のアウトプットをforeach1(SOP)の左端のインプットに接続。
foreach1(SOP):
Group Mask; face*

※これで各プリミティブにバルコニーが作られる。

(注)このメモはビデオチュートリアルを見ての私的なメモで、完全な記録ではありません。
各自の利用は自己判断でお願いします。
抜け落ち、間違いの指摘は歓迎です。