as3のMatrixクラスを使ったムービークリップの変形にてmatrixクラスのscale(),rotate()による変換は、対象オブジェクトの親の座標を基準として適応されると書きましたが、fl.motion.MatrixTransformerクラスを使用すると、対象オブジェクト内の座標を基準として変換を適応できます。
下記、サンプル内のscaleMeおよびrotateMeボタンを押すと、flaマークの座標にかかわらず自分自身の中心を基準として変形されます。
以下、前回のソースに手を加えたサンプルとソースです。
MatrixTest2.zip
以下、今回のサンプルで追加した肝な部分です。
回転(自分基準)
拡大・縮小(自分基準)
まず回転変換ですが、これはMatrixTransformerクラスのrotateAroundInternalPointメソッドを使用すれば、自分自身の座標系を基準にして変換を適応することが可能です。
また、MatrixTransformerクラスにはrotateAroundExternalPointという関数も用意されていて、これは親座標系を基準にして変換をするので、機能的にはmatrix.rotate()と似てます。
相違点としては、rotateAroundInternalPointとrotateAroundExternalPointメソッドは変換を行う際に、基準とする座標を指定することもできます。また、引数に指定する回転角度はラジアン単位ではなく度単位なので注意が必要です。
次に拡大・縮小に関してですが、MatrixTransformerクラスのgetScaleX,getScaleYを利用すると、現在変換行列で定義されている拡大に関する成分をとってくる事ができます。
後は、これらの値に変更を加えた値をsetScaleX,setScaleYメソッドで変換行列に再設定してあげれば大丈夫です。
fl.motion.MatrixTransformerクラスに関しては、他にもいろいろと便利な関数があるみたいなので、また書いていきたいと思います。
下記、サンプル内のscaleMeおよびrotateMeボタンを押すと、flaマークの座標にかかわらず自分自身の中心を基準として変形されます。
以下、前回のソースに手を加えたサンプルとソースです。
MatrixTest2.zip
以下、今回のサンプルで追加した肝な部分です。
回転(自分基準)
function rotateMe(target:MovieClip, q:Number) {
var mat:Matrix = target.transform.matrix;
MatrixTransformer.rotateAroundInternalPoint(mat, 0, 0, q);
target.transform.matrix = mat;
}
拡大・縮小(自分基準)
function scaleMe(target:MovieClip, sx:Number, sy:Number) {
var mat:Matrix = target.transform.matrix;
var mat_sx:Number = MatrixTransformer.getScaleX(mat);
var mat_sy:Number = MatrixTransformer.getScaleY(mat);
MatrixTransformer.setScaleX(mat, mat_sx * sx);
MatrixTransformer.setScaleY(mat, mat_sy * sy);target.transform.matrix = mat;
}
まず回転変換ですが、これはMatrixTransformerクラスのrotateAroundInternalPointメソッドを使用すれば、自分自身の座標系を基準にして変換を適応することが可能です。
また、MatrixTransformerクラスにはrotateAroundExternalPointという関数も用意されていて、これは親座標系を基準にして変換をするので、機能的にはmatrix.rotate()と似てます。
相違点としては、rotateAroundInternalPointとrotateAroundExternalPointメソッドは変換を行う際に、基準とする座標を指定することもできます。また、引数に指定する回転角度はラジアン単位ではなく度単位なので注意が必要です。
次に拡大・縮小に関してですが、MatrixTransformerクラスのgetScaleX,getScaleYを利用すると、現在変換行列で定義されている拡大に関する成分をとってくる事ができます。
後は、これらの値に変更を加えた値をsetScaleX,setScaleYメソッドで変換行列に再設定してあげれば大丈夫です。
fl.motion.MatrixTransformerクラスに関しては、他にもいろいろと便利な関数があるみたいなので、また書いていきたいと思います。






コメントする