Papervision3Dで頂点を遊ぶ

まずはこちらのサイト
TweenerでPapervision3Dのオブジェクトを生きている様に拡大・縮小する
こちらを見て、わー面白いってことで自分でも遊びでやってみました。
こんな感じ
http://moeten.info/flex/20080920_pv3d2Test/bin-release/main3.html

ソースはこちらmain3.mxmlってファイル
マウスイベント取得するのってちょっと手間がいるんですね。
こんな感じ

Mouse3D.enabled = true;
plane.material.interactive = true;
plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK , clickObj );
private function clickObj (e:InteractiveScene3DEvent):void {
    var p:Plane = e.displayObject3D as Plane;
    var a:Mouse3D = r.viewport.interactiveSceneManager.mouse3D;
}

頂点遊びっていろいろ変形できるから楽しいですね。
ほかにもTwistってのがあるのでこれもまた今度遊びでやってみたい。

参考リンク

頂点座標で遊ぶ main3.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.events.*;
import org.papervision3d.core.utils.Mouse3D;
import caurina.transitions.Tweener;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.materials.BitmapColorMaterial;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.core.material.TriangleMaterial;
import org.papervision3d.core.effects.view.ReflectionView;
private var cameraTarget : DisplayObject3D;
//初期化
private function init():void{
   Mouse3D.enabled = true;
    setupScene();
//    setupSphere();
    setupListeners();
    setupCamera();
//    setfog();
    hts.send();
//    setupBlokjes();
}
private function onResult():void{
    setupBlokjes();
}
//シーンの作成+リフレクション
private var r:ReflectionView;
private function setupScene():void{
    r = new ReflectionView( myImage.width , myImage.height , true , true );
    //リフレクションを置く場所
    r.surfaceHeight = -600;
    //ぼかし具合
    r.viewportReflection.filters = [new BlurFilter(8, 8, 1)];
    //色の変更
    //setReflectionColor(0, 50, 0, 0, 50, 0);
    myImage.addChildAt( r , 0 );
}
//カメラ設定
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);
}
//オブジェ(キューブ)の作成
private var cubeArr:Array = new Array();
private function setupBlokjes() : void {
    var size:Number    = 100;
    var spacing:Number = 10;
    var rowNum:Number  = 5;
    var xCubes:Number  = hts.lastResult.item.length() / rowNum -1 ;
    var yCubes:Number  = rowNum;
    var plane:Plane;
    var cWidth:Number  = ((xCubes-1) * size) + ((xCubes-1)  * spacing);
    var xOffest:Number = cWidth / 2;
    var cHeight:Number = ((yCubes-1) * size) + ((yCubes-1)  * spacing);
    var yOffest:Number = cHeight / 2;
    var cnt:int = 0;
    for(var y:int = 0 ; y < yCubes ; y++){
        for(var x:int = 0 ; x < xCubes ; x++){
            var mat:BitmapFileMaterial = new BitmapFileMaterial( hts.lastResult.item[cnt].image.image1 );
            mat.doubleSided  = true;
            plane = new Plane( mat , size , size );
            plane.x = (x * size) + (x  * (spacing - 1)) - xOffest;
            plane.y = (y * size) + (y  * (spacing - 1)) - yOffest;
            //ここ重要
            plane.material.interactive = true;
            cubeArr.push( plane );
            //シーンにオブジェクトを追加
            r.scene.addChild(plane);
            plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK , clickObj );
            cnt++;
        }
    }
}
//オブジェクトクリックイベント
private function clickObj (e:InteractiveScene3DEvent):void {
    var p:Plane = e.displayObject3D as Plane;
    var a:Mouse3D = r.viewport.interactiveSceneManager.mouse3D;
    Tweener.addTween( p ,{
                            z   :p.z-100 + Math.random() * 100,
                            time:1,
                            transition:"easeInOutElastic"
                    });
    //頂点取り出し
    for each(var i:* in e.target.geometry.vertices ) {
        Tweener.addTween(i, { x:i.x*2,
                              y:i.y*2,
                              z:i.z*2,
                              time:1,
                              delay:Math.random(),
                              transition:"easeInOutElastic"
                            });
    }
}
//レンダリング+マウス操作
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/40;
//    r.camera.z += (Math.cos(mouseX * reach) * - cameraDistance - r.camera.z) * ease/50;
    if( this.mouseY > this.height/2 ){
        r.camera.y -= (Math.sin(this.mouseY * reach) *   cameraDistance + r.camera.y) * ease/40;
    }else{
        r.camera.y += (Math.sin(this.mouseY * reach) *   cameraDistance + r.camera.y) * ease/40;
    }
    r.camera.lookAt(cameraTarget);
    //レンダリング
    r.singleRender();
}
//リサイズイベント
private function onResize(e : Event) : void {
}
]]>
</mx:Script>
<mx:HTTPService id="hts" url="http://moeten.info/maidcafe/?type=baito&amp;m=api&amp;tid=13"
    result="onResult()" resultFormat="e4x"/>
<mx:Image id="myImage" width="100%" height="100%" />
</mx:Application>