fc2ブログ

[ActionScript] Matrix3D

2010-04-19 | 16:31

長い間ActionScriptを触ってないうちに3次元マトリックスを扱えるようになっていたらしい。

(150,0,0)にある垂直軸を中心に回転しているように見せるために、
1. (0,0,Z)に移動(Zは回転半径)
2. Y軸中心に回転
3. (150,Y,0)に移動
という行列を順番に適用している。
(この例ではスプライトが重ならないようにしてあるが、重なる場合はZオーダーを考慮しないと視覚的に不自然になる)
package {
        import flash.display.*;
        import flash.events.*;
        import flash.geom.*;
        [SWF(width='400',height='400',backgroundColor='0xffffff',framerate='5')]
        public class Rotate3D extends Sprite {
                [Embed(source="lena.jpg")]
                private var myImage:Class;
                private var container:Sprite;
                private var container2:Sprite;
                private var bm:Bitmap = new myImage();
                private var bm2:Bitmap = new myImage();
                private var m:Matrix3D = new Matrix3D();
                public function Rotate3D( ) {
                    container = new Sprite();
                    container.addChild(bm);
                    container2 = new Sprite();
                    container2.addChild(bm2);
                    addChild(container);
                    addChild(container2);
                    addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
                public function onEnterFrame(event:Event):void {
                       m.prependRotation(3, Vector3D.Y_AXIS);
                       var temp:Matrix3D = m.clone();
                        var temp2:Matrix3D = m.clone();

                        var pos11:Matrix3D = new Matrix3D();
                        pos11.position = new Vector3D(0, 0, 150);
                        temp.prepend(pos11);
                        var pos12:Matrix3D = new Matrix3D();
                        pos12.position = new Vector3D(150, 200, 0);
                        temp.append(pos12);

                        var pos21:Matrix3D = new Matrix3D();
                        pos21.position = new Vector3D(0, 0, 50);
                        temp2.prepend(pos21);
                        var pos22:Matrix3D = new Matrix3D();
                        pos22.position = new Vector3D(150, 50, 0);
                        temp2.append(pos22);

                        container.transform.matrix3D = temp;
                        container2.transform.matrix3D = temp2;

                }
        }
}

スポンサーサイト



Comment

Post a comment

Secret