三次元変換行列(4)
2008/05/07 21:05 - AS3.0
前回、行列の構成というか方向というか、とにかくそんなのを決めました。
で、お次は行列成分のプロパティ名について考えます。
flash.geom.Matrix では、以下のようになっています。
| a b tx | | c d ty | | 0 0 1 |
それに準じて以下のようにしますかねー。
| a b c tx | | d e f ty | | g h i tz | | 0 0 0 1 |
まぁそれでも別にいいんですが、ここでちょっと立ち止まって考えてみました。
flash.geom.Matrix では a と d 以外の組み合わせの数値をいろいろ変えることにより、せん断効果を得ることができます。 でも今作ろうとしている 3D フレームワークで果たしてせん断が必要なんだろうか。
仮想三次元空間内に頂点群を設定し、その頂点群の回転なり移動なりを三次元変換行列で計算しようじゃないの、というのが今回の 3D フレームワークの趣旨です。
で、ここがポイント。 回転なり移動なりをしても、その頂点群の位置関係は基本的には変化しないと思うんですよね。 たとえば立方体を構成する8個の頂点群があったとして、立方体という位置関係を保持したまま回転なり移動なりすると思うんですよ。
他の頂点との位置関係を無視した移動や回転は、あったとしても三次元変換行列による計算とは関係ないんじゃないかと。
つまり、一つの三次元変換行列で全ての頂点の座標を変換する、あるいは、複数の行列があっても、ひとつの行列は正方形を構成する座標群を、別の行列は立方体を構成する座標群を…… というように、ある程度まとまった数の頂点の座標を単一の行列で変換する、という作りになるはず。
だったら別に、外部から行列の成分に対して個別にアクセスする必要ないのでは。
極端な話、行列成分を書き換える手段は translate(移動)と rotateAxis(各座標軸を基準にした回転)と scale(拡大縮小)だけで充分なんじゃないかと。
実際それでいいのかどうなのか、今後の練り込みによって変わってくる可能性がありますが、とりあえずは上記のポリシーの元に三次元変換行列クラスをコーディングしてみようかと思います。
となると、行列の各成分を個別に定義する必要はないわけだから、二次元配列で定義してもいいですよね。
そんなわけで、行列プロパティは以下のように定義することにします。
private var _matrix:Array = [ [ 1 , 0 , 0 , 0 ] , [ 0 , 1 , 0 , 0 ] , [ 0 , 0 , 1 , 0 ] , [ 0 , 0 , 0 , 1 ] ];
続く。