MayaでレンダリングしたオブジェクトをPaperVision3Dで表示
MayaでレンダリングしたオブジェクトをPaperVision3Dで表示してみました。
こんな感じ
http://moeten.info/flex/20081208_pv3dColladaMaya2/bin-release/main.html
レンダリングされたテクスチャ(Bakeっていうらしい)にすると、PV3D上でシェード(影処理)をする必要がなくなるので負荷が軽くなります。
ただ、ライトの移動での影の変化などのアクションはできないので、そこはケースバイケース。
簡単な説明
まだまだMayaに慣れていないので、もっと簡単な方法があると思いますがメモ的に。
PV3Dはdaeファイルで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>