ちょびっとPaperVision3Dで頂点を遊んでみた。

ちょびっとPaperVision3Dで頂点を遊んでみました。
こんな感じ
http://moeten.info/flex/20081015_xmasTree/bin-release/main.html

ツリーをクリックでちょびっと動作します。
参考リンク

ソースコードはこちら

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundGradientColors="[0x666666,0x000000]"
    creationComplete="init()" viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import org.papervision3d.materials.MovieMaterial;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.materials.shadematerials.GouraudMaterial;
import org.papervision3d.materials.shaders.ShadedMaterial;
import org.papervision3d.materials.shaders.PhongShader;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import caurina.transitions.Tweener;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.utils.setInterval;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.core.effects.utils.BitmapClearMode;
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 theta:Number=0;
private var delayTime:Number=9;
private var check:Number=0;
//初期化関数
private var plane:Plane;
private var planeVer:Array;
private function init():void{
    setScene();
    setCamera();
    setLight();
    setTree();
    setCube();
    setPlane();
    closePlane();
    this.addEventListener(Event.ENTER_FRAME, onFrame);
}
// PV3Dの初期化
private function setScene():void{
    container = new Sprite();
    myUI.addChild(container);
    viewport = new Viewport3D( myUI.width , myUI.height , true , true , true , true );
    myUI.addChild( viewport );
    render = new BasicRenderEngine();
    scene  = new Scene3D();
}
//カメラの作成
private var cameraTarget : DisplayObject3D;
private function setCamera():void{
    cameraTarget = new DisplayObject3D();
    camera = new Camera3D();
    camera.z = -800;
    camera.y = 10;
    camera.x = 100;
}
//ライトの作成
private var light:PointLight3D;
private var sphere:Sphere;
private var shadowCaster:ShadowCaster = new ShadowCaster( "shadow1", 0, BlendMode.NORMAL, 0.5, [new BlurFilter(8, 8, 2)]);
private function setLight():void{
    light= new PointLight3D(true,true);
    light.x = 200;
    light.y = 200;
    light.z = -400;
    scene.addChild( light );
    shadowCaster.setType(ShadowCaster.DIRECTIONAL);
}
//ツリーの作成
private function setTree():void{
    var mat:BitmapFileMaterial = new BitmapFileMaterial( "tree.gif" );
    mat.doubleSided = true;
    plane = new Plane( mat , 1000 , 1000 , 2 , 4 );
    plane.y = 500;
    camera.target = plane;
    planeVer = plane.geometry.vertices;
    plane.material.interactive = true;
    plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK , clickObj );
    scene.addChild( plane );
}
//キューブの作成
private var cube:Cube;
private function setCube():void{
    cube = new Cube( new MaterialsList({all: new BitmapFileMaterial( "renga.jpg" ) }), 300 , 300 , 200 );
    cube.y = -60;
    scene.addChild( cube );
}
//芝生の作成
[Embed(source="siba.jpg")]private var texture:Class;
private var ground:Plane;
private function setPlane():void{
    var shadier:ColorTransform = new ColorTransform(0.46, 0.46, 0.46);
    var movie:Sprite = new Sprite();
    shadowCaster.setType(ShadowCaster.DIRECTIONAL);
    var bmp:BitmapData = Bitmap(new texture()).bitmapData;
    movie.graphics.beginBitmapFill(bmp, null, true);
    movie.graphics.drawRect(0, 0, 512, 512);
    movie.graphics.endFill();
    movie.transform.colorTransform = shadier;
    ground = new Plane( new MovieMaterial(movie,false,true,true) , 2000,2000,10,10);
    ground.rotationX = 90;
    ground.y = -240;
    scene.addChild( ground );
}
//Planeをクローズする
private function closePlane():void{
    var f:int = 1;
    for( var cnt:int = 0 ; cnt < 5 ; cnt ++ ){
        if( cnt%2 ){
            f = -1;
        }else{
            f = 1;
        }
        for( var cnt2:int = 0 ; cnt2 < 3 ; cnt2 ++ ){
            Tweener.addTween(planeVer[ cnt2 * 5 + cnt ], {
                        x:planeVer[ cnt2 * 5 + cnt ].x,
                        y:-500 + cnt*30,
                        z:125 * f,
                        time:1,
                        delay:1,
                        transition:"easeInOutCubic"});
        }
    }
}
private function openPlane():void{
    var f:int = 1;
    for( var cnt:int = 0 ; cnt < 5 ; cnt ++ ){
        if( cnt%2 ){
            f = -1;
        }else{
            f = 1;
        }
        for( var cnt2:int = 0 ; cnt2 < 3 ; cnt2 ++ ){
            Tweener.addTween(planeVer[cnt2 * 5 + cnt], {
                        x:planeVer[cnt2 * 5 + cnt].x,
                        y:-500+250*cnt,
                        z:0,
                        time:2,
                        delay:0,
                        transition:"easeInOutCubic"});
        }
    }
}
//PlaneがクリックされたらPlaneをオープンする
private var opened:Boolean = false;
private function clickObj(e:InteractiveScene3DEvent):void{
    if( opened ){
        closePlane();
        opened = false;
    }else{
        openPlane();
        opened = true;
    }
}
// フレームイベント用関数
private var degree:Number = 0;
private function onFrame(e:Event):void
{
    // カメラの位置を計算
    var reach:Number = 0.01;
    var ease:Number  = 0.01;
    var cameraDistance:Number = 1200;
    degree += 0.1;
    light.x = 300*( Math.cos( degree ) - Math.sin( degree ) );
    light.z = 300*( Math.sin( degree ) + Math.cos( degree ) );
    camera.x = this.mouseX*0.5;
    camera.y = this.mouseY*0.5;
    shadowCaster.castModel( cube , light , ground );
    render.renderScene(scene,camera,viewport);
}
]]>
</mx:Script>
<mx:UIComponent id="myUI" width="100%" height="100%" />
</mx:Application>