loop-animation

階段Endless Stairs

平行に並んだ階段をボールが一段ずつ跳ねて降り、カメラも同じ速さで追いかけるので、終わりなく続いて見える階段です。

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

ボールが一段ずつ跳ねて降りる、終わりのない階段。カメラが追従して元の位置に戻る

このシーンで作る

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

どう計算しているか

  1. 階段は、横に「踏面の幅」W、下に「蹴上げの高さ」H ずつ進む折れ線を画面の外まで十分な段数ぶん引き、その下に「段の厚み」ぶんの帯を付けた多角形として塗ります。
  2. 「階段の本数」だけ、「階段の間隔」をあけて上下に並べます。「傾き」は画面全体の回転角です。
  3. ボールは各段の上を、横方向はイージングで W だけ、縦方向は H だけ進みます。さらに「ジャンプの高さ」× 4u(1 − u) という放物線を引いて、跳ねる軌道にします。
  4. 着地の前後では「つぶれ」に応じてボールを横に広げ、縦に縮めます。量は着地からの時間差 d を使った exp(−(d / 0.06)²) で、着地の瞬間だけ強くつぶれます。
  5. 「本ごとの時間差」で階段ごとにボールの時刻をずらします。ずらした時刻の整数部分を段の番号に足すので、ずれていてもボールは正しい段にいます。
x = (0.5 + ease(u))·W,  y = ease(u)·H − hop·4u(1 − u)

ループがつながる理由

画面全体を1ループで (−W, −H)、つまりちょうど1段ぶん平行移動しています。階段は1段ごとに同じ形の繰り返しなので、1段ずれた画面は元の画面と同じに見えます。ボールも1ループでちょうど1段降りるため、カメラとの相対位置が元に戻ります。

調整できるパラメータ

形

踏面の幅30 〜 260(初期値 110)
蹴上げの高さ10 〜 200(初期値 60)
階段の本数1 〜 8(初期値 3)
階段の間隔80 〜 700(初期値 260)
段の厚み10 〜 600(初期値 120)
傾き-45 〜 45(初期値 0)
ボールオン/オフ(初期値 オン)
ボールの大きさ5 〜 80(初期値 22)

動き

ジャンプの高さ0 〜 300(初期値 90)
本ごとの時間差0 〜 0.5(初期値 0.12)
つぶれ0 〜 0.6(初期値 0.3)
イージングlinear・sine・quad・cubic・quint・expo・back・elastic

同じ分類のシーン(立体・擬似3D)