ImageTube

package cn.ndl.test {
    import flash.display.Bitmap;
    import flash.display.GraphicsTrianglePath;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.display.TriangleCulling;
    import flash.events.Event;

    public class ImageTube extends Sprite {

        [Embed(source="http://www.cnblogs.com/../map.jpg")]
        private var imgClass:Class;

        private var ver:Vector.<Number>=new Vector.<Number>;
        private var ind:Vector.<int>=new Vector.<int>;
        private var uvt:Vector.<Number>=new Vector.<Number>;

        private var spr:Sprite;
        private var res:int=60;
        private var cols:int=20;
        private var row:int=20;

        private var centerZ:Number=200;
        private var fl:Number=1000;
        private var r:Number=400;

        private var bd:Bitmap;

        private var offset:Number=0;


        public function ImageTube() {
            super();
            stage.align=StageAlign.TOP_LEFT;
            stage.scaleMode=StageScaleMode.NO_SCALE;
            init();
        }

        private function init():void {
            spr=new Sprite;
            spr.x=400;
            spr.y=400;
            this.addChild(spr);

            bd=new imgClass;
            makeTriangles();
            draw();
            
        
            this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame(e:Event):void {
            /*spr.rotationX+=1;
            spr.rotationY+=1.2;
            spr.rotationZ+=1;
            */
            
            draw();
        }

        private function draw():void {

            offset+=.05;

            ver.length=0;
            uvt.length=0;

            trace("==============================================");

            for (var i:int=0; i < row; i++) {
                for (var j:int=0; j < cols; j++) {

                    var angle:Number=Math.PI * 2 / (cols - 1) * j;
                    var angle2:Number=Math.PI * i / (row - 1) - Math.PI / 2;
                    
                    //var angle:Number=Math.atan2(mouseY-spr.y,mouseX-spr.x);

                    var xpos:Number=Math.cos(angle + offset) * r * Math.cos(angle2);
                    //var ypos:Number=(i - row / 2) * res;
                    var ypos:Number=Math.sin(angle2) * r;
                    var zpos:Number=Math.sin(angle + offset) * r * Math.cos(angle2);

                    var sc:Number=fl / (fl + zpos + centerZ);

                    ver.push(xpos * sc, ypos * sc);
                    uvt.push(j / (cols - 1), i / (row - 1));

                    trace("ver:", xpos * sc, ypos * sc);
                    trace("uvt:", j / (cols - 1), i / (row - 1));
                }
            }



            spr.graphics.clear();
            spr.graphics.lineStyle(0, 0, .5);
            spr.graphics.beginBitmapFill(bd.bitmapData);
            spr.graphics.drawTriangles(ver, ind, uvt, TriangleCulling.NEGATIVE);
        }

        private function makeTriangles():void {
            for (var i:int=0; i < row; i++)
                for (var j:int=0; j < cols; j++) {

                    var angle:Number=Math.PI * 2 / (cols - 1) * j;

                    var xpos:Number=Math.cos(angle) * r;
                    var ypos:Number=(i - row / 2) * res;
                    //var ypos:Number=i * res;
                    var zpos:Number=Math.sin(angle) * r;

                    var sc:Number=fl / (fl + zpos + centerZ);
                    ver.push(xpos * sc, ypos * sc);
                    uvt.push(j / (cols - 1), i / (row - 1));
                    //uvt.push(sc);

                    if (j < cols - 1 && i < row - 1) {
                        ind.push(i * cols + j, i * cols + j + 1, i * cols + j + 1 + cols);
                        ind.push(i * cols + j + 1 + cols, i * cols + j + cols, i * cols + j);
                    }
                }
        }



    }
}
posted @ 2012-06-29 18:18  ndljava  阅读(86)  评论(0)    收藏  举报