スポンサーサイト

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

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

[ActionScript 3.0] スポットライト

2007-11-13 | 20:24

マウスを 下のウィンドウの上に持ってくると、マウス位置にスポットライトが当たっているようになります。
(一回クリックしてフォーカスを移してください)

「ゲームプログラミングのための3Dグラフィックス数学」によると スポットライトが点Pに置かれており、スポット方向がUである時、空間上の点Qに到達する光の強度は

C' = C * ( max{-U・L,0}^p ) / ( c + l*d + q*d*d)

C : 光の強度
c : 一定減衰定数
l : 1次減衰定数
q : 2次減衰定数
d : 光源からQまでの距離

これを元に 最初に一度だけスポットライト画像を作っておき、マウス位置に重ねるようにしてある。
(ブレンドモードをBlendMode.MULTIPLYにしておく)

package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    [SWF(width='400',height='550',backgroundColor='0x0')]
        public class SpotLight2 extends Sprite {
            [Embed(source="monalisa.jpg")]
                private var myImage:Class;
            private var original:Bitmap;
            private var bm:Bitmap;字

            private var bmLight:Bitmap;

            public function SpotLight2() {
                this.blendMode = BlendMode.LAYER;

                // オリジナルの絵
                original = new myImage();

                // オリジナルの絵と同じ大きさの黒いビットマップ
                var bmd:BitmapData = new BitmapData(original.width, original.height, false, 0x0);
                bm = new Bitmap(bmd);
                addChild(bm);

                bmLight = new Bitmap(light(10, 200,200));
                bmLight.blendMode = BlendMode.MULTIPLY;
                addChild(bmLight);

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

            private function onMouseMove(e:MouseEvent):void{
                var x:int = stage.mouseX - bmLight.width/2;
                var y:int = stage.mouseY - bmLight.height/2;

                // いったん全体を黒く塗りつぶす
                bm.bitmapData.fillRect(new Rectangle(0,0,bm.width,bm.height), 0);

                // オリジナルの絵の該当部分をピクセルコピー
                bm.bitmapData.copyPixels(original.bitmapData, new Rectangle(x,y,200,200), new Point(x,y));

                // スポットライトを重ねる
                bmLight.x = x;
                bmLight.y = y;
            }

            private function light(p:int, w:int, h:int):BitmapData{
                trace(p.toString());
                // distance from light
                var df:int = 100;
                // 一定減衰定数
                var kc:Number = 0.8;
                // 1次減衰定数
                var kl:Number = 0.9;
                // 2次減衰定数
                var kq:Number = 0.9;
                // 最大の強度
                var max:Number = Math.pow(df*df/df ,p) / (kc + kl*df + kq*df*df) ;

                var bmd:BitmapData = new BitmapData(w,h);
                for(var j:int = 0; j < w; j++){
                    for(var i:int = 0; i < w; i++){
                        var ii:int = i - w/2;
                        var jj:int = j - h/2;
                        var d:Number = Math.sqrt(ii*ii+jj*jj+df*df);

                        var cc:Number = Math.pow(df*df/d ,p) / (kc + kl*d + kq*d*d) ;
                        var c:Number = cc / max;
                        trace(c.toString());

                        bmd.setPixel(i,j, (c*255 << 16) + (c*255 << 8) + c*255);
                    }
                }

                return bmd;
            }
        }
}
この本は結構高いんですが、それに見合う価値があります。
スポンサーサイト

Trackback


この記事にトラックバックする(FC2ブログユーザー)

ゲームプログラミング の情報を最新ブログで検索してみると…

ゲームプログラミングに関する情報を最新ブログやユーチューブ、通販商品から検索してマッシュアップしてみました。

Comment

Post a comment

Secret

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