実行手順 (1) i_degRotを更新する。 (2) i_degRotだけ回転させる行列Rを取得する。 (3) i_degRevを更新する。 (4) i_degRevだけ回転させる行列を取得し、それを公転開始位置を表す定数c_initPosに掛けて、公転軌道上の移動位置を算出し posにセット。 (5) posだけ平行移動させる行列Tを取得する。 (6) RとTの積 M = T * R をDiskに実行。
プログラムは次の通り。 [Code2] (実行結果 図4)
i_degRot += 3;
THMatrix3x3 R = TH2DMath.GetRotation3x3(i_degRot);
i_degRev += 3;
THMatrix3x3 Rev = TH2DMath.GetRotation3x3(i_degRev);
Vector2 pos = Rev * c_initPos;
THMatrix3x3 T = TH2DMath.GetTranslation3x3(pos);
THMatrix3x3 M = T * R;
Disk.SetMatrix(M);
1フレームあたりの公転角度i_degRevの増加量と、1フレームあたりの自転角度i_degRotの増加量が等しいので (毎フレームそれぞれ$3$°ずつ増加)、Diskが1回公転する間に1回自転する結果になる。i_degRot、i_degRevともに初期値は$-3$であり、最初のフレームで$0$になる。 9行目の M = T * R は、まず原点(Diskの初期状態の位置)において R によって自転を行い、次に T によって公転軌道上の指定位置に移動するという2つの変換をまとめたものである。 図5はCode2の最初のいくつかのフレームにおいて、オブジェクトに実行される変換をアニメーションとして表したものであるが、図中に表示される白文字 R、T は回転行列R、平行移動行列Tを意味している。Diskの変換は初期状態から始まるが、まず原点において回転行列Rを実行する。これによって、Diskは角度i_degRotだけ回転し、回転した状態で次の変換である平行移動行列Tが実行される。表示されている白文字がRであるときは回転行列Rが実行されていることを意味しており、Tが表示されていれば平行移動行列Tが実行されていることを意味している。 平行移動が終わった時点で赤いフィルターの状態から通常色へ変換するが、この瞬間にフレーム描画が発生する。このプログラムでは、最初のフレームで i_degRot、i_degRev の値は$0$になるので (それぞれの初期値は$-3$)、最初のフレームでは Diskは初期状態の向きのまま、公転開始位置$(3,\ 0)$へ移動し、そこでフレーム描画が発生する。次のフレームでは、i_degRot、i_degRev の値は$3$になるので、Diskは初期状態の向きから$3$°回転し、$3$°回転した状態で公転開始位置から$3$°進んだ位置へ移動する。そこでフレーム描画が発生する。それ以降のフレームにおいても処理手順は同様である。描画されたフレームを連続的に表示すれば図4のアニメーションになる。