PaperVision3Dでうねうねヽ(^。^)ノしてみた
うねうねヽ(^。^)ノ
こんな感じ
http://moeten.info/flex/20080920_pv3d2Test/bin-release/main4.html
今回は文字やスプライトをベクターに変換してくれるvectorvisionってのを使ってみました。
ほとんどサンプルといっしょでどうせならTwistもってことでかわいいTwistも使ってみました。
ソースはこちらmain4.mxmlってのです。
参考にさせていただいたページ
Twistによるうねうね main4.mxml
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundAlpha="1" backgroundColor="0x000000" layout="absolute" creationComplete="init()"> <mx:Script> <![CDATA[ import org.papervision3d.core.math.Number3D; import org.papervision3d.core.material.TriangleMaterial; import org.papervision3d.core.effects.view.ReflectionView; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.objects.special.Graphics3D; import org.papervision3d.objects.special.VectorShape3D; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.materials.special.VectorShapeMaterial; import org.papervision3d.materials.BitmapFileMaterial; import org.papervision3d.materials.BitmapColorMaterial; import org.papervision3d.materials.WireframeMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.typography.fonts.HelveticaBold; import org.papervision3d.typography.Word3D; import org.papervision3d.typography.Letter3D; import gs.TweenLite; //初期化 private function init():void{ setupScene(); setText() setupBlokjes() setupListeners(); setupCamera(); } //シーンの作成+リフレクション private var r:ReflectionView; private function setupScene():void{ r = new ReflectionView( myImage.width , myImage.height , true , true ); //リフレクションを置く場所 r.surfaceHeight = -300; //ぼかし具合 r.viewportReflection.filters = [new BlurFilter(8, 8, 1)]; myImage.addChildAt( r , 0 ); } //カメラ設定 private var cameraTarget : DisplayObject3D; private function setupCamera():void{ cameraTarget = new DisplayObject3D(); //なんかないと怒られる r.camera.z = - 800; r.camera.y = 10; } //イベントリスナー設定 private function setupListeners():void{ addEventListener(Event.ENTER_FRAME, onRenderTick); addEventListener(Event.RESIZE, onResize); } // Word3Dの作成 private var words:Word3D; private var shape:VectorShape3D; private var t2:Twist; private function setText():void{ var mat:VectorShapeMaterial = new VectorShapeMaterial( 0xffffff ); words = new Word3D("We Love Flex ! :-)", new HelveticaBold(), mat ); words.x = 100; words.scale = 3; r.scene.addChild(words); shape = new VectorShape3D(new VectorShapeMaterial(0xffffff)); var g:Graphics3D = shape.graphics; shape.z = -200; shape.x = 500; r.scene.addChild(shape); g.clear(); g.beginFill(0xffff00); g.drawRoundRect(-200 ,-200 ,400 ,400 ,200,200); g.endFill(); t2 = new Twist( shape ); } private function rotateLetters(word : Word3D , drx:Number , dry:Number , drz:Number) : void { for each (var do3d:DisplayObject3D in word.letters) { if(TweenLite.isTweening(do3d))return; TweenLite.to(do3d, 3, { rotationY:do3d.rotationY + dry , rotationZ:do3d.rotationZ + drz , rotationX:do3d.rotationX + drx }); } } //オブジェ(キューブ)の作成 private var cube:Cube; private var t:Twist; private var a:Number = 0; private var axis:Number3D = new Number3D(0, 1, 0); private var center:Number3D = new Number3D(0, 0, 0); private function setupBlokjes() : void { var mat:BitmapFileMaterial = new BitmapFileMaterial("Fx.png"); cube = new Cube(new MaterialsList({all:mat}),200, 200, 200, 4, 4, 4); cube.z = -200; r.scene.addChild(cube); t = new Twist( cube ); } //レンダリング+マウス操作 protected function onRenderTick(e:Event):void { var reach:Number = 0.005; var ease:Number = 0.05; var cameraDistance:Number = 1000; //カメラワーク r.camera.x += (Math.sin(mouseX * reach) * -cameraDistance - r.camera.x) * ease/10; if( this.mouseY > this.height/2 ){ r.camera.y -= (Math.sin(this.mouseY * reach) * cameraDistance + r.camera.y) * ease/10; }else{ r.camera.y += (Math.sin(this.mouseY * reach) * cameraDistance + r.camera.y) * ease/10; } r.camera.lookAt(cameraTarget); //文字をくるくる回転 if( Math.random() > 0.5 ){ 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( words , drx , dry , drz); } //Twistさせる t.twist( Math.sin( a += 0.3 ) * 30 , axis , center ); t2.twist( Math.sin( a += 0.3 ) * 30 , axis , center ); //レンダリング r.singleRender(); } //リサイズイベント private function onResize(e : Event) : void { } ]]> </mx:Script> <mx:Image id="myImage" width="100%" height="100%" /> </mx:Application>