三次元変換行列(1)
2008/04/26 22:01 - AS3.0
3D 表現再履修、まずは変換行列をクラスとして整備するところから話をはじめます。 つまり、三次元対応 Matrix クラスを作るってことですね。
以前の 3D 表現クラスでも ExMatrix という名前でクラス化したことがありますが、今回、気持ちも新たに前のコードはキレイサッパリ忘れて、ゼロからのコーディング。
でも三次元の変換行列に取りかかるその前に ActionScript のビルトインクラスである flash.geom.Matrix についてちこっと復習してみます。
flash.geom.Matrix
Livedocs の当該ページを見ると Matrix は3×3の行列であるということが記載されています。
行列成分 規定値 | a b tx | | 1 0 0 | | c d ty | | 0 1 0 | | 0 0 1 | | 0 0 1 |
tx と ty は平行移動の変換に使う成分。 a、b、c、d は拡大縮小、回転、変形に関わる成分であるということは、今さら言うまでもないですね。
書籍を繙く
ところで、「CGのための線形代数」という本の、二次元の座標と行列について解説した章には以下の事が記載されています。
(x', y') = f(x, y) という関数 f が以下の式を満たしているとします。
x' = ax + by y' = cx + dy
その場合、関数 f は以下の 2×2 の行列で表現することができるという(P38~)。
行列成分 規定値 | a c | | 1 0 | | b d | | 0 1 |
しかし、この 2×2 行列では、原点が固定された拡大縮小や回転しか計算できないそうな。
書籍では続きます。
でも原点の移動を伴う座標変換(すなわち平行移動)も同じように行列でおこなえた方が、すべての座標変換について統一的に扱うことになるので便利である、じゃあそのためにはどうすんのか? と。
結論を言うと、斉次座標というものを使うと、行列で平行移動も扱えるようになるんだそうです(P46~)。
で、斉次座標は下のように 3×3 行列で表現するとのこと。
行列成分 規定値 | a c 0 | | 1 0 0 | | b d 0 | | 0 1 0 | | tx ty 1 | | 0 0 1 |
これを見ると flash.geom.Matrix は斉次座標を扱うんだな、ということが分かります。
ところで flash.geom.Matrix の行列成分と、書籍にある斉次座標の行列成分を見ると、ちょこっと違う部分があります。
そう tx、ty の配置が片や列、片や行。
1列目 | 2列目 | 3列目 | |
---|---|---|---|
1行目 | a | b | tx |
2行目 | c | d | ty |
3行目 | 0 | 0 | 1 |
1列目 | 2列目 | 3列目 | |
---|---|---|---|
1行目 | a | c | 0 |
2行目 | b | d | 0 |
3行目 | tx | ty | 1 |
でも b と c の配置もよく見てください。危うく騙されるところでした。 行と列が単純に入れ替わっているだけで、どっちの行列も中身は同じです。
続く。