DisplayObject.transformプロパティで参照できるTransformオブジェクトには、座標空間に関わるプロパティとして、Transform.matrixやTransform.matrix3Dのほか、Transform.perspectiveProjectionがあります。これらのプロパティから参照されるオブジェクトの操作の仕方は、少しずつ異なります。
1. Matrixオブジェクト − Transform.matrixプロパティ
まず、Matrixオブジェクトは、DisplayObject.transformプロパティのTransform.matrixプロパティから参照を直接得ることができません。つまり、操作したMatrixオブジェクトは、つねにDisplayObjectインスタンスのTransform.matrixプロパティに設定し直す必要があります(図001)[*1]。
以下のスクリプト001第3行目はデフォルト(単位行列)のMatrixオブジェクト(myMatrix)をDisplayObject(Sprite)インスタンスのTransform.matrixプロパティに設定し、第4行目でそのオブジェクト(myMatrix)に移動(Matrix.translate()メソッド)の変換を加えました。しかし、DisplayObjectインスタンスから参照したMatrixオブジェクトは何も変わっていません(第5行目のtrace()関数で[出力]されたMatixオブジェクトが単位行列のまま)。
スクリプト第6行目で、DisplayObject.transformから参照したTransform.matrixプロパティに改めてMatrixオブジェクト(myMatrix)を設定して初めて、その変換がDisplayObjectインスタンスに適用されます(第7行目のtrace()関数の[出力]参照)。
スクリプト001■Transform.matrixプロパティの操作
- var mySprite:Sprite = new Sprite();
- var myMatrix:Matrix = new Matrix();
- mySprite.transform.matrix = myMatrix;
- myMatrix.translate(100, 50);
- trace(mySprite.transform.matrix);
// 出力: (a=1, b=0, c=0, d=1, tx=0, ty=0)
- mySprite.transform.matrix = myMatrix;
- trace(mySprite.transform.matrix);
// 出力: (a=1, b=0, c=0, d=1, tx=100, ty=50)
- trace(mySprite.transform.matrix == myMatrix);
// 出力: false
|
図001■MatrixオブジェクトはDisplayObject.transformのTransform.matrixに必ず設定する
DisplayObject.transformから参照したTransform.matrixプロパティにMatrixオブジェクトを設定して初めて、その変換がインスタンスに適用される。
|
[*1] Flash CS4 Professional[ヘルプ]の[ActionScript 3.0言語およびコンポーネントリファレンス]は、[Transform]クラスについて以下のように説明します。
2次元変換を適用するには、Matrixオブジェクトを作成し、マトリックスの2次元変換を設定した後、表示オブジェクトのtransform.matrixプロパティを新しいMatrixオブジェクトに割り当てます。
また、「DisplayObject.transformプロパティ」の項も、つぎのように述べています。
matrixオブジェクト...[中略]...の新しい値を設定する唯一の方法は、新しいオブジェクトを作成し、そのオブジェクトをtransform.matrixプロパティ...[中略]...にコピーすることです
少し意味が取りにくいものの、本稿と同じく、Matrixオブジェクトは「transform.matrixプロパティ」に設定しないと、DisplayObjectインスタンスにその効果が生じないことを示したものと考えられます。
|
2. Matrix3Dオブジェクト − Transform.matrix3Dプロパティ
つぎに、Matrix3Dオブジェクトは、DisplayObject.transformのTransform.matrix3Dプロパティからその参照が得られます。したがって、参照したMatrix3Dオブジェクトを操作すれば、その変換はDisplayObjectインスタンスにそのまま適用されます。つまり、Matrix3Dオブジェクトを改めてDisplayObject.transformのTransform.matrix3Dプロパティに設定し直す必要がありません(図002)。
以下のスクリプト002第3行目で、デフォルトのMatrix3Dインスタンス(myMatrix3D)をTransform.matrix3Dプロパティに設定し、第4行目でそのインスタンスに移動(Matrix3D.prependTranslation()メソッド)の変換を加えると、DisplayObject(Sprite)インスタンスから参照したTransform.matrix3Dプロパティのオブジェクトも値が変わります(第5行目のtrace()関数は、Matrix3Dオブジェクトのxyz座標が示されたMatrix3D.positionプロパティを[出力])。つまり、その変換が直ちにDisplayObject(Sprite)インスタンスに適用されます。
スクリプト002■Transform.matrixプロパティの操作
- var mySprite:Sprite = new Sprite();
- var myMatrix3D:Matrix3D = new Matrix3D();
- mySprite.transform.matrix3D = myMatrix3D;
- myMatrix3D.prependTranslation(100, 50, 0);
- trace(mySprite.transform.matrix3D.position);
// 出力: Vector3D(100, 50, 0)
- trace(mySprite.transform.matrix3D == myMatrix3D);
// 出力: true
|
図002■Matrix3DオブジェクトはDisplayObject.transformのTransform.matrix3Dに対する参照を取得すればよい
DisplayObject.transformのTransform.matrixプロパティに対するMatrixオブジェクトの参照を得れば、そのオブジェクトへの変換がそのままインスタンスに適用される。
|
3. PerspectiveProjectionオブジェクト − Transform.perspectiveProjectionプロパティ
最後のPerspectiveProjectionオブジェクトは、少し振舞いが変わっています(図03-020)。
以下のスクリプト第3行目で、デフォルトのPerspectiveProjectionインスタンスをTransform.perspectiveProjectionプロパティに設定し、第4行目でそのインスタンスの視野角(PerspectiveProjection.fieldOfViewプロパティ)を設定しても、DisplayObject(Sprite)インスタンスから参照したTransform.perspectiveProjectionプロパティのオブジェクトは視野角が変わりません(第5行目のtrace()関数の[出力]参照)。この結果は、Matrixオブジェクトの場合と同じです。
他方、スクリプト第6行目で、Transform.perspectiveProjectionプロパティの参照をひとたび変数(myPerspective)に取ると、第7行目でその変数のオブジェクトに対して設定した視野角の値が、DisplayObject(Sprite)インスタンスにそのまま設定されます(第8行目のtrace()関数の[出力]参照)。つまり、Matrix3Dオブジェクトと同じく、変数にDisplayObject.transformのTransform.perspectiveProjectionプロパティの参照が得られたことを意味します。
スクリプト003■Transform.perspectiveProjectionプロパティの操作
- var mySprite:Sprite = new Sprite();
- var myPerspective:PerspectiveProjection = new PerspectiveProjection();
- mySprite.transform.perspectiveProjection = myPerspective;
- myPerspective.fieldOfView = 20;
- trace(mySprite.transform.perspectiveProjection.fieldOfView);
// 出力: 55
- myPerspective = mySprite.transform.perspectiveProjection;
- myPerspective.fieldOfView = 100;
- trace(mySprite.transform.perspectiveProjection.fieldOfView);
// 出力: 100
- trace(mySprite.transform.perspectiveProjection == myPerspective);
// 出力: false
|
図003■PerspectiveProjectionオブジェクトはDisplayObject.transformのTransform.perspectiveProjectionから取得する必要がある
DisplayObject.transformのTransform.perspectiveProjectionプロパティからPerspectiveProjectionオブジェクトの参照を得れば、そのオブジェクトへの操作がインスタンスに適用される。
|
4. オブジェクトの参照と複製
オブジェクトを変数に代入すると、その参照が渡されます。Transform.matrix3DプロパティのMatrix3Dオブジェクトは、この参照渡しが行われます。したがって、上記スクリプト002第4行目で、同じオブジェクトへの参照をもつ変数(myMatrix3D)が操作されると、Transform.matrix3Dプロパティの参照するMatrix3Dオブジェクトに変換が加わりました。
他方、Transform.matrixプロパティには、Matrixオブジェクトの参照が渡されるのでなく、オブジェクトは複製されて別に設定されるようです。前掲スクリプト001第8行目で、Transform.matrixプロパティと変数のMatrixオブジェクトが等しいかどうかを確かめると、falseと評価されます(図001)。スクリプト002の第6行目では、同様な評価がtrueとされる(図002)のと比べてみましょう。
なお、Transform.perspectiveProjectionプロパティも、参照渡しではなさそうです(スクリプト003第9行目の[出力]参照。図003)。少し変わった振舞いはあるものの、基本的にはTransform.matrixプロパティのMatrixオブジェクトと同じと考えてよいでしょう。
作成者: 野中文雄
作成日: 2009年10月29日