サイトトップ

Director Flash 書籍 業務内容 プロフィール
 

Now on Sale!!
ActionScript 3.0プロフェッショナルガイド』(毎日コミュニケーションズ)

『ActionScript 3.0プロフェッショナルガイド』をテキストにした短期集中講座
基礎から学ぶActionScript 3.0


■Mailing List: ActionScript 3.0


FLASH OOP勉強会

数学的なベクトルと行列からMatrix/Matrix3Dクラスを理解する

Date: 2008年12月11日 Product: Flash Platform: All Version: CS4/ActionScript 3.0

    index
  1. ベクトルと行列および変換行列
  2. Matrixクラス
  3. Matrix3Dクラス
    サンプルファイル (Flash CS4形式/約108KB)
  4. Graphics.drawTriangles()メソッド
  5. フォトレポート


1. ベクトルと行列および変換行列
勉強会で用いたスライドは以下のとおり。

上記タイトルをクリックするとSWFが開く。

なお、今回の数学的な解説は「変換行列を数学的に捉える」に簡単な概略がまとめてある。


2. Matrixクラス
Matrixクラスの変換行列は、abcdtxtyの6つの要素(プロパティ)が操作できる。下図001をクリックすると、SWFが開いて各値の変更結果を確かめられる。「Matrix」または「Rotate」のラジオボタンを選択したうえで、UIのボタンを操作するかテキストボックスに数値を入力する。

図001■変換行列のシミュレーション

3つの角のポイントをドラッグすると、その位置に合わせて矩形のインスタンスが変形するサンプル(図002)のスクリプトは、Adobeデベロッパーセンターの「Matrixクラス − 変換行列」で解説した。

図002■3つの角のポイントをドラッグするとインスタンスが変形する


3. Matrix3Dクラス[*1]
Matrix3D.prependRotation()メソッドは、インスタンス自身の変換行列(transform.matrix3DプロパティのMatrix3Dインスタンス)よりも前に(prepend)回転行列を乗じる(スクリプト001)。なお、インスタンスに対して3次元座標の操作(たとえばDisplayObject.zプロパティの設定)を行わないと、インスタンスのMatrix3Dインスタンスが生成されないことに注意。

スクリプト001■Matrix3D.prependRotation()メソッドでインスタンスの基準点を中心に水平回転

// タイムライン: メイン
// 第1フレームアクション
// MovieClipインスタンスmy_mcを配置
var nRotationY:Number = 30;
my_mc.z = 0;
my_mc.transform.matrix3D.prependRotation(nRotationY, Vector3D.Y_AXIS);

Matrix3D.appendRotation()メソッドは、インスタンスの変換行列の後から(append)回転行列を乗じる。したがって、インスタンスの基準点で回転するには、一旦親タイムラインの基準点に平行移動してから回転し、その後位置を戻す必要がある(スクリプト002)。

スクリプト002■Matrix3D.appendRotation()メソッドでインスタンスの基準点を中心に水平回転

// タイムライン: メイン
// 第1フレームアクション
// MovieClipインスタンスmy_mcを配置
var nRotationY:Number = 30;
var nX:Number = my_mc.x;
var nY:Number = my_mc.y;
my_mc.z = 0;
my_mc.transform.matrix3D.appendTranslation(-nX, -nY, 0);
// my_mc.transform.matrix3D.prependRotation(nRotationY, Vector3D.Y_AXIS);
my_mc.transform.matrix3D.appendRotation(nRotationY, Vector3D.Y_AXIS);
my_mc.transform.matrix3D.appendTranslation(nX, nY, 0);

Matrix3D.prependRotation()メソッドは、インスタンス自身の変換行列がまだ適用される前(prepend)のデフォルト(単位行列)の状態に回転行列を乗じる。そして、その後にインスタンスの変換行列が掛合わせられることになる。この処理を後(append)に乗じるメソッドで行ったのが、以下のスクリプト003だ。変換行列のMatrix3Dインスタンスを後から乗じるメソッドは、Matrix3D.append()メソッドになる。

スクリプト003■Matrix3D.appendRotation()でMatrix3D.prependRotation()メソッドをシミュレート

// タイムライン: メイン
// 第1フレームアクション
// MovieClipインスタンスmy_mcを配置
var nRotationY:Number = 30;
var nX:Number = my_mc.x;
var nY:Number = my_mc.y;
my_mc.z = 0;
var myMatrix3D:Matrix3D = my_mc.transform.matrix3D;
my_mc.transform.matrix3D = new Matrix3D();   // 単位行列を設定
my_mc.transform.matrix3D.appendRotation(nRotationY, Vector3D.Y_AXIS);
my_mc.transform.matrix3D.append(myMatrix3D);

なお、Matrix3Dクラスを使ったスクリプトのサンプルを、Adobeデベロッパーセンターの「Matrix3Dクラス − 変換行列2」で解説した。


4. Graphics.drawTriangles()メソッド[*1]
Graphics.drawTriangles()メソッドは、画像を複数の三角形に分割して、それらを変形したうえで合成する。3つの引数には、分割する三角形の座標や頂点番号、変形の仕方などの情報を指定する。

drawTriangles(頂点座標:Vector., 頂点番号:Vector. = null, uvtデータ:Vector. = null):void

図003■4角をドラッグして任意の四角形に変形する

* 図をクリックすると、SWFが開く[*2]

[*1] Matrix3DクラスとGraphics.drawTriangles()メソッドは、Flash Player 10から実装された。したがって、拙著にはその解説はない。

[*2] このサンプルスクリプトは、11月18日発売の「Web Designing」2008年12月号の「特集2:Adobe Creative Suite 4まるわかりガイド」で紹介した。スクリプトの解説およびソースファイルについては、本誌をご参照いただきたい。なお、年明けの2009年1月にGraphics.drawTriangles()メソッドについて解説した記事を、Adobeデベロッパーセンターに寄稿する予定である。


作成者: 野中文雄
作成日: 2008年12月16日


Copyright © 2001-2008 Fumio Nonaka.  All rights reserved.