今回のテーマは、イテレータです。イテレータを使ってCubeを画面にいっぱい描画します。
推奨環境 この解説は、以下の環境を前提に作成し、動作確認等を行っています。ご確認ください。
改版履歴
Quartz Composer のサンプルを見ていると、同じような物体が沢山飛んでいたりするものをよく見かけますが、あれは、1つとか2つ作った物体を繰り返しちょっとずつ位置とか角度とか大きさとかを変えながら複製を作っているものが多いのです。Quartz Composer のパッチには、そういった繰り返しをサポートするためのものがいくつかありますが、今回取り上げるのが Iterator パッチです。「 Iterate 」が「 繰り返す 」という意味なので、イテレータというのは「 繰り返し屋 」というような意味になります。
Iterator パッチは、マクロパッチになっていて子供を持つことが出来ます。その子供を繰り返し描画することで沢山の物体を画面に描くことが出来るのです。Iterator パッチを配置したら、Inspector で、Input Parameters の Iterations に繰り返し回数を10と入力しておきます。これで、子供の10個の複製が作られます。
そして、Iterator パッチをダブルクリックして中に入り、Cube パッチを置き、6面に適当に色を付けます。沢山描画するので、ちょっと Cube の大きさは小さめにします。横幅 ( Width ) と高さ ( Height ) は0.6にします。厚み ( Depth ) は0.08にしてプレート状にしておきます。
結果は以下のとおり。でも、10個の Cube が描かれると思いきや、まだ1つしかありません。これは、10個の Cube が全く同じ場所に描かれているためで、実際には10個のCubeがあるのです。これらを少しずつ位置をずらして描画させてみましょう。
そのためには、Iterator Variables というパッチを使います。繰り返し描画をしている過程で、この Iterator Variables は、何番目を今描こうとしているかを知っています。Current Index ポートには、0から(繰り返し回数-1)までの数字を出力します。Current Position ポートには、0.0から1.0の値を出力します。つまり、最初は0.0という値を返して、最後の図形を描くときには1.0になるように値が徐々に変化していきます。なお、この Iterator Variables パッチは、Iterator パッチの中でしか働きません。
Cube の X Position に、この Iterator Variables の Current Position の値を入れてみます。ただし、X Position が0.0〜1.0と変化すると右側に寄ってしまうので、Math パッチを使って -0.5 します。すると、-0.5〜+0.5になります。
結果はこれ。10個の Cube が描画されました。1つ描画するごとに X Position が変わるのでこのようになるわけです。
次は、これをねじります。Z Rotation には、Current Position を Math パッチで 120 倍にして入れると、左端の Cube と右端の Cube で、120 度ねじれます。
最後に、Z Rotation に Iteration を使って 0 〜 360 の値を加えて回転させると、かなりかっちょよく動きます。
仕上げ作業として、背景にグラデーションを描いて、以前やった Lighting パッチで光をあてています。光を当てるだけでもずいぶん雰囲気が変わります。