flash on 2010-12-25

by hacker_o5nv66b6
Copyright hacker_o5nv66b6 ( http://wonderfl.net/user/hacker_o5nv66b6 )
MIT License ( http://www.opensource.org/licenses/mit-license.php )
Downloaded from: http://wonderfl.net/c/tpeQ

Vectorvision3DがPV3Dに統合されたらしいと。
ただ、Word3D → text3Dと、VectorShapeMaterial → Letter3DMaterial となってる。
ここ以外はたぶん同じ。
♥0 | Line 185 | Modified 2010-12-25 12:44:52 | MIT License
play

ActionScript3 source code

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

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

// forked from hacker_o5nv66b6's forked from: forked from: forked from: PV3Dその3
// forked from hacker_o5nv66b6's forked from: forked from: PV3Dその3
// forked from albatrus_jp's forked from: PV3Dその3
// forked from sake's PV3Dその3
/*
    Vectorvision3DがPV3Dに統合されたらしいと。
    ただ、Word3D → text3Dと、VectorShapeMaterial → Letter3DMaterial となってる。
    ここ以外はたぶん同じ。
*/

package
{
    import caurina.transitions.Tweener;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.filters.BlurFilter;
    import flash.utils.setInterval;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.materials.special.Letter3DMaterial;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.typography.Text3D;
    import org.papervision3d.typography.fonts.HelveticaBold;
    import org.papervision3d.typography.fonts.HelveticaLight;
    import org.papervision3d.typography.fonts.HelveticaMedium;
    import org.papervision3d.typography.fonts.HelveticaRoman;
    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.view.layer.ViewportLayer;
     import flash.display.Sprite;
    import flash.display.Loader;
    import flash.display.BitmapData;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Rectangle;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import caurina.transitions.Tweener;
    import caurina.transitions.properties.TextShortcuts;
    import flash.net.*;
    import flash.system.LoaderContext;

    [SWF(width="850", height="160", backgroundColor="0x000000", frameRate="40")]
    public class PV3D_sample03 extends Sprite
    {
        private var container:Sprite;
        private var viewport:Viewport3D;
        private var scene:Scene3D;
        private var camera:Camera3D;
        private var render:BasicRenderEngine;
        private var rootNode:DisplayObject3D;
        private var words1:Text3D;
        private var words2:Text3D;
        private var words3:Text3D;
        private var theta:Number;
        private var delayTime:Number;
        private var WordMoveType:Number;

        private const zoom:Number=20;
        private const focus:Number=30;
        private const distance:Number=600;

        public function PV3D_sample03()
        {   
            theta=0;
            WordMoveType=0;
            delayTime=0;

            container=new Sprite();
            addChild(container);
            container.x=604;
            container.y=stage.stageHeight / 2;

            viewport=new Viewport3D(0, 0, true, true);
            scene=new Scene3D();
            camera=new Camera3D();
            render=new BasicRenderEngine();
            rootNode=scene.addChild(new DisplayObject3D("rootNode"));
            addChild(viewport);
            camera.target=DisplayObject3D.ZERO; 
            camera.zoom=zoom;
            camera.focus=focus;

            var mat:Letter3DMaterial=new Letter3DMaterial();
            mat.fillColor=0xB22323;
            mat.doubleSided=true;
            mat.doubleSided=mat.interactive=true;
            words1=new Text3D("olivia", new HelveticaBold(), mat);
            words2=new Text3D("Love to you", new HelveticaRoman(), mat);
            words3=new Text3D("Rich time to you...", new HelveticaLight(), mat);
            rootNode.addChild(words1);
            rootNode.addChild(words2);
            rootNode.addChild(words3);
            words1.y=50;
            words2.y=0;
            words3.y=-50;
            words1.scale=words2.scale=words3.scale=0.4;

            dispersionWords(words1);
            dispersionWords(words2);
            dispersionWords(words3);
            setInterval(moveWords, 10000);
            addEventListener(Event.ENTER_FRAME, onFrame);
        }

        private function dispersionWords(words:Text3D):void
        {
            for each(var word:DisplayObject3D in words.letters)
            {
                word.extra={x:word.x, y:word.y, z:word.z};
                word.x=word.y=word.z=word.scale=0;
                Tweener.addTween(word, {scale:1,
                                        x:Math.random() * 2000 - 1000, 
                                        y:Math.random() * 2000 - 1000, 
                                        z:Math.random() * 2000 - 1000, 
                                        rotationX:Math.random() * 360, 
                                        rotationY:Math.random() * 360, 
                                        rotationZ:Math.random() * 360, 
                                        time:1, 
                                        delay:2 * Math.random() + 1});
            }
        }

        private function moveWords():void
        {
            if (WordMoveType % 2 == 0)
            {
               addEventListener(Event.ENTER_FRAME, onMyFadeOut);
               rootNode=scene.addChild(new DisplayObject3D("rootNode"));
               rootNode.RemoveChild(words1);
/*                resetWords(words1);
                resetWords(words2);
                resetWords(words3);
                delayTime=0;
                WordMoveType++;*/
            }
            else
            {
                
                
                //breakWords(words1);
                //breakWords(words2);
                //breakWords(words3);
                //WordMoveType++;
            }
        } 

        private function resetWords(words:Text3D):void
        {
            for each(var word:DisplayObject3D in words.letters)
            {
                Tweener.addTween(word, 
                                 {x:word.extra.x,
                                  y:word.extra.y,
                                  z:word.extra.z,
                                  rotationX:0,
                                  rotationY:0,
                                  rotationZ:0,
                                  time:1,
                                  transition:"easeOutBounce",
                                  delay:delayTime});
                Tweener.addTween(word,
                                {rotationY:720, 
                                time:1, 
                                delay:delayTime + 2});
                delayTime+=0.1;
            }
        }

/*        private function breakWords(words:Text3D):void
        {
            for each(var word:DisplayObject3D in words.letters)
            {
                Tweener.addTween(word,
                                {x:Math.random() * 2000 - 1000,
                                 y:Math.random() * 2000 - 1000, 
                                 z:Math.random() * 2000 - 1000, 
                                 rotationX:Math.random() * 360, 
                                 rotationY:Math.random() * 360, 
                                 rotationZ:Math.random() * 360, 
                                 time:1, 
                                 delay:3 * Math.random()});
            }
        }
*/        //EventListenerの処理。
        private function onFrame(e:Event):void
        {
            //cameraを位置を設定
            camera.x=distance * Math.sin(theta * Math.PI / 180);
            camera.z=distance * Math.cos(theta * Math.PI / 180);
            theta+=0.2;

            setBlur(words1);
            setBlur(words2);
            render.renderScene(scene, camera, viewport);
        }

        private function DistanceFromCamera(obj:DisplayObject3D):Number
        {
            var vecX:Number=obj.sceneX - camera.x;
            var vecY:Number=obj.sceneY - camera.y;
            var vecZ:Number=obj.sceneZ - camera.z;
            //cameraとsceneと距離を出している
            return Math.sqrt((vecX * vecX) + (vecY * vecY) + (vecZ * vecZ));
        }

        private function setBlur(words:Text3D):void
        {
            for each(var word:DisplayObject3D in words.letters)
            {
                //ViewportLayerを利用すれば、フィルターを利用できます。
                var vpl:ViewportLayer=word.createViewportLayer(viewport, true);
                
                var d:Number=Math.abs(DistanceFromCamera(word) - distance) / 40;
                vpl.filters=[new BlurFilter(d, d, 1)];
            }
        }
        //フェードイン
        public function onMyFadeIn(event:Event):void {
            event.target.alpha += 1 / (3 * this.parent.stage.frameRate);
            if (event.target.alpha >= 1) {
                event.target.removeEventListener(Event.ENTER_FRAME, onMyFadeIn);
            }
        }
        public function onMyFadeOut(event:Event):void {
            event.target.alpha -= 1 / (3 * this.parent.stage.frameRate);
            if (event.target.alpha <= 0) {
                            var myLoader:Loader = new Loader();
            var lc:LoaderContext = new LoaderContext();
            var myRequest:URLRequest = new URLRequest("http://broski.sakura.ne.jp/test/job/image/ko.jpg");
            lc.checkPolicyFile = true;
            myLoader.load(myRequest, lc);
            myLoader.alpha = 0;
            myLoader.addEventListener(Event.ENTER_FRAME, onMyFadeIn);
            addEventListener(Event.ENTER_FRAME, onMyFadeIn);
            addChild(myLoader);

                event.target.removeEventListener(Event.ENTER_FRAME, onMyFadeOut);
            }
        }

    }
}