前回の第35回「Matrix3Dクラスによる座標変換」では,先に加える変換となるprependがついたMatrix3Dクラスのメソッドを試した。しかし,インスタンスに加わる変換は,スクリプトに書かれたものだけではないというヒントを示して終わった。今回は,その変換の中身を明らかにし,後から加えるappendのついた変換のメソッドを試す。
DisplayObjectインスタンスに加わる変換
例によって,まずは簡単なサンプルで確かめよう。ステージ中央にMovieClipインスタンスmy_mcを置き,2次元平面で90度回してみる(※1)。これを初めの状態とする(図1)。
MovieClipインスタンスを置いたタイムラインには,以下のフレームアクションを記述する。第1に注目してほしいのは,インスタンスのDisplayObject.transformプロパティから参照したTransform.matrix3Dに,Matrix3D()コンストラクタで生成した新規のオブジェクトを代入していることだ。これにより,インスタンスのもつ変換行列つまりMatrix3Dオブジェクトは,デフォルトに設定される。しかし第2に,インスタンスがもともともっていたMatrix3Dオブジェクトは,予め変数(myMatrix3D)にとっておいた。そして,インスタンスをクリックするとリスナー関数(setMatrix3D())によって,もとのMatrix3Dオブジェクトが改めて設定し直されるという流れだ。
// タイムライン: メイン
// タイムラインにMovieClipインスタンスmy_mcを配置
my_mc.z = 0;
var myMatrix3D:Matrix3D = my_mc.transform.matrix3D;
my_mc.transform.matrix3D = new Matrix3D(); // デフォルトのMatrix3Dオブジェクトを設定
my_mc.addEventListener(MouseEvent.CLICK, setMatrix3D);
function setMatrix3D(eventObject:MouseEvent):void {
my_mc.transform.matrix3D = myMatrix3D; // もとのMatrix3Dオブジェクトを設定
}
[ムービープレビュー]を確かめると,まずインスタンスはタイムラインの基準点つまりメインタイムラインなら左上隅に,回転していない(角度0)実寸(100%)で表示される(図2左図)。つぎにインスタンスをクリックすると,前掲スクリプトのリスナー関数により,オーサリング時に設定したとおり,ステージ中央で90度横に回る(図2右図)。
実は,Flash Player内部でも,インスタンスはこのような手順で配置されている。つまり,まずタイムラインに置くべきデフォルト状態のインスタンスを取出し,その変換情報が納められたMatrix3Dオブジェクトを調べる。そして,そのMatrix3Dオブジェクトをインスタンスに適用して表示する。変換を前に加えるprependと後に加えるappendは,もとのMatrix3Dオブジェクトよりメソッドを適用するのが前か後かという意味なのだ。
- ※1
- 2次元平面の回転は,3次元空間でいえばz軸で回すことを意味する。しかし,[変形]パネルの[3D回転]セクションにおける[Z]の角度には反映されない(前掲図1参照)。これは前回説明した,3次元空間の操作を加えるまではDisplayObjectインスタンスにMatrix3Dオブジェクトが生成されないのと同じ理由による。

