PV3D+Maya

MayaでBakeされたテクスチャをPaperVision3Dで複数表示してみました。
こんな感じ
http://moeten.info/flex/20081208_pv3dColladaMaya3/bin-release/main.html

簡単な説明

ColladaMayaっという便利なライブラリがあったのでそちらでMaya->Collada(dae)形式で出力。
前回の紹介のFBXコンバーダライブラリと違う点は、Bakeされたテクスチャの出力ができることです。
こっちのライブラリのほうが便利です。
出力設定項目はこちら

Flashで出力する際に気をつける点はテクスチャパスの指定くらい。
相対パス絶対パスかの設定。普通は相対パスが便利。
あとPaperVision3Dには3Dの読み込み方法がいくつかありますが「Collada」で読み込むするほうが便利です。以前は「DAE」で読み込みをしていたのですが、テクスチャの指定が面倒なので「Collada」が便利です。
以前のDAEクラスの場合

private var myDae:DAE;
private function setupCollada():void{
    myDae = new DAE();
    var mat1:BitmapFileMaterial = new BitmapFileMaterial( "lambert2SG-pCube2.1.jpg");
    var mat2:BitmapFileMaterial = new BitmapFileMaterial( "lambert2SG-pPipe1.1.jpg");
    var mat3:BitmapFileMaterial = new BitmapFileMaterial( "lambert2SG-pTorus1.jpg");
    var mat4:BitmapFileMaterial = new BitmapFileMaterial( "phong1SG-pPlane1.2.jpg");
    var matlist:MaterialsList = new MaterialsList();
    matlist.addMaterial( mat1 , "lambert2SG6" );
    matlist.addMaterial( mat2 , "lambert2SG7" );
    matlist.addMaterial( mat3 , "lambert2SG5" );
    matlist.addMaterial( mat4 , "phong1SG1" );
    myDae.load("test15.dae" );
    myDae.scale = 10;
    scene.addChild(myDae);
}

今回のCollada形式の場合

private var myDae:Collada;
private function setupCollada():void{
    myDae = new Collada();
    myDae.load("test15.dae" );
    myDae.scale = 0.05;
    scene.addChild(myDae);
}

かなりスマートになります。Scaleの設定が違うのが注意。
すべてのソースはこちら

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute" creationComplete="init3D()" width="1040" height="980"
    backgroundGradientColors="[0xffffff,0x999999]"
 viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
    import org.papervision3d.objects.parsers.Collada;
/* **********************************
            PV3D
********************************** */
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.parsers.DAE;
private var scene    : Scene3D;
private var viewport : Viewport3D;
private var renderer : BasicRenderEngine;
private var camera   : Camera3D;
private var cameraTarget : DisplayObject3D;
//初期化
private function init3D():void{
    setupScene();
    setupCollada();
    setupCamera();
    setupListeners();
}
//シーンの作成
private function setupScene():void{
    viewport = new Viewport3D( myUI.width , myUI.height , true , false , true , true );
    myUI.addChildAt(viewport , 0);
    renderer = new BasicRenderEngine();
    scene    = new Scene3D();
}
//カメラ設定
private function setupCamera():void{
    cameraTarget = new DisplayObject3D();
    camera = new Camera3D();
    camera.z = - 300;
    camera.y = 100;
    camera.lookAt(myDae);
}
//イベントリスナー設定
private function setupListeners():void{
    this.addEventListener(Event.ENTER_FRAME , onRenderTick );
}
//レンダリング+マウス操作
protected function onRenderTick(e:Event):void {
    var reach:Number = 0.01;
    var ease:Number = 0.1;
    var cameraDistance:Number = 400;
//    camera.x += (Math.sin(mouseX * reach) *   cameraDistance - camera.x) * ease;
//    camera.y += (Math.sin(mouseY * reach) *   cameraDistance - camera.y) * ease;
    myDae.rotationY -=1;
    renderer.renderScene(scene , camera , viewport );
}
//リサイズイベント
private function onResize(e : Event) : void {
}
/* *****************
    myMain
 ***************** */
//Daeの作成
//import org.papervision3d.events.FileLoadEvent;
private var myDae:Collada;
private function setupCollada():void{
    myDae = new Collada();
//    myDae.addEventListener(FileLoadEvent.LOAD_COMPLETE , onSceneGeometryLoaded );
//    myDae.addEventListener(FileLoadEvent.ANIMATIONS_COMPLETE , onSceneAnimationsLoaded);
//    var mat1:BitmapFileMaterial = new BitmapFileMaterial( "lambert2SG-pCube2.1.jpg");
//    var mat2:BitmapFileMaterial = new BitmapFileMaterial( "lambert2SG-pPipe1.1.jpg");
//    var mat3:BitmapFileMaterial = new BitmapFileMaterial( "lambert2SG-pTorus1.jpg");
//    var mat4:BitmapFileMaterial = new BitmapFileMaterial( "phong1SG-pPlane1.2.jpg");
//    var matlist:MaterialsList = new MaterialsList();
//    matlist.addMaterial( mat1 , "lambert2SG6" );
//    matlist.addMaterial( mat2 , "lambert2SG7" );
//    matlist.addMaterial( mat3 , "lambert2SG5" );
//    matlist.addMaterial( mat4 , "phong1SG1" );
//    myDae.meshSort = 1;
    myDae.load("test15.dae" );
    myDae.scale = 0.05;
    scene.addChild(myDae);
}
private function onSceneAnimationsLoaded(e:Event):void{
}
private function onSceneGeometryLoaded(e:Event):void{
}
]]>
</mx:Script>
<mx:UIComponent id="myUI" width="100%" height="100%"  y="-20"/>
</mx:Application>