Whileループ


どうも篠島です。前回はポイントクラウドについて説明しましたが、ポイントクラウドを使う時に頻繁にWhileループを使うことになるので、Whileループについて説明しようと思います。VEXでWhileループを書くのは非常に簡単ですが、VOPで作ろうとすると非常に分かりにくいです。

 

今回のサンプルファイルです。
while_loop.zip

Whileループは2つのノードからなり、ConditionがTrueになるまで特定の処理を繰り返すループです。While_begin にはConditionというインプットしかありません。Next_in という所に好きなデータを繋ぐことでループ内でそのデータにアクセスすることができます。While_beginのConditionに繋がれたデータがTrueならばループに入り、Falseならば1回もループはされません。ループに入ったら、ループ内でCompareノード等を使い、End_whileのConditionをFalseにすることでループが終了するようにしましょう。HoudiniにはBool型がないので Int でTrueかFalseを表します。0なら False,  0 以外なら True です。

7

まずはWhileループの完成形を示してから説明します。下のVOPネットワークが何をしているのかというと、ポイントナンバーの数だけループし、ループ毎にポイントナンバーの数を足しています。オレンジ色の枠に含まれたノードだけがループの中に入っています。
言葉で説明するよりもVEXコードを見てくれれば何をしているか分かりやすいかと思います。

1

 

さて、While VOPを使う上で気をつけなければならないのが、インプットとアウトプットです。while_beginノードのインプットに繋がれた物はループに入る、入らないに関わらず1回だけ評価されます。

3

要はWhle_beginのConditionがFalseだったら、インプットがそのままEnd_whileのアウトプットになると言う事です。下の図はFalseになった場合のイメージ様にVOPを繋げたものです。

8

2回目以降のループはどうなるかというと、下の図の青い線が表しているように、end_while ノードのアウトプットが while_begin ノードのアウトプットになります。なので、ループ内で使いたい変数はwhile_beginノードに繋ぎ、処理をするしないに関わらず While_begin から end_while に繋ぐ必要があります。

4

 

VOP でWhileループを組んで何がどうなっているのか分からなかったら、VOPで作ったネットワークのコードの見方で説明したようにコードを表示してデバッグすることができます。下の図は上記のWhile VOPのコードを表示した物です。よく見ると、Whileループではなく、If文からのDo While ループを使っていますね。

2

 

While VOPは更に注意点があります。あるノードをループ内に含めたければWhile_begin のアウトプットを使う必要があります。下の例だと、ポイントナンバーとポイントナンバーを単純に足しているだけですが、下図を見れば分かるようにWhile_beginを経由したptnumを繋いだaddノードはループに含まれ、 Geometry VOP Global の ptnum だけを使ったaddノードはループには含まれません。

5

 

これもコードを確認してみると分かります。add1ノードによって作られたコードが見事にループの外に出ているのが確認できます。

6

 

While ループをVOPでやろうとすると色んな注意事項があるのが分かるかと思います。

  • ループ内で使う変数はWhile_beginに繋いで、End_whileにも繋ぐ。
  • ループ内に含めたいノードはWhile_beginからデータを繋ぐ。

結論を言うと、If文、Forループ、WhileループなどはVOPで組むと非常に面倒なので、VEXでパパッと書いてしまうのが一番良いという事です・・・。