MayaでレンダリングしたオブジェクトをPaperVision3Dで表示

MayaでレンダリングしたオブジェクトをPaperVision3Dで表示してみました。
こんな感じ
http://moeten.info/flex/20081208_pv3dColladaMaya2/bin-release/main.html

レンダリングされたテクスチャ(Bakeっていうらしい)にすると、PV3D上でシェード(影処理)をする必要がなくなるので負荷が軽くなります。
ただ、ライトの移動での影の変化などのアクションはできないので、そこはケースバイケース。

簡単な説明

まだまだMayaに慣れていないので、もっと簡単な方法があると思いますがメモ的に。
PV3Ddaeファイルで3Dオブジェクトを表示します。
手順

  • Mayaでオブジェクトを作成
  • ライトを設置。
  • 素材をとりあえず指定
  • テクスチャのみレンダリングしてファイルとして書き出し
  • テクスチャを再指定。surfaceShaderを使用するとなぜかDae形式で書き出せないから
  • あとはDaeファイルに書き出し。

ただなんとなくMayaだとうまくDaeが書き出せないので、3DsMaxとかのほうがいいかも?
ソースはこちら

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute" creationComplete="init3D()" width="640" height="480"
    backgroundGradientColors="[0xffffff,0x999999]"
 viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
/* **********************************
            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();
    setupCamera();
    setupCollada();
    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 = 10;
}
//イベントリスナー設定
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 = 100;
    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の作成
private var myDae:DAE;
private function setupCollada():void{
    myDae = new DAE();
    myDae.load("test.dae", new MaterialsList({ all:new BitmapFileMaterial( "texture.jpg" ) } ) );
    myDae.scaleX = 30;
    myDae.scaleY = 30;
    myDae.scaleZ = 30;
    scene.addChild(myDae);
}
]]>
</mx:Script>
<mx:UIComponent id="myUI" width="100%" height="100%" />
</mx:Application>