fc2ブログ

[ActionScript 3.0] transform.matrixの操作だけで画像を3D回転

2008-01-10 | 20:24

(3Dライブラリ等を使用せず)transform.matrixの操作だけで画像を3D回転させています。
(マウス位置によって回転軸は変わります。回転していない場合はマウスを絵の上に持っていってください。)

やっていることは単純で、回転後の基底ベクトルを求めて、(固有値が1になるように補正した後)transform.matrixに設定しているだけです。

package {
        import flash.display.*;
        import flash.events.*;
        import flash.geom.*;
        [SWF(width='300',height='300',backgroundColor='0xffffff',framerate='5')]
        public class RotationMatrix extends Sprite {
                [Embed(source="lena.jpg")]
                private var myImage:Class;
                private var bm:Bitmap = new myImage();
                private var rad:Number = 0;
                public function RotationMatrix( ) {
                        addChild(bm);
                        bm.x = bm.y = 100;
                        addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
                public function onEnterFrame(event:Event):void {
                        if( stage.mouseX < 0 || stage.mouseX > 300 || stage.mouseY < 0 || stage.mouseY > 300)
                        return;
                        // マウス位置を元に回転軸のベクトルを決める
                        var vx:Number = stage.mouseX - 100;
                        var vy:Number = stage.mouseY - 100;
                        var len:Number = Math.sqrt(vx*vx + vy*vy);
                        vx /= len;
                        vy /= len;
                        
                        rad += 0.1;
                        // 回転後の基底を求めて変形行列に設定
                        var m:Matrix = bm.transform.matrix;
                        m.a = (1-Math.cos(rad))*vx*vx + Math.cos(rad);
                        m.b= (1-Math.cos(rad))*vx*vy ;
                        m.c = (1-Math.cos(rad))*vx*vy;
                        m.d = (1-Math.cos(rad))*vy*vy + Math.cos(rad);
                        
                        // 変形行列の固有値を1にするため(大きさを変えないため)の係数
                        var s:Number = vx / (m.a*vx + m.b*vy);
                        m.a *= s;
                        m.b *= s;
                        m.c *= s;
                        m.d *= s;
                        bm.transform.matrix = m;
                }
        }
}


「線形代数を勉強したいが、固い教科書は嫌だ」という人におすすめ。
スポンサーサイト



Comment

Post a comment

Secret