flash on 2015-6-29

by insocium
♥0 | Line 129 | Modified 2015-06-29 17:42:52 | MIT License
play

ActionScript3 source code

/**
 * Copyright insocium ( http://wonderfl.net/user/insocium )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/lIfd
 */

package

{

    import away3d.cameras.lenses.PerspectiveLens;

    import away3d.containers.ObjectContainer3D;

    import away3d.containers.View3D;

    

    import away3d.entities.SegmentSet;

    import away3d.filters.RadialBlurFilter3D;

    import away3d.primitives.LineSegment;

    

    import flash.display.StageAlign;

    import flash.display.StageScaleMode;

    import flash.events.Event;

    import flash.geom.Vector3D;

    import flash.media.Sound;

    import flash.media.SoundChannel;

    import flash.net.URLRequest;

    import flash.utils.getTimer;

    

    [SWF(width="960",height="540",frameRate="60")]

    

    public class LinesSphereEx extends View3D

    {

        

        //----------------------------------------------------------

        //

        //   Static Property 

        //

        //----------------------------------------------------------

        

        private static const parameters:Array = [[0.3, 0x0088FF, 1, 5, 1500],

        [0.1, 0x0099DD, 1, 2, 2000], 

        [0.7, 0x0066CC, 0.75, 1, 16000],

        [1.24, 0x005599, 0.5, 1, 2000], 

        [1.25, 0x6633FF, 0.8, 1, 16000], 

        [3.0, 0x404040, 0.75, 2, 1000], 

        [3.5, 0x808080, 0.5, 1, 1000], 

        [4.5, 0x444444, 0.25, 1, 1000], 

        [5.5, 0x808080, 0.125, 1, 1000]];

        

        private static const r:Number = 450;

        

        //----------------------------------------------------------

        //

        //   Constructor 

        //

        //----------------------------------------------------------

        

        public function LinesSphereEx()

        {

            stage.scaleMode = StageScaleMode.NO_SCALE;

            stage.align = StageAlign.TOP_LEFT;

            

            antiAlias = 2;

            backgroundColor = 0x000000;

            (camera.lens as PerspectiveLens).far = 500000;

            

            sphere = new ObjectContainer3D();

            scene.addChild(sphere);

            

            var list:Array = [];

            for (var i:int = 0; i < 16000; ++i)

            {

                var vector1:Vector3D = translateGeoCoords(360 * Math.random(), 360 * Math.random(), r);

                

                var vector2:Vector3D = vector1.clone();

                vector2.scaleBy(Math.random() * 0.1 + 1);

                

                list.push([vector1, vector2]);

            }

            

            for (i = 0; i < parameters.length; ++i)

            {

                var p:Array = parameters[i];

                

                var lines:SegmentSet = new SegmentSet();

                if (i < 4)

                    sphere.addChild(lines);

                else

                    scene.addChild(lines);

                

                lines.scaleX = lines.scaleY = lines.scaleZ = p[0];

                lines.rotationY = Math.random() * 360;

                

                for (var j:int = 0; j < p[4]; j++)

                {

                    var color:uint = ((0xFF * p[2]) << 24) + p[1];

                    

                    lines.addSegment(new LineSegment(list[j][0], list[j][1], color, 0x0, p[3]));

                }

                

                orijinalScales[i] = p[0];

                lineSegments[i] = lines;

            }

            

            // load music

            var sound:Sound = new Sound(new URLRequest("http://198.101.15.90:8166/live"));

            soundChannel = sound.play(0, int.MAX_VALUE);

            

           

            addEventListener(Event.ENTER_FRAME, enterFrameHandler);

            stage.addEventListener(Event.RESIZE, resizeHandler);

            resizeHandler(null);

        
        }

        

        //----------------------------------------------------------

        //

        //   Property 

        //

        //----------------------------------------------------------

        

        private var cameraZ:Number = 1;

        private var inited:Boolean = false;

        private var lineSegments:Array = [];

        private var orijinalScales:Vector.<Number> = new Vector.<Number>();

        private var rotY:Number = 0;

        private var rotZ:Number = 0;

        private var soundChannel:SoundChannel;

        private var sphere:ObjectContainer3D;

        

        //----------------------------------------------------------

        //

        //   Function 

        //

        //----------------------------------------------------------

        

        private function resizeHandler(e:Event):void

        {

            this.width = stage.stageWidth;

            this.height = stage.stageHeight;

            

            var distance:Number = Vector3D.distance(new Vector3D(-1000, 500, 500), new Vector3D(0, 0, 0));

            (camera.lens as PerspectiveLens).fieldOfView = 2 * Math.atan2(Math.sqrt(this.width * this.width + this.height * this.height) / 2, distance) * 180 / Math.PI;

        }

        

        private function enterFrameHandler(ev:Event):void

        {

            if (!inited)

            {

                filters3d = [new RadialBlurFilter3D(6, 1.8, 1.0, -0.4)]

                inited = true;

            }

            

            var volume:Number = (soundChannel.leftPeak + soundChannel.rightPeak) / 2;

            

            // rotation move

            rotZ += (soundChannel.leftPeak - 0.2) * 0.04;

            rotY += (soundChannel.rightPeak - 0.1) * 0.05;

            

            sphere.scaleX = sphere.scaleY = sphere.scaleZ = cameraZ;

            

            var time:Number = getTimer();

            

            const speed:Array = [3, 4, 4.5, 1.5, 2, -2, 1, -1, 1, 1, 1, 1];

            

            for (var i:int = 0; i < lineSegments.length; i++)

            {

                var obj:SegmentSet = lineSegments[i] as SegmentSet;

                

                if (i < 5)

                {

                    obj.rotationY += (rotY * 180 / Math.PI * speed[i] - obj.rotationY) * 0.05;

                    obj.rotationX += ((rotZ + rotY) * 0.3 * 180 / Math.PI * speed[i] - obj.rotationX) * 0.05;

                }

                

                if (i < 5)

                    obj.scaleX = obj.scaleY = obj.scaleZ = (orijinalScales[i] * (i / 2 + 1) * (1 + 0.5 * Math.sin(time / 1500)));

            }

            

            camera.x = 1600 * Math.sin(time / 2000);

            camera.z = 1600 * Math.cos(time / 2000);

            camera.lookAt(new Vector3D(0, 0, 0));

            

            render();

        }

        

        /**

         * 経度と緯度から位置を算出します。

         * @param latitude    緯度

         * @param longitude    経度

         * @param radius    半径

         * @return 位置情報

         */

        private function translateGeoCoords(latitude:Number, longitude:Number, radius:Number):Vector3D

        {

            const latitudeDegreeOffset:Number = 90;

            const longitudeDegreeOffset:Number = -90;

            

            latitude = Math.PI * latitude / 180;

            longitude = Math.PI * longitude / 180;

            

            latitude -= (latitudeDegreeOffset * (Math.PI / 180));

            longitude -= (longitudeDegreeOffset * (Math.PI / 180));

            

            var x:Number = radius * Math.sin(latitude) * Math.cos(longitude);

            var y:Number = radius * Math.cos(latitude);

            var z:Number = radius * Math.sin(latitude) * Math.sin(longitude);

            

            return new Vector3D(x, z, y);

        }

    }

}