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>