スポンサーサイト

-------- | --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ActionScript 3.0] DisplacementMapFilterで虫眼鏡効果

2007-11-11 | 08:06

マウスを絵の上に持ってくると、その部分が虫眼鏡で見ているように少し拡大されます。 (一回クリックしてフォーカスを移してください)

モナリザの絵の右側にあるのが使用しているマップ画像です。
マウスを動かすごとにマウス位置にそのマップ画像のフィルタを適用するように してあります。

ソース
package {
    import flash.display.*;
    import flash.filters.*;
    import flash.events.*;
    import flash.geom.*;
    [SWF(width='500',height='600',backgroundColor='0xffffff')]
        public class Main extends Sprite {
            [Embed(source="monalisa.jpg")]
                private var myImage:Class;
            private var bm:Bitmap;
            private var radius:int = 80;
            private var filter:BitmapData;
            private var fbd:Bitmap=null;
            public function Main( ) {
                bm = new myImage();
                addChild(bm);

                // DisplacementMapFilter用のビットマップデータ作成
                filter = createMap(radius, radius);

                // DisplacementMapFilter用のビットマップを表示(単に見せているだけ)
                fbd = new Bitmap(filter);
                fbd.x = bm.width;
                addChild(fbd);

                stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            }

            private function onMouseMove(e:MouseEvent):void{
                // DisplacementMapFilterを作成
                var f:DisplacementMapFilter = new DisplacementMapFilter(filter,
                        new Point(stage.mouseX - radius/2,stage.mouseY-radius/2),
                        BitmapDataChannel.RED,BitmapDataChannel.BLUE, 100,100,"color",0x0);
                // フィルタを適用
                bm.filters = [f];
            }

            private function createMap(width:int, height:int):BitmapData{
                var bmp:BitmapData = new BitmapData(width, height, false, 0xffffff);
                for(var j:int = 0; j < height; j++){
                    for(var i:int = 0; i < width; i++){
                        var ii:int = i - width/2;
                        var jj:int = j - height/2;
                        var distance:Number = Math.sqrt(ii*ii+jj*jj);
                        if(distance > width/2)
                            bmp.setPixel(i,j,(128<<16)+ 128);
                        else{
                            var colR:int = 128 + (-i/2.0 + width/4);
                            var colB:int = 128 + (-j/2.0 + height/4);
                            bmp.setPixel(i, j, (colR << 16) + colB);
                        }
                    }
                }
                return bmp;
            }
        }
}


スポンサーサイト

Comment

Post a comment

Secret

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。