Edited at

1次元のパーリンノイズを扱う

More than 3 years have passed since last update.

Processingのnoiseメソッドみたいな1次元のパーリンノイズが欲しかったのでそれらしきパッチを書いたのと、Perlinノードが出力する値について書いた。


パッチ

Perlin.jpg

一番下のグラフ出力はIOBoxで直近500件の出力値を表示しています。

いつもやり方を忘れるんだけど、右側のInspektorの通りに、Columnsを入力するSpreadと同じ値にして、Show ConnectionsをEnableにするとこういう表示になる。

音声入力を周波数ごとに波形表示したい場合なんかでよく使われてるっぽい。


入力値と出力値の関係について

Perlinノイズ自体の算出方法については、パーリンノイズを理解するを読むと良さそう。PerlinノードのinputピンになっているOctaves / Frequency / Persistenceもそのまま出てくる。

で、一度読んでみたけどほとんどまともに理解できなかったので、入力値を変化させて出力される値がどう変化するか可視化してみました。

振幅値については、Minが負の方向、Maxが正の方向にPersistenceに応じた値(?)が出ている感じ。なので出力される値の幅を変えたい場合はPersistenceをいじれば良さそう。

inputの変化量を増やすと、単純に出力される値の変化量が変わる。グラフ的には時間軸方向に圧縮したようなイメージ。

input.jpg

一方、Frequencyの値を増やすと、値のアップダウン自体が小刻みになる。

freq.jpg

Octavesの値を増やした場合はノイズ感が増える。ちなみに0にするとFrequencyが効かなくなるっぽい。

Persistenceの値を1以上にした場合はOctavesを増やすとわけわかんない値になるので厳しい。

octave.jpg


入力値のソースに使うノードについて

今回はIntegrateを使った。このノードは1秒ごとにPosition Inに指定した分だけ増えるように毎フレーム値を増やしてくれる。つまり1フレームごとの変化量はPositionIn / FrameRateの値となるので、フレームレートが落ちた場合にもコマ落ちしてるように見えるけど変化のスピードは変わらなくなる。

逆に、フレームレートが落ちた場合にも1フレームごとの変化量は一定であって欲しい場合は、FrameCountに対して好きな倍率を掛けて入力値のソースとして使うと良いと思う。

例えば60fpsで動いてる場合、Inに1を設定したIntegrateをソースに出力したPerlinノイズと、FrameCounterの出力値を60で割った値をソースに出力したPerlinノイズは、RandomSeedが同じならほぼ一緒。ただしフレームレートは一定ではないので多少誤差が出る。

60fps.jpg

30fpsまでフレームレートが落ちた場合でも、FrameCounterを使用した側は1フレームごとの変化量を一定に保てる。

ただし、グラフの見た目は同じでも端から端へ移動するまでに60fpsで動いている時の倍の時間がかかっていることに注意。

30fps.jpg