loop-animation

ドミノ倒しDomino Wave

並んだ板が端から順に倒れて隣の板にもたれかかり、しばらく止まったあと逆の順で起き上がるドミノの動きです。

Canvas 2D で、図形を 1 つずつ計算して描いています。初期設定で再生しています。

並んだ板が端から順に倒れて隣にもたれ、しばらくして逆向きの波で起き上がる

このシーンで作る

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

どう計算しているか

  1. 板は床に接する角を回転軸にして傾けます。最大の傾き角は asin(すき間 / 板の高さ) で、ちょうど板の上端が隣の板に触れる角度です。
  2. 各板の時刻は u = fract(t − 板の番号·「1枚ごとの遅れ」 − 列番号·「列ごとの遅れ」) です。番号が進むほど遅れるので、倒れる動きが波のように伝わります。
  3. u の区間を「倒れる」「倒れている時間」「起き上がる」の3つに分け、倒れる区間と起き上がる区間にそれぞれイージングを掛けて角度を決めます。
  4. 「列ごとに逆向き」をオンにすると、奇数列を左右反転して描くので、倒れる向きが列ごとに交互になります。
u = fract(t − k·lag − r·rowLag),  θ = f(u)·asin(gap/h)

ループがつながる理由

各板の角度は、u が0のときも1に近づいたときも0(直立)になるように区間を組んでいます。u は fract で1ループに1回巡るので、どの板も同じ姿勢でループをまたぎます。

調整できるパラメータ

形

列の数1 〜 16(初期値 6)
板の高さ30 〜 300(初期値 110)
板の厚み3 〜 40(初期値 12)
板の間隔15 〜 200(初期値 46)
床の線オン/オフ(初期値 オン)

動き

1枚ごとの遅れ0 〜 0.05(初期値 0.012)
列ごとの遅れ0 〜 0.3(初期値 0.05)
倒れている時間0 〜 0.6(初期値 0.25)
列ごとに逆向きオン/オフ(初期値 オン)
イージングlinear・sine・quad・cubic・quint・expo・back・elastic

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