サイトトップ

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

Flash ActionScript 3.0 Reference

◎06 幾何

☆15 ★3次元変換行列に別のMatrix3Dオブジェクトを変換として加えたい

解説
Matrix3Dクラスの3次元変換には、別のMatrix3Dオブジェクトを用いることもできます。Matrix3Dオブジェクトで変換を行えば、複数の変換を1度で処理したり、同じ変換を使い回すことができます。Matrix3Dオブジェクトを最初の変換として追加するにはMatrix3D.prepend()メソッド、後から変換を加えるにはMatrix3D.append()メソッドを用います。また、Matrix3Dインスタンスを複製するにはMatrix3D.clone()メソッド、変換を反転するにはMatrix3D.invert()メソッドが使われます。

なお、Matrix3Dオブジェクトは、Transformクラスのプロパティ(Transform.matrix3D)です。そして、Transformオブジェクトは、DisplayObject.transformプロパティから取得します。Transform.matrix3Dについては前述「インスタンスを3次元変換行列で伸縮・回転したい」、DisplayObject.transformプロパティとTransformクラスについては前述「インスタンスに着色したい」をご参照ください。

→関連項目
インスタンスを3次元変換行列で伸縮・回転したい」「インスタンスに着色したい

Matrix3Dクラス
パッケージ flash.geom
継承 Matrix3D → Object
prepend()メソッド ASタイプ M
ランタイムバージョン AIR 1.5/Flash Player 10
文法 prepend(prependMatrix3D:Matrix3D):void
意味 インスタンスにMatrix3Dオブジェクトを最初の変換として加える。
引数 prependMatrix3D:Matrix3D…最初の変換として加えるMatrix3Dオブジェクト。
戻り値 なし。
append()メソッド ASタイプ M
ランタイムバージョン AIR 1.5/Flash Player 10
文法 append(appendMatrix3D:Matrix3D):void
意味 インスタンスにMatrix3Dオブジェクトの変換を後から加える。
引数 appendMatrix3D:Matrix3D…変換を後から加えるMatrix3Dオブジェクト。
戻り値 なし。
clone()メソッド ASタイプ M
ランタイムバージョン AIR 1.5/Flash Player 10
文法 clone():Matrix3D
意味 Matrix3Dインスタンス複製して、新たなオブジェクトとして返す。
引数 なし。
戻り値 複製された新たなMatrix3Dインスタンス。
invert()メソッド ASタイプ M
ランタイムバージョン AIR 1.5/Flash Player 10
文法 invert():Boolean
意味 参照したMatrix3Dインスタンスの変換を反転させる。反転したMatrix3Dインスタンスは、もとのオブジェクトとは逆の変換を表す。
引数 なし。
戻り値 変換行列が正しく反転できると、trueを返す。変換行列が反転できない場合にはfalseが返される。

※変換行列は乗算
変換行列による座標変換は、行列の乗算として表されます。行列の掛け算は、交換法則が成立ちません。つまり、掛ける順序を変えると、変換結果が異なります。乗算の左側が座標空間を変換する行列で、右側が変換される座標空間(行列またはベクトル)になります。

[変換する行列]×[変換される座標空間]

したがって、最初に加える変換行列は掛け算の右側に、後から加える変換の行列は左側になります。

記述例
以下のスクリプト06-15-01は、タイムラインに配置した矩形のMovieClipインスタンスmy_mcを3次元座標空間で、インスタンスの基準点からマウスポインタの位置に応じて、水平および垂直に回転させます(図06-15-01)。

インスタンスの基準点を中心に回転させるため、一旦親タイムラインの基準点に移動し、回転の変換後にもとの位置に戻します。親タイムラインの基準点への移動と、もとの位置へ戻る変換行列はつねに変わらないので、予め変数(toParentMatrix3DおよびtoSelfMatrix3D)に設定しておきます。後者のもとの位置へ戻る変換は、Matrix3D.invert()メソッドで前者の変換を反転します。ただし、前者の変換行列も保持しなければならないので、Matrix3D.clone()メソッドでMatrix3Dインスタンスを複製しておきます。

DisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)のリスナー関数xRotate()では、インスタンスの基準点からマウスポインタの位置により水平および垂直の回転度数を計算し、Matrix3D.append()メソッドで一旦親タイムラインの基準点に移動したうえで、Matrix3D.appendRotation()メソッドにより水平および垂直の回転を加え、その後もとの位置に戻しています(Matrix3D.append())。これらの処理内容については、前述「3次元変換行列でインスタンスに複数の変換を加えたい」をご参照ください。

→関連項目
3次元変換行列でインスタンスに複数の変換を加えたい

スクリプト06-15-01■インスタンスをマウスポインタの位置に応じて3次元空間で水平・垂直に回転させる

// フレームアクション
var nX:Number = my_mc.x;
var nY:Number = my_mc.y;
var nSensitivity:Number = 0.2;
my_mc.z = 0;
var myMatrix3D:Matrix3D = my_mc.transform.matrix3D;
var toParentMatrix3D:Matrix3D = new Matrix3D();
toParentMatrix3D.appendTranslation(-nX, -nY, 0);
var toSelfMatrix3D:Matrix3D = toParentMatrix3D.clone();
toSelfMatrix3D.invert();
stage.addEventListener(Event.ENTER_FRAME, xRotate);
function xRotate(eventObject:Event):void {
  myMatrix3D.append(toParentMatrix3D);
  myMatrix3D.appendRotation((mouseX - nX) * nSensitivity, Vector3D.Y_AXIS);
  myMatrix3D.appendRotation(-(mouseY - nY) * nSensitivity, Vector3D.X_AXIS);
  myMatrix3D.append(toSelfMatrix3D);
}

図06-15-01■インスタンスの基準点からマウスポインタの位置に応じて上下左右に回転させる【06_14_Matrix3D_appendRotation_002.png】


作成者: 野中文雄
ドラフト作成: 2009年6月30日


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