前回、JavaScript transform関数で空間上で回転した平面を描画することができるようになったので、これを利用して既存のライブラリを使わずにcanvas上に紙吹雪を描画する方法を考えます。Canvas Confettiと同じようにある地点からクラッカーのように紙吹雪を飛ばして舞い落ちるような描画をさせることにします。

最高高度と到達時間から初速と重力加速度を算出する

クラッカーのように紙吹雪を飛ばすときに問題になるのが、初速と重力加速度です。実際には飛ばしたときに、どこまで飛ぶか、その位置まで飛ぶにはどれくらいの時間がかかるかです。

重力加速度は9.8m/s2ですが、ここでは①真上に飛ばした場合、最高点の座標と②最高点に達するまでにかかる時間のふたつを指定したらそのときに必要な初速と重力加速度を取得できるようにしておきたいです。

初速v0のときt秒後の速度vと位置sの公式は以下のようになります。

v = v0 – g * t
s = v0 * t – 1 / 2 * g * t * t

最高点に達するのがT秒後とすれば

0 = v0 – g * T ⇔ v0 = g * T

となります。t = T と v0 = g * T を s = の式に代入すると

s = g * T * T – 1 / 2 * g * T * T

となり、最高点の座標がgとTで表わすことができます。s = 1 / 2 * g * T * T です。

もし最高点の座標がSとして与えられているのであれば、g と v0 は S と T で表わすことができます。

S = 1 / 2 * g * T * T なので g = 2 * S / T / T です。また v0 = g * T なので v0 = 2 * S / T です。

これらの単位は初速は「メートル/秒」、加速度は「メートル/秒/秒」です。知りたいのは1更新あたりの値です。1秒間に60回更新されるので、1更新あたりでみた場合の重力加速度は 2 * S / T / T / 3600 であり、初速は 2 * S / T / 60 です。

Webページ上に紙吹雪を表示する

実際に紙吹雪を描画してみることにします。

HTML部分

グローバル変数と定数

グローバル変数と定数を示します。

index.js

Mat3クラスは前回とまったく同じものを使用します。

Pieceクラスの定義

Pieceクラスを定義します。まずコンストラクタを示します。

引数から紙吹雪の初期座標や初速、加速度を設定しますが、初速と加速度は乱数をつかってばらつきを持たせます。

加速度を速度に加算して紙吹雪の座標と回転角を求めます。また最大落下速度が指定されている場合は空気抵抗によって最大落下速度以上は速くならないようにします。また空気抵抗をうけているときは左右にヒラヒラと移動させながら落下させます。またY座標がCANVAS_HEIGHTよりも下になったら死亡フラグをセットします。

描画処理をしめします。回転量から回転行列を取得してtransform関数に渡す引数を求めます。そのあと描画処理をおこないます。

ページが読み込まれたときの処理