【SD】PixelProcessorノードで粒子を作る
SDには、PixelProcessorノードという、かなり細かい処理をしやすいノードがあるのですが
ややこしそうで触っていなかったのですが
色々調べて、自分なりに作ってみたので、一回記事として残しておきます。
今回は粒子ですが、単純な粒子だけであれば、polygon2のノードで作れるのですが、このノードでの作り方を知るためには良いのかなと。
今回のこのノード、単純に粒子を作るだけでなく、調整する機能も付けてあります。
動かせるようにするとこんな感じ
— moyasi@エフェクト垢 (@torisutamoyasi) 2018年3月31日
始めてのPPノードでここまでいった感じ
下のパラメータは0~1の数値は必要あるのか疑問なものの入れてあります pic.twitter.com/AT1JKjkRMH
どのような調整ができるかは、このツイートをご覧下さい。
今回の記事を書くのにあたって、この方の記事を参考にしています。
また、各関数の説明なども詳しくされているので。
この方の記事も見るのをオススメします。
まず、このノードには、$POSという、座標の割合を出力する変数があります。
X軸とY軸それぞれ、座標の位置によって0~1の数値がそれぞれ割り振られます。
X軸のみ取り出すと、こんな感じのグラデーションになります。
Y軸であれば、上下でのグラデーションになります、またXとY軸のそれぞれの座標なので、Floatが二つ入っているFloat2となります。
上の坐像で、$POSから0.5を引き算していますが、引き算することで
-0.5~0.5の数値に変換します、こうすることでXとYが0の位置が、画像の中心に来るようになります。
引き算するのに、-0.5をAddの関数で足し算していますが、思考中に色々試してたのが理由なだけで、引き算のSubtracionでも問題ないはずです。
$posのほかに、$sizeという変数も使っています。
この変数は、X,Y軸の解像度を取得します
今回は2Kの解像度で作ったので、X,Y共に2048の定数が入っている状態です
$posで0~1の数値を出力し、0.5を引き算すると-0.5~0.5の範囲になり
解像度(今回は2048)を乗算する事で、-1024~1024の数値となります。
この処理は、後で必要になってきます。
解像度で乗算した後に、三平方の定理により、中心からの距離を取得します
これにより、各ピクセル毎に中心からの距離が入ります。
sizeで取得した解像度のX軸のみ取ります(X軸とY軸が同じなの前提ですが、Y軸でも問題ないです)
また、ここの数値は粒子の半径を取得します。
半径が解像度の半分の場合、端まで色が出てしまいます
エフェクトで使う場合、反対側に写ったりする仕様が多いので、上下左右1ピクセルは黒になるようにするので
半径は、(解像度の半分-1)とする事で、上下左右がそれぞれ黒になります。
最後に上下左右の部分を黒にする手段もありますが、円の端っこを切るので形が少し変形してしまいます。
青の部分の割り算は、解像度をそのまま割る事で、中心からの距離を-0.5~0.5の数値に戻しています(四隅は0.5超えていますが、そこは気にしないでください)
ここの割り算の部分で、中心からの距離が取得できているので、中心が黒く、外になるほど白くなっています。
このままでは可笑しいので、1から、割り算で距離を取得した数値を減算します。
これにより0~1の範囲の部分は反転しましたが、1を超えている部分があるので。その部分を切り取ります。
それが、下にある処理で"≧"の関数で、数値の大小を比較しています
第1と第2の入力の数値の比較をしています
第二に接続している情報は、解像度の半分から1を引いた数値なので、それと比較する事で
半径が解像度から1引いた数値の円が描かれます、端に1ピクセルの空きが自然とできています。
ここから、中心の真っ白な部分の領域を調整できる部分を作っていきます
まず、下にある緑で囲ってある数値は、調整用パラメータで
0~1の数値によって、白い部分の領域を調整出来るように作ります。
まず、白い領域というのは、1以上の数値の部分です
つまり、全体に数値を加算すれば、白い部分が増えることになります。
今回の粒子は、中心からの距離の数値から描画しているので
例えば0.5を入力すれば、0.5以上の部分(中心からの距離が0.5以下)が全て1以上になり真っ白になります。(左上の加算)
ただし、全体に加算してしまうのは問題なので
先ほどの、周囲を抜いた粒子の形の部分と乗算する事で、0になる部分には、加算されないように調整。(左上の乗算)
ただし、この時点でもまだ問題が残り
粒子の範囲全てに同じ数値を加算するので、境界線がかなり目立ち過ぎでしまいます。
なので、加算する数値を、中心からの距離に応じて、小さい数値にする必要があります。
上にある減算は、最初の加算と同じ数値を、減算しているので
基本となる粒子が出力されます。
右上の除算は、その減算した数値から
調整用の入力した数値をから、1引いた数値を割ります。
この時、調整用の数値が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以上の数値で、尚且つ境界線が目立たなくなります。
先ほどの計算で問題が出てしまうのは、除算で作ったので、数値が極端になっている事です。
ただし、1を超えてしまう部分は、後々面倒になったりするので、0~1の間に調整します。
とはいえ、処理的には単純に
不等式を使い0以下の数値は0に、1以上は1の定数を適用しているのみです。
最後に、グラデーションの調整用の部分です、結構見にくいです...
まず、どのように調整出来るようにするのか?という部分で
グラデーションの調整は、累乗で調整するようにします。
ただし、累乗の綺麗なやり方が解らなかったので、乗算で作っています
数値は0~4を入れることを想定して
0~1と。1~4で別けます(1はこの部分で調整しないので、どちらでもいいです)
まず、0~1の数値で、0はシルエットのような塗りつぶしにするので
0の場合赤で1と囲った部分(最初の方に作った半径が解像度の半分-1の円を描いた部分です)
1の場合、赤で2と囲った部分(距離から描画した粒子)
この二つを、Lerpで直線補間させます
第3は、0~1までなら、入力した数値をそのまま取ってきます。
1を超えた場合は、最後のIFでの判定によって、このLerp自体をとってこないようにしてあります。
赤の部分で、入力した数値が1を超えるかどうかの判定
超えていなければ、上のLerpを、超えていれば下のLerpを取得します。
こちらが、1を超えた場合に使用されるLerpの内訳です。
Lerpの第3入力は、1を超える数値でも問題ないですが、今回は0~1の数値に収まるよにしています。
第1入力には、基本となる粒子を入れます。
第2入力に、基本となる粒子を、4乗した粒子を入れています(同じ部分の乗算を2回)
第3入力は
調整用のパラメータが1の時に0
4の時に1になるように調整する必要があるので
最初に1を引いて、0~3にした後に、3で割る事で0~1の数値に収めています。
(1より小さい場合は、こちらのLerpはそもそも使われないので、マイナスになっても問題ないです)
参考用に、sbsファイルも上げておきます。