loop-animation

SDF・ドメイン反復Goo Grid

格子状に繰り返した距離関数の図形が、隣同士で溶け合いながら伸縮・回転・公転するシェーダーの模様です。

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

格子に反復した距離関数の図形が、隣同士で溶け合いながら伸縮・回転・公転する(WebGL2)

このシーンで作る

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

どう計算しているか

  1. 画面の各画素で、距離関数(ある点が図形の境界からどれだけ離れているかを返す関数)を計算します。座標をマスの大きさで割って切り捨て、どのマスにいるかを求めます。
  2. 自分のマスと周囲8マスの図形までの距離を求め、smooth min(2つの距離を、なだらかにつないで小さい方を取る関数)で合成します。「溶け具合」を大きくすると、近くの図形同士が粘りけのある液体のようにつながります。
  3. 各マスの時間のずれは「位相のずれ方」(中心からの距離、斜め、角度、市松)×「ずれ量」です。伸縮は座標を縮めて距離を求め直し、回転は回転行列で座標を回し、公転は中心を円軌道でずらします。
  4. 「描き方」が塗りなら距離が負の部分を塗り、等高線や色帯なら距離を「線の密度」倍して小数部分や整数部分で線や帯を描きます。「線の流れ」で線が外側や内側へ流れます。
d = smin_{3×3}(sd(rot(p − c_ij(e)))),  e = ease(fract(t − ph·spread))

ループがつながる理由

伸縮と公転は cos・sin の1周期、回転は図形の対称角(「強さ」が大きいときはその2倍)なので、各マスは1ループで元の形に戻ります。線の流れも色数の整数倍だけずらすので、線の位置と色がループの境目でそろいます。

調整できるパラメータ

形

図形丸・四角・三角・六角形・十字・リング
分割数2 〜 30(初期値 7)
サイズ0.1 〜 1.2(初期値 0.8)
溶け具合0.001 〜 0.5(初期値 0.15)
描き方塗り・等高線・色帯
線の密度2 〜 80(初期値 20)
線幅(px)0.5 〜 12(初期値 2.5)

動き

動き伸縮・回転・公転
強さ0 〜 1(初期値 0.7)
位相のずれ方同時・放射・斜め・角度・市松
ずれ量0 〜 3(初期値 0.8)
線の流れ0 〜 4(初期値 0)

同じ分類のシーン(タイル・格子)