三次元変換行列(2)
2008/04/27 21:37 - AS3.0
前回は、 flash.geom.Matrix の行列表現と「CGのための線形代数」という本に記載された行列表現について、行と列が入れ替わっている(転置行列と呼ぶそうな)が中身は同じことであることを見ました。
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 |
しかしそうすると、回転時における行列表現がちょっと妙です。
flash.geom.Matrix 行列成分 回転 | a b tx | | cos(q) sin(q) 0 | | c d ty | | -sin(q) cos(q) 0 | | 0 0 1 | | 0 0 1 |
「CGのための線形代数」 行列成分 回転 | a c 0 | | cosθ sinθ 0 | | b d 0 | | -sinθ cosθ 0 | | tx ty 1 | | 0 0 1 |
行列成分的には転置になっているのに、回転表現的には転置になっていません。
なぜ?
成分 b と c については、+sin と -sin どっちが正しいんでしょう?
それともどっちも正しくて、数学座標とコンピュータ画面ではY軸の正負の方向が逆になるから flash.geom.Matrix の回転表現と本の回転表現は反対になっているってことなんでしょうか。
他の資料にもあたってみましょう。
ウィキペディアの「行列式」の項を見てみると、以下のような表現がなされています。
| a b | | c d | と表現された行列は、 | x | → | ax + by | | y | | cx + dy | という平面上の線型変換を定めている。
もう一度「CGのための線形代数」の当該箇所を読んでみます。
<条件A> x' = ax + by y' = cx + dy <行列表現B> (x', y') = | x y | | a c | | b d |
条件Aを満たすとき、行列の積は行列表現Bで表すことができる、とあります。
ウィキペディアの内容と、本の内容を併せて書くとこうなります。
<演算式> x' = ax + by y' = cx + dy <「CGのための線形代数」の行列表現> (x', y') = | x y | | a c | | b d | <ウィキペディア「行列式」の行列表現> (x', y') = | x | | a b | | y | | c d |
成分 x、y の行列と、成分 a、b、c、d の行列が、共に転置しているってことは、行列の積の手順を考えると、この二つは同じことを表現しているってことですよね。
それらを踏まえた上で、「一次変換を表す行列」というページの行列表現と回転行列とを見ると、成分 b に対応する成分が -sin になる「CGのための線形代数」の方が正しく、flash.geom.Matrix は反転しているように思えます。
ということはやっぱりY軸の扱い絡みの補正が flash.geom.Matrix では働いているってことなんでしょうか。
とりあえず調べた範囲では多数派だった「CGのための線形代数」方式の行列表現(成分 b が -sin になる方)で三次元変換行列クラスを作っていこうと思います。