Papervision3Dは、COLLADA形式という形状データ扱えるので試してみた。LightWave5.6以降3Dアプリ界隈の動きを全く追いかけてなかったんで「COLLADA」自体が初めて聞くフォーマットで、最初はそういうアプリがあるのかと思った。
んで調べてみると、みんなMayaだのMaxだの使ってこの形状データを生成してるので結局金がモノを言う世界に突入なのかと一瞬眩暈がしたものの、 Blender(無料)が対応してたので一安心。初めて触ったBlender、かなりクセがあるけどこれだけの機能でタダだったら何も文句はございません。
とりあえず、R-9っぽいものをモデリングしてみた。
obj_Collada.swf(要:FlashPlayer9)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | package { import flash.display.*; import flash.events.*; import org.papervision3d.scenes.*; import org.papervision3d.objects.*; import org.papervision3d.cameras.*; import org.papervision3d.materials.*; [SWF(backgroundColor=0x000000)] public class obj_Collada extends Sprite { // _______________________________________________________________________ // vars3D private var container : Sprite; private var scene : Scene3D; private var camera : Camera3D; private var rootNode : DisplayObject3D; private var colladaObj : Collada; private var objSize : int = 600; //Cubeオブジェクト1辺の長さ private var segment : int = 4; //面の分割数 private var valx : Number = 0; private var valy : Number = 0; // _______________________________________________________________________ // Constructor public function obj_Collada():void { stage.frameRate = 60; stage.quality = "LOW"; stage.scaleMode = "noScale"; stage.align = StageAlign.TOP_LEFT; this.addEventListener(Event.ENTER_FRAME, loop3D); this.stage.addEventListener(Event.RESIZE, onStageResize); init3D(); } // _______________________________________________________________________ // Init3D private function init3D():void { //コンテナ生成 this.container = new Sprite(); addChild(this.container); this.container.x = this.stage.stageWidth / 2; this.container.y = this.stage.stageHeight / 2; //シーン生成 scene = new Scene3D( container ); //カメラ設定 camera = new Camera3D(); camera.z = -objSize; camera.focus = 500; camera.zoom = 1; //rootNode生成 rootNode = scene.addChild( new DisplayObject3D( "rootNode" ) ); // Colladaオブジェクトを生成 colladaObj = new Collada( "test.dae" ); rootNode.addChild( colladaObj ); } // _______________________________________________________________________ // Loop private function loop3D( event:Event ):void { //マウス座標でオブジェクトを回転 valx += this.container.mouseX / 50; valy += this.container.mouseY / 50; colladaObj.rotationY = valx; colladaObj.rotationX = valy; //レンダリング this.scene.renderCamera( camera ); } // _______________________________________________________________________ // onStageResize private function onStageResize(event:Event):void { this.container.x = this.stage.stageWidth / 2; this.container.y = this.stage.stageHeight / 2; } } } |
うーん、ミラーコピーしたパーツの表示がなんかおかしい。法線が逆向きになってんのかなぁ。この辺はBlenderの使い方を勉強しないとダメか。あと、 Papervisionで扱うCOLLADAファイルは、UVマップが適用されてないとダメ(?)っぽいので、がんばってテクスチャ描かないと。
追記:とりあえず表示がおかしいのは直った。どうにも挙動が謎。
さらに追記:上記をPV3D2.0に対応させたソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | package { import flash.display.*; import flash.events.*; import org.papervision3d.cameras.Camera3D; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D; import org.papervision3d.objects.parsers.Collada; [SWF(backgroundColor=0x000000)] public class obj_Collada extends Sprite { // _______________________________________________________________________ // vars3D private var viewport : Viewport3D; private var scene : Scene3D; private var camera : Camera3D; private var renderer : BasicRenderEngine; private var colladaObj : Collada; // _______________________________________________________________________ // Constructor public function obj_Collada():void { stage.frameRate = 60; stage.quality = "BEST"; stage.scaleMode = "noScale"; stage.align = StageAlign.TOP_LEFT; init3D(); } // _______________________________________________________________________ // Init3D private function init3D():void { //ビューポート定義 viewport = new Viewport3D(0,0,true); viewport.opaqueBackground = 0x000000; addChild(viewport); //レンダラ定義 renderer = new BasicRenderEngine(); //シーン定義 scene = new Scene3D(); //カメラ設定 camera = new Camera3D(); camera.z = -1000; camera.fov = 30; //Collada(.dae)ファイルの読み込み colladaObj = new Collada( "assets/test.dae" ); scene.addChild( colladaObj ); addEventListener(Event.ENTER_FRAME, loop3D); } // _______________________________________________________________________ // Render Loop private function loop3D( event:Event ):void { //マウス座標でオブジェクトを回転 colladaObj.rotationY += (stage.mouseX - (viewport.width * 0.5) ) / 50; colladaObj.rotationX += (stage.mouseY - (viewport.height * 0.5) ) / 50; //レンダリング renderer.renderScene(scene,camera,viewport); } } } |


