loop-animation

SDF・シェーダーMetaballs

整数周波数で周回する複数の円の距離関数をなめらかに合成し、液体のように溶け合う形を描くシェーダーのループです。

WebGL2 のシェーダーで、画素ごとに計算して描いています。初期設定で再生しています。

整数周波数で周回する球が smooth-min で溶け合う。等高線や色帯でも描ける(WebGL2)

このシーンで作る

パラメータ、色、エフェクトを変えて、GIF・APNG・WebP・MP4・WebM で書き出せます。

どう計算しているか

  1. GPU 上で画面の各ピクセルについて、「球の数」の円それぞれまでの距離関数(ある点が図形の境界からどれだけ離れているかを返す関数)を計算します。
  2. 各円の中心は「軌道の大きさ」·(sin 2π(fx·t + h), cos 2π(fy·t + h)) で動きます。fx, fy は 1 か 2 の整数で、h や半径の違いは「シード」から作る疑似乱数で決めます。
  3. 距離を合成するときは単純な最小値ではなく、指数と対数を使ったなめらかな最小値(smooth min)を使います。「溶け具合」が大きいほど、近づいた円同士が太い首でつながります。
  4. 「描き方」が塗りなら距離が負の部分を塗ります。等高線は距離に「線の密度」を掛けた値の整数ごとに線を引き、色帯はその値の整数部分で色を塗り分けます。
d = smin_k(|p − cᵢ(t)| − rᵢ),  cᵢ = A·(sin 2π(fₓt+h), cos 2π(f_y t+h))

ループがつながる理由

円の中心は整数周波数の sin・cos で動くので t = 1 で元の位置に戻ります。等高線や色帯は「線の流れ」×色数(色帯は色数+1)本ぶんだけ値をずらすため、1 ループで色の並びがちょうど一巡して元の見た目と一致します。

調整できるパラメータ

形

球の数2 〜 16(初期値 7)
大きさ0.05 〜 0.6(初期値 0.2)
溶け具合0.001 〜 0.8(初期値 0.25)
描き方塗り・等高線・色帯
線の密度2 〜 60(初期値 14)
線幅(px)0.5 〜 12(初期値 2.5)

動き

軌道の大きさ0 〜 1.2(初期値 0.55)
線の流れ0 〜 4(初期値 1)
シード0 〜 99(初期値 3)

同じ分類のシーン(点・軌道)