スポンサーサイト

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

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

[ActionScript 3.0] 球

2007-11-26 | 20:16

前回と同じく面の法線ベクトルと光源への方向ベクトルを使って面の明るさを求めて、凹凸を表現してみる。
今回は球。
クリックすると光源の位置が変わって再描画されます。

package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;

    import org.papervision3d.core.*;    
    [SWF(width="400", height="400", backgroundColor="#ffffff")]
        public class Bump2 extends Sprite
        {
            private var bmd:BitmapData;
            private var center:Number3D;
            private var radius:int;
            public function Bump2()
            {
                stage.frameRate = 5;
                radius = stage.stageWidth/2*0.6;
                center = new Number3D(stage.stageWidth/2,radius,stage.stageHeight/2);

                bmd = new BitmapData( stage.stageWidth,stage.stageHeight,false,0xffffff);
                addChild(new Bitmap(bmd));

                render(new Point(stage.stageWidth/2, stage.stageWidth/2));
                stage.addEventListener (MouseEvent.CLICK, function(e:*):void{
                        render(new Point(stage.mouseX, stage.mouseY)); });
            }

            private function render(p:Point):void{
                for(var x:int = 0 ; x < stage.stageWidth ; x++){
                    for(var z:int = 0 ; z < stage.stageHeight ; z++){
                        var n:Number3D;
                        var xx:int = x-center.x;
                        var zz:int = z-center.z;
                        if(Math.sqrt(xx*xx+zz*zz) > radius)
                            n = new Number3D(0,1,0);
                        else{
                            // x,zに対応するy
                            var y:Number = Math.sqrt(radius*radius - xx*xx + zz*zz) + radius;
                            // x,y,zの法線ベクトル
                            n= new Number3D(xx, y, zz);
                            n.normalize();
                        }

                        var light:Number3D = new Number3D(p.x - x, 600 , p.y - z);
                        light.normalize();
                        var shadow:Number = Number3D.dot(n,light);

                        bmd.setPixel(x,z,
                                (0x1*shadow << 16) + (0x1*shadow <<8) + 0xff*shadow);
                    }
                }
            }
        }
}

全てのピクセルを描画し直しているので遅い。
球の表面の法線ベクトルは、その点の座標から球の中心の座標を引けばよい

スポンサーサイト

Comment

Post a comment

Secret

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