3.0DisplayObject.transformプロパティで参照できるTransformオブジェクトには、座標空間に関わるプロパティとして、Transform.matrixやTransform.matrix3Dのほか、Transform.perspectiveProjectionがあります。これらのプロパティから参照されるオブジェクトの操作の仕方は、少しずつ異なります。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()関数の[出力]参照)。false図001■MatrixオブジェクトはDisplayObject.transformのTransform.matrixに必ず設定するDisplayObject.transformから参照したTransform.matrixプロパティにMatrixオブジェクトを設定して初めて、その変換がインスタンスに適用される。3.0言語およびコンポーネントリファレンス]は、[Transform]クラスについて以下のように説明します。2次元変換を適用するには、Matrixオブジェクトを作成し、マトリックスの2次元変換を設定した後、表示オブジェクトのtransform.matrixプロパティを新しいMatrixオブジェクトに割り当てます。「DisplayObject.transformプロパティ」の項も、つぎのように述べています。matrixオブジェクト...[中略]...の新しい値を設定する唯一の方法は、新しいオブジェクトを作成し、そのオブジェクトをtransform.matrixプロパティ...[中略]...にコピーすることです少し意味が取りにくいものの、本稿と同じく、Matrixオブジェクトは「transform.matrixプロパティ」に設定しないと、DisplayObjectインスタンスにその効果が生じないことを示したものと考えられます。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)インスタンスに適用されます。true図002■Matrix3DオブジェクトはDisplayObject.transformのTransform.matrix3Dに対する参照を取得すればよいDisplayObject.transformのTransform.matrixプロパティに対するMatrixオブジェクトの参照を得れば、そのオブジェクトへの変換がそのままインスタンスに適用される。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プロパティの参照が得られたことを意味します。false図003■PerspectiveProjectionオブジェクトはDisplayObject.transformのTransform.perspectiveProjectionから取得する必要があるDisplayObject.transformのTransform.perspectiveProjectionプロパティからPerspectiveProjectionオブジェクトの参照を得れば、そのオブジェクトへの操作がインスタンスに適用される。オブジェクトの参照と複製オブジェクトを変数に代入すると、その参照が渡されます。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行目の[出力]参照。変わった振舞いはあるものの、基本的にはTransform.matrixプロパティのMatrixオブジェクトと同じと考えてよいでしょう。