本日はHoudiniApperinticeAdventCalendar10日目ということで
#たまにはWrangleやVOPのRunOverに感謝しても良いと思います!
と題して進めていきます。
一言で言うと WrangleやVOPのRun Overって何よ? という短いお話になります。
Wrangle で言うとこの赤枠のところ
VOP で言うとこの赤枠のところ
になります。
ここがPointならPointひとつひとつに対して処理をしますよ、という意味です。
RunOverの処理対象は全部で5つあって
- Detail( Only Once )
- Primitives
- Points
- Vertices
- Numbers
となります。
それぞれ処理対象が違いましてクラスであったり数字で処理をループさせます。
SOPベースのForEachもありますがそっちはSOPを組み合わせたりする時に重宝します。
でRun Overなんですが
##Wrangleの場合
@Cd = relpointbbox(0,@P);
これはバウンディングボックスのどれくらいの位置に今処理してる点の座標が居るかをPointの色としなさいという意味です。
@P は現在処理している点の座標、@Cdは現在処理している点の色という意味になります。
Run OverがPointなので一意に**@Pや@Cd**がポイントのアトリビュートだと認識してもらえます。
1行で簡単に書けてこれだけの事が出来てしまいます。
ところがこのRun OverがDetailになると途端にめんどくさくなります。
int npt = npoints(0);
for(int i=0;i<npt;i++){
vector pos = point(0,"P",i);
setpointattrib(0,"Cd",i,relpointbbox( 0,pos ));
}
同じことをやるのに1行25文字で済んでいたところが一気に5行133文字に増えました。
5倍もタイプしないといけなくなる訳です。
Run OverがDetailの場合では処理するPoint数を調べてその数でForでループする必要があります。
@P
で済んでいたところが明示的にpoint(0,"P",i)
と書いて情報を引き出さなくてはならなくなり
@Cd =
で済んでいたところがsetpointattrib(0,"Cd",i,relpointbbox( 0,pos ));
と
書かなくてはなりません。
これは大変めんどくさいですね。
##VOPの場合
ではこれがVOPの場合どうなるか見てみましょう。
同じことをAttributeVOPでやってみます。
Relative to Bounding Boxというノード一個で済みますね。
Tabメニューからrel
と打つだけで候補が先頭に来ますのでRelative to Bounding Boxノードを
作って入力のP(座標)と出力のCd(色)につなげてあげるだけでOKです。
簡単でラクチンですね。
AttributeVOPのRun OverをDetailにしてみます。
同じ結果を得る為にはノードが5個必要で7回接続しないといけません。
全頂点をForで回してそれぞれの点に対してImport Point Attributeで座標を取得して
Relative to Bounding Boxノードでバウンディングボックスの相対位置を取得して
Set Attributeノードで色を設定するということをやる訳ですがDetailだとめんどくさいという事が分かります。
PointやPrimitiveなどのRunOverが用意してあるということは大変素晴らしいことなのです。
普段何気なく作っているWrangleやVOPが短く手軽になっているのはRunOverのおかげと言えるかもしれません。