Canvas Confettiというライブラリをつかってwebページ上に紙吹雪を描画しました。ちょっとした事情があってCanvas Confettiを使わずに紙吹雪のようなものを描画する必要に迫られたため、別の方法で紙吹雪のようなものを描画する方法を考えます。

今回はCanvasRenderingContext2D: transform関数を使います。この関数はcanvasのフォームを変更するのに行列を使用します。これによってcanvasを伸縮、回転、移動、傾斜することができます。引数は6つあり、以下の行列のa~fに対応しています。

一方、紙吹雪は四角形の平面で回転しています。3次元の回転体はX軸、Y軸、Z軸を中心にした3つの回転にわけて考えます。

行列と回転処理

行列を使うと回転処理をおこなう行列は以下のようになっています。

画面は2次元であるなので回転処理をしたあとこれを平面 z = 0 に平行投影した図形を 画面に表示させればよいことになります。そのためには行列の積を計算して①~④を引数a~dにすればよいです。eとfは平行移動のためのものなので別に考えます。

行列を計算するクラスの定義

3×3行列を計算する処理をするのでMat3クラスを定義します。Multi関数は2つの行列の積を計算するためのものです。なんか変な計算ですが、これが行列の積の計算方法です。

X軸を中心とした回転画像の描画

まずは、X軸を中心とした回転画像を描画することにします。

HTML部分は以下のようにします。

JavaScript部分は上記のMat3クラスの定義に加えて、

index.js

これでX軸を中心に正方形が回転する描画ができるようになりました。

回転をシミュレーションする

これでは面白くないのでX軸、Y軸、Z軸を中心に回転させたりさせなかったり回転速度を変更できるようなものをつくります。

HTML部分

style.css

Mat3クラス

index.js

Mat3クラスは変更ありません。

グローバル変数と定数

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

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

ページが読み込まれたら初期化の処理をしたあと更新処理を開始します。

レンジスライダーで回転速度を変更できるようにします。またチェックが外れている場合はその軸では回転させません。initRanges関数はそのための処理をおこないます。

更新処理

更新処理を示します。

valueXだけangleXを増加させます。0の場合は回転させないということなのでangleXには0を代入します。そのあと回転行列を計算してtransform関数にわたす引数を取得します。そのあと描画処理をおこないます。