ランダム版SphericalSpreadをつくった
元ネタは少し前に書いたProcessingの記事。vvvvには元々SphericalSpreadという単位球面上の等間隔な座標を生成してくれるめっちゃ便利なSpreadノードがあるんだけど、それのランダム版を作ってみた。
だいたいこんな感じ。比較用にSphericalSpreadと同じ入力を突っ込んだものを並べてみた。
おおよそSphericalSpreadと同じように使えるようにしたつもりだけど、SphericalSpreadのFactorピンについては座標計算にどう組み込めば実現できるのか、ぱっと思いつかなかったので実装していないです。
実装について
前回のコピペだけど、「z軸の値」と「角度」を乱数から生成して、そこからx, yを計算で求める。
x,yの値を求める数式はこんな感じ。詳しくは前の記事とかこのPDFとかを参照してください。
\begin{aligned}
x & = \sqrt{1 - z^2} * cos(φ) \\
y & = \sqrt{1 - z^2} * sin(φ) \\
\end{aligned}
出てきた値に半径を掛けてあげれば座標値がでてくる。乱数の生成はRandomSpread、三角関数なり平方根なりの計算はExprノードを使って実装した。
z値と角度のRandomSpreadのSeedが同じ値になると球体を描かなくなってしまうし、かと言って両方のSeedをInputピンにするのも気持ち悪かったので、一番上のRandomSpreadで生成した2つの乱数をGetSliceしてそれぞれのRandomSpreadのSeedに入れる、という実装になっています。このあたりはもうちょっとシンプルにしたかったけどうまいやり方が思い浮かばなかった。
ノードを繋いでないピンの値などは実際にパッチを見てもらえれば。
https://github.com/clomie/vvvv-sandbox/blob/master/RandomizedSphericalSpread.v4p
Spreadまわりのノードに関するTips
RandomSpreadについて
inputピンの入力値を中心に、プラスマイナス方向にそれぞれwidth / 2の分だけ振れる。今回の場合は
z値側のRandomSpreadはinputに π
、widthに 2π
を繋いでいるので、出力は 0
~ 2π
角度側のRandomSpreadはinputに 0
、widthに 2
を入れているので、出力は -1
~ 1
の範囲で値を生成するように設定した。
Spreadの生成について
任意の長さの連続した(1,2,3,……,n のような)値がSpreadでほしい時は、Iノードを使う。
任意の値が任意の長さ分繰り返された(1,1,1,……,1 のような)値がSpreadがほしい時は、Select (Value)を使う。
Iノードは公式のSpread Generatorsにも載っているので特に迷わなかったけど、SelectについてはSpreadからいくつかの値を抜き出す用途で使うノードとして載っていたので、しばらくどうすればいいかわからなかった……。