HTML5テクニカルノート EaselJSのMatrix2Dオブジェクトの変換行列を適用する
*【0.7.0】EaselJS 0.7.0で新たに加わった項目。
説明Matrix2Dオブジェクトの変換行列は、DisplayObjectやPointのインスタンスに適用して座標変換が加えられます。また、変換した後のプロパティ値をObjectインスタンスに納め、他の座標変換に用いることもできます。 Matrix2Dオブジェクトの変換行列でDisplayObjectインスタンスを変形したいときは、Matrix2D.decompose()メソッドの引数にインスタンスを渡して呼出します。すると、変換行列から導かれる位置や伸縮、傾斜、回転などのプロパティがObjectインスタンスに与えられます。 Matrix2Dオブジェクト.decompose(DisplayObjectインスタンス) Matrix2D.decompose()メソッドの引数は、DisplayObjectインスタンスにはかぎりません。また、引数を省くとプロパティが納められた新たなObjectインスタンスをつくって返します。そのプロパティ値を後で取出して、DisplayObjectインスタンスに加えることもできます。 Matrix2D.transformPoint()メソッドはEaselJS次期バージョン候補(0.7.0)に備わりました。参照するMatrix2Dオブジェクトの変換行列で、引数のxy座標値を変換し、変換後のxy座標値がプロパティに納められたオブジェクトを返します。 Matrix2Dオブジェクト.transformPoint(x座標, y座標, 格納オブジェクト) 変換されたxyプロパティを加えたいPointなどのオブジェクトは、第3引数として渡します。第3引数を省くと、xyプロパティを納めた新たなObjectインスタンスが返ります。 例Matrix2D.decompose()メソッドの例からご紹介します。ステージに置いたインスタンスをクリックしたらMatrix2Dオブジェクトで回してみます。ただし、回転の軸は、マウスクリックした任意の座標とします(図001)。Matrix2Dオブジェクトの座標変換はつねに、そのオブジェクトが置かれた座標空間の原点を基準とすることに注意しなければなりません。この例では、つぎのように考えます。
図001■インスタンスがクリックされた座標を中心に回る まず、インスタンスの座標からマウス座標を差引くと、インスタンスのクリックされた座標が親オブジェクトの原点と重なります。ですから、そこでインスタンスを回せば、回転の軸がクリックされた座標になります。そして、改めてマウス座標を加えることで、インスタンスの回転軸がクリック位置に戻るのです。 以下のコード001は、インスタンス(instance)をクリックするたびに、その座標を軸に30度(π/6ラジアン)回ります。DisplayObject.clickイベントのリスナー関数(transform())は、DisplayObject.getMatrix()メソッドでインスタンス(target)の変換行列が表されたMatrix2Dオブジェクトを取出します(第7行目)。 そのMatrix2Dオブジェクトの変換行列から、まずMatrix2D.translate()メソッドでマウス座標(mouseXとmouseY)を差引く移動が加えられます(第8行目)。これでインスタンスのクリックされた位置が親オブジェクトの原点と重なりますので、つぎにMatrix2D.rotate()メソッドによりインスタンスを30度(π/6ラジアン)回します(第9行目)。そして、改めてMatrix2D.translate()メソッドで変換行列にマウス座標を加えれば、インスタンスがクリックされた座標はもとの位置に戻ります(第10行目)。 以上3つの変換が加えられたMatrix2Dオブジェクトを、Matrix2D.decompose()メソッドでインスタンス(target)に適用すれば、クリックされた座標を軸にインスタンスが回ります(前掲図001)。 コード001■インスタンスをクリックした座標で回転する
新しいMatrix2D.transformPoint()メソッドを用いると、xy座標がMatrix2Dオブジェクトで変換できます。以下のコード002は、配列(points)に納めたPointオブジェクトの座標をMatrix2D.transformPoint()メソッドで回転します。これらの座標を直線で結べば、ワイヤーフレームの図形が回ります(図002)。 アニメーションにするため、Ticker.tickイベントにリスナー関数(rotate())を加えます(第3行目)。リスナー関数では、Matrix2Dオブジェクトは予め変数(matrix)にとっておき、Matrix2D.identity()メソッドにより初期化したうえで[*2]、Matrix2D.rotate()メソッドで回します(第2および第6行目)[*3]。そして、for文で配列のPointオブジェクトすべてを順に取出し、em>Matrix2D.transformPoint()メソッドで変換します(第7〜10行目)。なお、取出したPointオブジェクトのxy座標を書替えるため、メソッドの第3引数にオブジェクトを渡しています。 図002■座標を直線で結ぶとワイヤーフレームの図形が回る
さらに、Matrix2D.transformPoint()メソッドの応用例として、3次元空間で星形のワイヤーフレームを回すコードがjsdo.itに掲げてあります。JavaScriptコードの中身については「遠近法が投影された座標を求める」をお読みください。
作成者: 野中文雄 Copyright © 2001-2013 Fumio Nonaka. All rights reserved. |
||||||||||||||||||||||||||||