ちょびっと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&m=api&image=on" resultFormat="e4x" result="makePlane()" /> <mx:UIComponent id="myUI" width="100%" height="100%" /> </mx:Application>