Astro de 3D(7) ~明示的 Matrix3D 使用編 解説~
2008/06/07 20:52 - Astro
今回のコードでは明示的に二種類の Matrix3D を使用しています。
ひとつは、3D 空間全体を回転させるために使う Matrix3D。
もうひとつは面となる Shape を配置するために使う Matrix3D。
以後便宜的に前者を GlobalMat、後者を localMat と呼びます。
GlobalMat は1個、localMat は各面に1個なので計6個、あわせて7個の Matrix3D が存在しているわけです。
またまた、前のエントリーに戻るのがめんどうなので、ここでソースを再掲しますよ
- Main002.as (再掲)
まずは localMat から。
localMat は createCube メソッドで明示的に生成しています。
Matrix3D.appendRotation メソッド、Matrix3D.appendTranslation メソッドの両方もしくはいずれかにより、各面の 3D 空間上への配置します。
座標移動が appendTranslation、rotation[X|Y|Z] が appendRotation というわけですね。
定義した Matrix3D は DisplayObject のプロパティである DisplObject.transform.matrix3D に代入します。
このあたりは二次元のマトリクスである flash.geom.Matrix に対応する、DisplayObject.transform.matrix と同じ。
次に globalMat。
globalMat の生成と使用は onEnterFrameHandler メソッドにおいておこないます。
今回のコードでやりたいことは立方体の回転ですが、この回転 globalMat に担わせます。
appendRotation により、マウスのx座標をY軸回転に、マウスのy座標をX軸回転に変換、その後、すべての面のlocalMat ひとつひとつを globalMat を乗算することで、面に回転が反映されるという寸法です。
なお、面生成時において明示的に Matrix3D を生成するこのやり方は、実はムダな努力です。
localMat に関しては、前回失敗したコードで書いた rotation[X|Y|Z] と座標によるコーディングで、充分、用を果たすんですが、それに関してはまた稿を改めて。