loop-animation

ルービックキューブ風Cube Puzzle

3×3の立体パズルの面をランダムに90°ずつ回して崩し、同じ手順を逆にたどって揃った状態に戻るアニメーションです。

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

3×3 の立体パズルが面を90°ずつ回して崩れ、同じ手順を逆にたどって揃った状態に戻る

このシーンで作る

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

どう計算しているか

  1. 「シード」から決まる乱数で、回す軸・層・向きを「手数」の数だけ選びます。同じ軸が続かないようにします。そのあとに、手順を逆順にして向きも反対にした動きをつなげます。
  2. 27個の小さな立方体は、それぞれ3×3の回転行列を持っています。終わった手順については、対象の層にある立方体に90°の回転行列を掛けていきます。値を整数に丸めるので、誤差がたまりません。
  3. いま進行中の1手だけは、イージングをかけた途中の角度で回します。画面全体には、「見下ろす角度」の傾きと、縦軸まわりの「全体の回転数」の回転をかけます。
  4. 各面の向き(法線)を計算し、こちらを向いていない面は描きません。残りの面は奥から順に塗り、外側の面にはすき間をあけてステッカーの色を重ねます。
moves = seq + reverse(seq)⁻¹,  view = Rx(pitch)·Ry(π/4 + 2π·spin·t)

ループがつながる理由

前半で崩した手順を後半で逆にたどるので、最後には必ず揃った状態に戻ります。「揃った状態で止まる時間」の半分ずつを最初と最後に置いて静止させ、全体の回転は整数回なので、向きも元と一致します。

調整できるパラメータ

形

手数1 〜 10(初期値 5)
シード0 〜 999(初期値 8)
大きさ0.3 〜 1.1(初期値 0.7)
ステッカーのすき間0 〜 0.3(初期値 0.1)
見下ろす角度0 〜 1(初期値 0.6)

動き

揃った状態で止まる時間0 〜 0.5(初期値 0.12)
全体の回転数0 〜 2(初期値 1)
イージングlinear・sine・quad・cubic・quint・expo・back・elastic

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