moyasiエフェクト館

主にエフェクト関係の記事を上げていこうかと思います。


エフェクトに関係する記事上げてきます
エフェクト関係の記事の内容は緩く募集中
自分がわかる範囲であれば書いていこうかなと。

【SD】PixelProcessorノードで粒子を作る

f:id:tktknkyo:20180401094606p:plain

SDには、PixelProcessorノードという、かなり細かい処理をしやすいノードがあるのですが

ややこしそうで触っていなかったのですが

色々調べて、自分なりに作ってみたので、一回記事として残しておきます。

 

今回は粒子ですが、単純な粒子だけであれば、polygon2のノードで作れるのですが、このノードでの作り方を知るためには良いのかなと。

 

 

今回のこのノード、単純に粒子を作るだけでなく、調整する機能も付けてあります。

 どのような調整ができるかは、このツイートをご覧下さい。

 

amd.click

今回の記事を書くのにあたって、この方の記事を参考にしています。

また、各関数の説明なども詳しくされているので。

この方の記事も見るのをオススメします。

 

 

まず、このノードには、$POSという、座標の割合を出力する変数があります。

f:id:tktknkyo:20180401095343p:plain

X軸とY軸それぞれ、座標の位置によって0~1の数値がそれぞれ割り振られます。

X軸のみ取り出すと、こんな感じのグラデーションになります。

f:id:tktknkyo:20180401095719p:plain

Y軸であれば、上下でのグラデーションになります、またXとY軸のそれぞれの座標なので、Floatが二つ入っているFloat2となります。

 

上の坐像で、$POSから0.5を引き算していますが、引き算することで

-0.5~0.5の数値に変換します、こうすることでXとYが0の位置が、画像の中心に来るようになります。

引き算するのに、-0.5をAddの関数で足し算していますが、思考中に色々試してたのが理由なだけで、引き算のSubtracionでも問題ないはずです。

 

f:id:tktknkyo:20180401100138p:plain

$posのほかに、$sizeという変数も使っています。

この変数は、X,Y軸の解像度を取得します

今回は2Kの解像度で作ったので、X,Y共に2048の定数が入っている状態です

$posで0~1の数値を出力し、0.5を引き算すると-0.5~0.5の範囲になり

解像度(今回は2048)を乗算する事で、-1024~1024の数値となります。

この処理は、後で必要になってきます。

 

f:id:tktknkyo:20180401101313p:plain

解像度で乗算した後に、三平方の定理により、中心からの距離を取得します

これにより、各ピクセル毎に中心からの距離が入ります。

 

f:id:tktknkyo:20180401101747p:plain

sizeで取得した解像度のX軸のみ取ります(X軸とY軸が同じなの前提ですが、Y軸でも問題ないです)

また、ここの数値は粒子の半径を取得します。

半径が解像度の半分の場合、端まで色が出てしまいます

エフェクトで使う場合、反対側に写ったりする仕様が多いので、上下左右1ピクセルは黒になるようにするので

半径は、(解像度の半分-1)とする事で、上下左右がそれぞれ黒になります。

最後に上下左右の部分を黒にする手段もありますが、円の端っこを切るので形が少し変形してしまいます。

 

青の部分の割り算は、解像度をそのまま割る事で、中心からの距離を-0.5~0.5の数値に戻しています(四隅は0.5超えていますが、そこは気にしないでください)

f:id:tktknkyo:20180401102337p:plain

ここの割り算の部分で、中心からの距離が取得できているので、中心が黒く、外になるほど白くなっています。

 

f:id:tktknkyo:20180401102610p:plain

 

このままでは可笑しいので、1から、割り算で距離を取得した数値を減算します。

これにより0~1の範囲の部分は反転しましたが、1を超えている部分があるので。その部分を切り取ります。

 

それが、下にある処理で"≧"の関数で、数値の大小を比較しています

第1と第2の入力の数値の比較をしています

f:id:tktknkyo:20180401103008p:plain

第二に接続している情報は、解像度の半分から1を引いた数値なので、それと比較する事で

半径が解像度から1引いた数値の円が描かれます、端に1ピクセルの空きが自然とできています。

 

f:id:tktknkyo:20180401103617p:plain

ここから、中心の真っ白な部分の領域を調整できる部分を作っていきます

まず、下にある緑で囲ってある数値は、調整用パラメータで

0~1の数値によって、白い部分の領域を調整出来るように作ります。

 

まず、白い領域というのは、1以上の数値の部分です

つまり、全体に数値を加算すれば、白い部分が増えることになります。

今回の粒子は、中心からの距離の数値から描画しているので

例えば0.5を入力すれば、0.5以上の部分(中心からの距離が0.5以下)が全て1以上になり真っ白になります。(左上の加算)

ただし、全体に加算してしまうのは問題なので

先ほどの、周囲を抜いた粒子の形の部分と乗算する事で、0になる部分には、加算されないように調整。(左上の乗算)

 

f:id:tktknkyo:20180401104919p:plain

ただし、この時点でもまだ問題が残り

粒子の範囲全てに同じ数値を加算するので、境界線がかなり目立ち過ぎでしまいます。

なので、加算する数値を、中心からの距離に応じて、小さい数値にする必要があります。

 

上にある減算は、最初の加算と同じ数値を、減算しているので

基本となる粒子が出力されます。

 

右上の除算は、その減算した数値から

調整用の入力した数値をから、1引いた数値を割ります。

f:id:tktknkyo:20180401105559p:plain

 

この時、調整用の数値が0.4なら0.6で割り

0.5なら0.5、0.6なら0.4で除算します。

 

0.5で割る場合、単純に2倍の数値となります

全体を倍にする=0.5以上は1を超えるが

0.5の加算と違い、元の数値が0.1の部分は0.2までしか加算されないので

境界線がそこまで目立たなくなります

0.9の極端な数値の場合、反転した0.1で割るので、つまり10倍することになります

そうすると、中心から0.9までの距離=0.1以上の数値は全て1を超えますが

0.01などの小さい部分は10倍しても0.1になるので、境界線が目立たなくなります。

 

これにより、入力した数値までは1以上の数値で、尚且つ境界線が目立たなくなります。

 

f:id:tktknkyo:20180401110448p:plain

先ほどの計算で問題が出てしまうのは、除算で作ったので、数値が極端になっている事です。

ただし、1を超えてしまう部分は、後々面倒になったりするので、0~1の間に調整します。

とはいえ、処理的には単純に

不等式を使い0以下の数値は0に、1以上は1の定数を適用しているのみです。

 

f:id:tktknkyo:20180401111137p:plain

 

最後に、グラデーションの調整用の部分です、結構見にくいです...

まず、どのように調整出来るようにするのか?という部分で

グラデーションの調整は、累乗で調整するようにします。

ただし、累乗の綺麗なやり方が解らなかったので、乗算で作っています

数値は0~4を入れることを想定して

0~1と。1~4で別けます(1はこの部分で調整しないので、どちらでもいいです)

まず、0~1の数値で、0はシルエットのような塗りつぶしにするので

0の場合赤で1と囲った部分(最初の方に作った半径が解像度の半分-1の円を描いた部分です)

1の場合、赤で2と囲った部分(距離から描画した粒子)

この二つを、Lerpで直線補間させます

第3は、0~1までなら、入力した数値をそのまま取ってきます。

f:id:tktknkyo:20180401112019p:plain

1を超えた場合は、最後のIFでの判定によって、このLerp自体をとってこないようにしてあります。

赤の部分で、入力した数値が1を超えるかどうかの判定

超えていなければ、上のLerpを、超えていれば下のLerpを取得します。

 

f:id:tktknkyo:20180401112410p:plain

こちらが、1を超えた場合に使用されるLerpの内訳です。

Lerpの第3入力は、1を超える数値でも問題ないですが、今回は0~1の数値に収まるよにしています。

 

第1入力には、基本となる粒子を入れます。

第2入力に、基本となる粒子を、4乗した粒子を入れています(同じ部分の乗算を2回)

第3入力は

調整用のパラメータが1の時に0

4の時に1になるように調整する必要があるので

最初に1を引いて、0~3にした後に、3で割る事で0~1の数値に収めています。

(1より小さい場合は、こちらのLerpはそもそも使われないので、マイナスになっても問題ないです)

 

 

www.dropbox.com

 

参考用に、sbsファイルも上げておきます。