forked from: 3D tag cloud from Flex

by akagamirei forked from 3D tag cloud (diff: 63)
Flexでできないか確認
♥0 | Line 108 | Modified 2011-06-29 13:43:37 | MIT License
play

ActionScript3 source code

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

<?xml version="1.0" encoding="utf-8"?>
<s:Application  xmlns:fx="http://ns.adobe.com/mxml/2009"
                 xmlns:s="library://ns.adobe.com/flex/spark"
                 xmlns:mx="library://ns.adobe.com/flex/mx"
                 creationComplete="ccInit()">
    <fx:Declarations>
        <!-- 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 -->
    </fx:Declarations>
    
    <fx:Script>
        <![CDATA[
            import flash.display.BitmapData;
            import flash.display.Sprite;
            import flash.events.Event;
            import flash.filters.BitmapFilterQuality;
            import flash.filters.BlurFilter;
            import flash.filters.GlowFilter;
            import flash.text.TextField;
            
            import mx.core.UIComponent;
            
            import org.papervision3d.core.geom.Particles;
            import org.papervision3d.core.geom.renderables.Particle;
            import org.papervision3d.events.InteractiveScene3DEvent;
            import org.papervision3d.materials.special.BitmapParticleMaterial;
            import org.papervision3d.objects.DisplayObject3D;
            import org.papervision3d.view.BasicView;

            private var scale:Number = 5;
            private var radius:Number = 350;
            private var smoothing:Boolean = true;
            private var minAlpha:Number = 0.3;
            private var glow:GlowFilter;
            private var tags:Array;
            private var tag_num:uint;
            private var bv:BasicView;
            private var tagArray:Array;
            private var tagContainer:DisplayObject3D;
            
            public function init():void{
                glow = new GlowFilter (0x003366, 1, 8, 8, 2, BitmapFilterQuality.LOW, true, false);
                
                tags = ["free","news","Cookie","practice","JavaScript","toy","life","something","LocalConnection","memo","MSN","funny", "ActionScript 3", "Food", "Book", "Photo", "favorite"];
                tag_num = tags.length;

                tagArray = [];
                tagContainer = new DisplayObject3D("tag_container");
                tagContainer.x = -radius * 0.25;
                tagContainer.y =  radius * 0.25;
                
                bv = new BasicView(myImage.width, myImage.height, true, true);
                bv.viewport.interactive = true;
                bv.camera.z = -2 * radius;
                bv.camera.zoom = 20;
                bv.scene.addChild(tagContainer);
                bv.startRendering();
                
                myImage.addChild(bv);
                
                buildTags();

                addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                addEventListener(Event.RESIZE, onResize);
            }

            public function ccInit():void{
                init();
            }
            
            private function buildTags():void {
                var i:uint;
                for (i = 0; i < tag_num; i++) {
                    // 2D TextからBitmapDataを作りmaterialとする
                    var txt:TextField = new TextField();
                    txt.text = tags[i];
                    txt.filters = [new BlurFilter(1.1, 1.1)];
                    var txtW:Number = txt.textWidth + 5;
                    var txtH:Number = txt.textHeight + 5;
                    var bitmap:BitmapData = new BitmapData(txtW, txtH, true, 0x01FFFFFF);
                    bitmap.draw(txt);
                    
                    var phi:Number = Math.acos((2 * (i + 1) - 1) / tag_num - 1);
                    var theta:Number = Math.sqrt(tag_num * Math.PI) * phi;
                    
                    // 3D
                    var material:BitmapParticleMaterial = new BitmapParticleMaterial(bitmap);
                    material.interactive = true;
                    material.smooth = smoothing;

                    var tag:Particle = new Particle(material, scale, 0, 0, 0);

                    var tagHolder:Particles = new Particles ("tag_");
                    tagHolder.addParticle(tag);
                    tagHolder.x = radius * Math.cos (theta) * Math.sin (phi);
                    tagHolder.y = radius * Math.sin (theta) * Math.sin (phi);
                    tagHolder.z = radius * Math.cos (phi);
                    tagHolder.useOwnContainer = true;
                    tagHolder.autoCalcScreenCoords = true;
                    tagHolder.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, objectOverHandler);
                    tagHolder.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, objectOutHandler);
                    //tagHolder.addEventListener (InteractiveScene3DEvent.OBJECT_PRESS, objectPressHandler);
                    
                    tagContainer.addChild(tagHolder);
                    tagArray.push(tagHolder);
                }
            }
            
            private function objectOverHandler(e:InteractiveScene3DEvent):void {
                bv.viewport.buttonMode = true;
                e.target.filters = [glow];
            }
            
            private function objectOutHandler(e:InteractiveScene3DEvent):void {
                bv.viewport.buttonMode = false;
                for (var j:uint = 0; j < tag_num; j++) {
                    tagArray[j].filters = [];
                }
            }
            
            private function enterFrameHandler(e:Event):void {
                tagContainer.rotationX += (mouseY - myImage.height * 0.5) * 0.01;
                tagContainer.rotationY += (mouseX - myImage.width * 0.5) * 0.01;
                
                for (var j:uint = 0; j < tag_num; j++) {
                    tagArray[j].alpha = minAlpha + (1 - minAlpha) * (1 - (tagArray[j].screen.z - radius) / (2 * radius));
                }

                //bv.camera.lookAt(tagContainer);
                //bv.singleRender();
            }

            //リサイズイベント
            private function onResize(e:Event):void {
            }

        ]]>
    </fx:Script>

    <mx:Image id="myImage" width="100%" height="100%" />
    
</s:Application>