サイトトップ

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

Flash ActionScript 3.0 Reference

◎06 幾何

☆13 ★インスタンスを3次元変換行列で伸縮・回転したい

解説
Matrix3Dクラスを使うと、DisplayObjectインスタンスの3次空間における平行移動や伸縮、回転、傾斜などの変形ができます。Matrix3Dクラスは、3次元の座標空間を別の3次元の座標空間に変換する4行×4列の行列で表されます(図06-13-01)。この行列は「変換行列」とか「変換マトリックス」(transformation matrix)と呼ばれます。

図06-13-01■Matrix3Dオブジェクトが表す変換行列

[編集者向け注釈] 図は[ヘルプ]から引用したものなので、イラストもしくは表組などで再作成してください。

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

→関連項目
インスタンスに着色したい

インスタンスの平行移動や伸縮、回転などの変換を行うには、Matrix3Dクラスのメソッドを使います。拡大・縮小や回転をMatrix3Dオブジェクトの最初の変換として行うには、Matrix3D.prependScale()あるいはMatrix3D.prependRotation()を使います。

Transformクラス
パッケージ flash.geom
継承 Transform → Object
matrix3Dプロパティ ASタイプ P
ランタイムバージョン AIR 1.0/Flash Player 9
文法 matrix:Matrix
意味 インスタンスのもつMatrixオブジェクトの参照を示す。
プロパティ値 インスタンスの2次元平面における平行移動や伸縮、回転などの座標変換を表すMatrixオブジェクトの参照。

Matrix3Dクラス
パッケージ flash.geom
継承 Matrix3D → Object
prependRotation()メソッド ASタイプ M
ランタイムバージョン AIR 1.5/Flash Player 10
文法 prependRotation(degrees:Number, axis:Vector3D, pivotPoint:Vector3D = null):void
意味 インスタンスに加える回転をMatrix3Dオブジェクトの最初の変換として追加する。
引数 degrees:Number…回転を加える角度の度数値。/axis:Vector3D…回転の軸または方向。xyz軸は、それぞれ定数Vector3D.X_AXIS、Vector3D.Y_AXIS、Vector3D.Z_AXISで指定する。/pivotPoint:Vector3D (デフォルト = null(指定なし))…回転の中心を示す3次元座標。
戻り値 なし。
prependScale()メソッド ASタイプ M
ランタイムバージョン AIR 1.5/Flash Player 10
文法 prependScale(xScale:Number, yScale:Number, zScale:Number):void
意味 インスタンスの水平/垂直/奥行き方向の拡大・縮小をMatrixオブジェクトの最初の変換として加える。
引数 xScale:Number…水平方向に拡大・縮小として乗じる比率。/yScale:Number…垂直方向に拡大・縮小として乗じる比率。/zScale:Number…垂直方向に拡大・縮小として乗じる比率。
戻り値 なし。

※最初の変換として加えるメソッド
Matrix3D.prependScale()あるいはMatrix3D.prependRotation()は、伸縮や回転をMatrix3Dオブジェクトの最初の変換として加えるメソッドです。これに対して、同様の変換をMatrix3Dオブジェクトの最後に加えるメソッドとして、Matrix3D.appendScale()あるいはMatrix3D.appendRotation()があります。

DisplayObjectインスタンスは、位置が親タイムラインの基準点、拡大・縮小は1.0(実寸100%)、回転角は0度の状態をデフォルトとします。そのインスタンスがMatrix3Dオブジェクトをもつと、デフォルトのインスタンスにそのオブジェクトの変換が加えられて、タイムラインに表示されます。最初の変換として加えるメソッドは、インスタンスがもつMatrix3Dオブジェクトの変換の前に適用されます。

記述例
以下のスクリプト06-13-01は、タイムラインに配置した矩形のMovieClipインスタンスmy_mcを3次元座標空間で、上下左右の矢印キーにより拡大・縮小あるいは回転させます(図06-13-02)。InteractiveObject.keyDownイベント(定数KeyboardEvent.KEY_DOWN)のリスナー関数xTransform()では、左右の矢印キーを押すとMatrix3D.appendRotation()でその方向にy軸で回転し、上下の矢印キーでMatrix3D.appendScale()を用いて拡大・縮小します。

スクリプト06-13-01■矢印キーによりインスタンスを3次元空間で拡大・縮小あるいは回転させる

// フレームアクション
var nRotation:Number = 10;
var nScaleUp:Number = 1.05;
var nScaleDown:Number = 0.95;
my_mc.z = 0;
var myMatrix3D:Matrix3D = my_mc.transform.matrix3D;
stage.addEventListener(KeyboardEvent.KEY_DOWN, xTransform);
function xTransform(eventObject:KeyboardEvent):void {
  switch (eventObject.keyCode) {
    case Keyboard.LEFT :
      myMatrix3D.prependRotation(nRotation, Vector3D.Y_AXIS);
      break;
    case Keyboard.RIGHT :
      myMatrix3D.prependRotation(-nRotation, Vector3D.Y_AXIS);
      break;
    case Keyboard.UP :
      myMatrix3D.prependScale(nScaleUp, nScaleUp, 1);
      break;
    case Keyboard.DOWN :
      myMatrix3D.prependScale(nScaleDown, nScaleDown, 1);
      break;
  }
}

図06-13-02■矢印キーでインスタンスを回転および拡大・縮小する【06_13_Matrix3D_prependRotation_001.png】

※Matrix3D.prependScale()メソッドは拡大・縮小の比率を乗じる
Matrix3D.prependRotation()メソッドは、現在の角度に引数の角度を加えます。それに対して、Matrix3D.prependScale()メソッドは現在のスケール(実寸を1.0とする比率)に引数の比率を乗じます。したがって、前掲スクリプト06-13-01で、拡大(×1.05)後に縮小(×0.95)しても、もとに戻らない(1.05×0.95 = 0.9975)ことにご注意ください。


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


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