この投稿は「VVVV Advent Calendar 2014」の6日目の記事です。
##Spreads とは
vvvv の特徴として**「Spreads」という概念があります。
これは配列のようなイメージのデータの集合です。
数値、ベクトル、カラー、テクスチャ、行列などを「一連のデータ」**として扱えます。
Spreads は非常に強力な仕組みで、色々な表現を簡潔に記述できます。
Spreads を使いこなしてこそ vvvv らしいパッチだと言えるでしょう。(僕が使いこなせているとは言っていない)
###(1)単純に2つ並べた。
vvvv に慣れていないと力技でこのような書き方をすると思います。
###(2)位置、サイズ、色を Spreads にまとめた。
Transform、Quad ノードが減りました。
Spreads を使うとノード数が減り、それはすなわち生産性とメンテナンス性の向上です。
###(3)位置の Spreads を LinearSpreads を使って楽に生成。
Spreads を生成してくれるノードもあります。ここでは LinearSpread ノードを使って、4つの X 座標を生成しています。
ここで生成される X 座標が4つなのに対し、サイズや色の Spreads は2つのデータのみです。
このようにノードの入力スライス数が等しく無い場合、ノードの結果の大きさは、一番数が大きいものに合わせられます。
少ないものは、要素数を超えたときにはまた先頭から繰り返し値が参照されます。
この例だと、
位置(4つ): -0.6, -0.2, 0.2, 0.6
サイズ(2つ): 0.3, 0.5, 0.3, 0.5
色(2つ): 赤、青、赤、青
となり、位置データの4スライスに合わせるために、2スライスのサイズデータと色データが2回繰り返されています。
Spreads 生成系のノード
LinearSpread 以外にも Spreads を生成してくれるノードはたくさんあります。
カテゴリで言うと**「Spreads」カテゴリ**内にたくさん入っています。
例えば、
これだと、左から、
###CircularSpread
円形になるように X,Y 座標を生成
###TypoSpread
文字に沿うように X,Y 座標を生成
###Cross(2d)
二つの Spreads を組み合わせて 2次元的な Spreads を生成しています。
この場合、5x6 の X,Y 座標を生成しています。
###GaussianSpreads
GaussianSpreads はガウス分布に従って値を生成してくれます。
これと Cross を組み合わせると、上の画像のようになります。
##休憩
Spreads は値を生成するので、もちろんそれに Damper をはさむ事なども出来ます。
そうすると、こういったひょこひょこした変化も簡単に作れますね。
こんな感じ。
また、vvvv のノードの入出力は基本的に Spreads に対応しています。
なのでテクスチャを Spreads にする事などももちろん可能です。
こんな感じ。
##スライス の選択
**「ある条件のスライスを取得する」**というやり方が分からなくて、似たようなノードが大量にコピペされているパッチをよく見かけます。
そういった時は Select ノードを使えばすっきりします。
###(1)
選択されているスライスのインデックスを取得しています。
###(2)
0.1 以上のスライスの値とインデックスを取得しています。
##データの集合の保持
いくつかの値をまとめて保持したい場合。他の言語でいう構造体的なものを扱いたい場合。
少し生データを扱う感じになってしまいますが、シェーダで言う頂点データ定義のような考えで、データ集合を保持する事が出来ます。
主に**「Cons」「Unzip(Bin)」「Queue」**ノード辺りがミソになってきます。
これの例として、下のような表現をするためのチュートリアル動画をアップしました。
動画はこちら。【vvvv講座】チュートリアル:Spreads を使ってデータ集合を保持しよう
このパッチファイルはこちら。https://github.com/yhyjp/vvvv_tutorial/blob/master/Tutorial_Kurumi.v4p
**「Cons」で位置、色、サイズ情報を繋ぎ、「Queue」にデータを貯め、「Unzip(Bin)」**で復元、という流れが主に伝えたい所です。
Spreads を出来るだけ使っている動画です。
##最後に
Spreads は非常に強力で、vvvv の大きな魅力の1つです。
vvvv において、重複する部分が出てきた場合は必ず Spreads にして簡潔に記述する事が出来ます。
vvvv でパッチを作る時の心がけとして、
コピーする前に Spreads で表現できないか考えてみよう。
たまにパッチ全体を見て Spreads に出来る所が無いか探そう。
Spreads を使って重複を減らしましょう。
ノードを減らせるという事、それはすなわち生産性とメンテナンス性の向上です。
以上。ばいばーい。