サイトトップ

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

Flash ActionScript 3.0 Reference

◎06 幾何

☆14 ★3次元変換行列でインスタンスに複数の変換を加えたい

解説
Matrix3Dクラスの変換のメソッドは、ひとつのMatrix3Dオブジェクトに対して複数適用することができます。しかし、その場合には、変換の順序を意識しなければなりません。Matrix3D.prependRotation()メソッドによりy軸で60度水平に回転してから、同じくx軸で垂直に回転したとします。

すると、y軸で水平に60度回転したタイムライン上の状態から垂直に回転するのではなく、あたかもインスタンス自身のx軸で垂直に回ったように変換されます(図06-14-01)。これは、「最初の変換として加えるメソッド」であるMatrix3D.prependRotation()が、デフォルトつまり正面向き(回転角0)のインスタンスに適用されるからです(「インスタンスを3次元変換行列で伸縮・回転したい」の「※最初の変換として加えるメソッド」参照)。

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

図06-14-01■メインタイムラインでなくインスタンスのx軸で垂直回転する【06_14_Matrix3D_appendRotation_001.png】

メインタイムライン上のインスタンスの現行の変換の状態を保ったままさらに別の変換を加えるには、Matrix3Dクラスの後から変換を追加するメソッドで考えた方がよいでしょう。水平と垂直を組合わせた回転の例では、インスタンスの基準点のみを親タイムラインの基準点に移動し、必要な回転を加えてから、もとの位置に戻します。インスタンスに平行移動や回転の変換を後から加えるには、Matrix3D.prependScale()あるいはMatrix3D.prependRotation()を使います。

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

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

Matrix3Dクラス
パッケージ flash.geom
継承 Matrix3D → Object
appendRotation()メソッド ASタイプ M
ランタイムバージョン AIR 1.5/Flash Player 10
文法 appendRotation(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次元座標。
戻り値 なし。
appendTranslation()メソッド ASタイプ M
ランタイムバージョン AIR 1.5/Flash Player 10
文法 appendTranslation(x:Number, y:Number, z:Number):void
意味 インスタンスのxyz座標における移動の変換を後から加える。
引数 x:Number…x座標の移動ピクセル数。/y:Number…y座標の移動ピクセル数。/z:Number…z座標の移動ピクセル数。
戻り値 なし。

記述例
以下のスクリプト06-14-01は、タイムラインに配置した矩形のMovieClipインスタンスmy_mcを3次元座標空間で、インスタンスの基準点からマウスポインタの位置に応じて、水平および垂直に回転させます(図06-14-02)。DisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)のリスナー関数xRotate()では、インスタンスの基準点からマウスポインタの位置により水平および垂直の回転度数を計算し、Matrix3D.appendTranslation()メソッドで一旦親タイムラインの基準点に移動したうえで、Matrix3D.appendRotation()メソッドにより水平および垂直の回転を加え、その後もとの位置に戻しています(Matrix3D.appendTranslation())。

スクリプト06-14-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;
stage.addEventListener(Event.ENTER_FRAME, xRotate);
function xRotate(eventObject:Event):void {
  myMatrix3D.appendTranslation(-nX, -nY, 0);
  myMatrix3D.appendRotation((mouseX - nX)*nSensitivity, Vector3D.Y_AXIS);
  myMatrix3D.appendRotation(-(mouseY - nY)*nSensitivity, Vector3D.X_AXIS);
  myMatrix3D.appendTranslation(nX, nY, 0);
}

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


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


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