ちょびっと3Dを

ひさしぶりにちょびっとPaperVision3Dをしてみました。
こんな感じ
http://moeten.info/

今回使ったライブラリ

text3Dは現在のPaperVision3Dに含まれているので楽ちんです。
ただ、上記のビルド番号840なswcでないとダメっぽいので注意。
ソースはこちら
微妙に実際のとは違います。あとソース整理していないので、かなりきちゃないです(^-^;

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"
 backgroundImage="bg.jpg"
    >
<mx:Script>
<![CDATA[
    import mx.controls.Alert;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.typography.Text3D;
    import org.papervision3d.typography.fonts.HelveticaBold;
    import org.papervision3d.typography.Font3D;
    import org.papervision3d.materials.special.Letter3DMaterial;
    import org.papervision3d.typography.VectorLetter3D;
import org.papervision3d.core.math.Number3D;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import caurina.transitions.Tweener;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.core.effects.view.ReflectionView;
import org.papervision3d.objects.DisplayObject3D;
private var cameraTarget : DisplayObject3D;
private var camera:Camera3D;
private var scene:Scene3D;
private var render:BasicRenderEngine;
private var viewport:Viewport3D;
private var r:ReflectionView;
//初期化関数
private function init():void{
    r = new ReflectionView( myUI.width , myUI.height , true , true );
    r.viewportReflection.filters = [bf];
    r.surfaceHeight = -100;
    myUI.addChild(r);
    cameraTarget = new DisplayObject3D();
    hts.send();
}
private var planeArr:Array = new Array();
private var cnt:int = 0;
private function makePlane():void{
    this.addEventListener(Event.ENTER_FRAME , myTimer );
    for( var i:int = 0 ; i < hts.lastResult.item.length() ;  i ++ ){
        var loader:URLLoader = new URLLoader();
        loader.load(new URLRequest(hts.lastResult.item[i].image ) );
        loader.addEventListener(Event.COMPLETE , function():void{
            cnt++;
            if( cnt == hts.lastResult.item.length() ){
                onComp();
            }
        });
    }
}
private var planeArrA:Array = new Array();
private var planeArrB:Array = new Array();
private var cube:Cube;
private function onComp():void{
    for( var i:int = 0 ; i < hts.lastResult.item.length() ;  i ++ ){
        var mat:BitmapFileMaterial = new BitmapFileMaterial( hts.lastResult.item[i].image );
        mat.doubleSided = true;
        var plane:Plane = new Plane(mat,100,100);
        plane.z = -i*10-800;
        Tweener.addTween(plane,{
                                alpha:1,
                                x:150,
                                y:0,
                                z: i * 100-2200,
                                rotationY:-90,
                                transition:"easeinoutquad",
                                time:i*0.4
                            });
        r.scene.addChild(plane);
        planeArrA[i] = plane;
        var plane2:Plane = new Plane(mat,100,100);
        plane2.z = -i*10-800;
        Tweener.addTween(plane2,{
                                alpha:1,
                                x:-150,
                                y:0,
                                z: i * 100-2200,
                                rotationY:-90,
                                transition:"easeinoutquad",
                                time:i*0.4
                            });
        r.scene.addChild(plane2);
        planeArrB[i] = plane2;
    }
    r.camera.z = -3200;
    r.camera.y = 100;
    Tweener.addTween( r.camera , {
                                delay:0.1,
                                z:-200,
                                y:0,
                                time:20
                            });
    var mat2:BitmapFileMaterial = new BitmapFileMaterial("47.jpg");
    var matlist:MaterialsList = new MaterialsList({all:mat2});
    cube = new Cube(matlist,100,100,100,4,4,4);
    cube.z = 0
    r.scene.addChild(cube);
    r.camera.target = cube;
    t = new Twist( cube );
    axis = new Number3D(1, 0, 0);
    Tweener.addTween(cube,{
                            delay:9,
                            rotationY:1280,
                            transition:"easeinoutquad",
                            time:3,
                            onStart:function():void{
//                                expandPlane();
                            },
                            onComplete:function():void{
                                setWord();
                            }
                        });
}
private var word:Text3D;
private function setWord():void{
    var lettermat:Letter3DMaterial = new Letter3DMaterial();
    lettermat.fillColor = 0xffccff;
    word = new Text3D("moeten.info" , new HelveticaBold() , lettermat );
    word.y = 0;
     word.z = cube.z;
     word.scale = 0.8;
     word.useOwnContainer = true;
     Tweener.addTween( word ,{
                             y:140,
                            rotationY:360,
                            transition:"easeinoutquad",
                            time:2,
                            onComplete:function():void{
                                rotated();
                            }
                         });
    r.scene.addChild(word);
}
private function rotated():void{
    rotateWords();
     Tweener.addTween( gf2 ,{
                             blurX:16,
                             blurY:16,
                             alpha:0.5,
                            transition:"easeinoutquad",
                            time:1,
                            onComplete:function():void{
                                rotated2();
                            }
                     });
}
private var onAnimed:Boolean = false;
private function rotated2():void{
    onAnimed = true;
    word.filters = [gf2];
    r.camera.target = cube;
}
private function expandPlane():void{
    for( var i:int = 0 ; i < planeArrA.length ; i ++ ){
         Tweener.addTween( planeArrA[i] ,{
                             x:Math.random()*600-200,
                             z:Math.random()*600-200,
                            transition:"easeinoutquad",
                            time:1,
                            onComplete:function():void{
                                Plane(planeArrA[i]).lookAt(r.camera);
                            }
                     });
        Plane(planeArrB[i]).lookAt(r.camera);
         Tweener.addTween( planeArrB[i] ,{
                             x:-Math.random()*600-200,
                             z:-Math.random()*600-200,
                            transition:"easeinoutquad",
                            time:1,
                            onComplete:function():void{
                                Plane(planeArrB[i]).lookAt(r.camera);
                            }
                     });
    }
}
private function onMouseMove(e:MouseEvent):void{
}
private function rotateWords() : void {
    var drx:Number = Math.round(Math.random() * 2 - 1) * 360;
    var dry:Number = Math.round(Math.random() * 2 - 1) * 360;
    var drz:Number = Math.round(Math.random() * 2 - 1) * 360;
    rotateLetters( word , drx , dry , drz);
}
private function rotateLetters(word : Text3D , drx:Number , dry:Number , drz:Number) : void {
    for each (var do3d:DisplayObject3D in word.letters) {
        if(Tweener.isTweening(do3d))return;
         Tweener.addTween( do3d , {
                     delay:Math.random()*1,
                     rotationY:do3d.rotationY + dry ,
                     rotationZ:do3d.rotationZ + drz ,
                    rotationX:do3d.rotationX + drx,
                    time:2
         });
     }
}
private var a:Number = 0;
private var t:Twist;
private var axis:Number3D  =new Number3D(0, 1, 0);
private var center:Number3D = new Number3D(0, 0, 0);
private function myTimer( e:Event ):void{
    if( onAnimed ){
//        var reach:Number = 0.001;
//        var ease:Number = 0.01;
//        var cameraDistance:Number = r.camera.z;
//        r.camera.x += (Math.sin(mouseX * reach) *   cameraDistance - r.camera.x) * ease;
//        r.camera.z += (Math.cos(mouseX * reach) *   cameraDistance - r.camera.z) * ease;
    }
    r.singleRender();
}
]]>
</mx:Script>
<mx:GlowFilter id="gf1" blurX="3" blurY="3" color="0xffffff"  strength="10"/>
<mx:BlurFilter id="bf" blurX="4" blurY="4" />
<mx:GlowFilter id="gf2" blurX="0" blurY="0" color="0xffffff" />
<mx:HTTPService id="hts" url="http://moeten.info/maidcafe/?type=dayinfo&amp;m=api&amp;image=on"
    resultFormat="e4x" result="makePlane()" />
<mx:UIComponent id="myUI" width="100%" height="100%" />
</mx:Application>