Papervision3D – primitiveとColladaファイル(.dae)の表示方法 (AS3.0)
Flashの3Dライブラリ Papervision3D(PV3D)を使って、今回は用意されているプリミティブとColladaクラス、DAEクラスを使って表示してみました。
PV3Dの導入については以下のリンクが非常に参考になります。
http://clockmaker.jp/blog/2009/02/pv3d_frame_action_01
PV3D ドキュメンテーション
http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/index.html
PV3Dでは以下のプリミティブクラスが用意されています。
- Arrow / 矢印
- Cone / 円錐
- Cube / 立方体
- Cylinder / 円柱
- PaperPlane / 紙飛行機
- Plane / 平面
- Sphere / 球体
今回Arrowを使って表示してみます。24行目でプリミティブの指定をしています。
package{ import flash.events.*; import org.papervision3d.scenes.Scene3D; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.cameras.Camera3D; import org.papervision3d.view.*; import org.papervision3d.objects.primitives.*; import org.papervision3d.materials.*; public class main extends BasicView { public function main():void { var renderer:BasicRenderEngine = new BasicRenderEngine(); var scene:Scene3D = new Scene3D(); var viewport:Viewport3D = new Viewport3D( 0, 0, true ); var camera:Camera3D = new Camera3D(); var material:WireframeMaterial = new WireframeMaterial(0xFF0000); this.addChild( viewport ); var object:Arrow = new Arrow( material ); scene.addChild( object ); addEventListener( Event.ENTER_FRAME, function():void { object.pitch(1); object.yaw(1); renderer.renderScene( scene , camera, viewport ); } ); } } }
以下の2つのクラスを使うことができます。
org.papervision3d.objects.parsers.Collada
org.papervision3d.objects.parsers.DAE
2つの違いは、ほとんど同じような感じですが、Colladaでは読み込み時にマテリアルリストに加え、スケール(scale)と両面ポリゴン化の有無(doubleSided)を指定でき、感覚的にDAEの方はシーン丸ごと読み込む、Colladaの方はシーン上のオブジェクトを読み込むイメージに近いかと思います。
DAEクラスについて以下のポストに詳しく書かれています。
http://blog.r3c7.net/?p=333
またColladaファイルは、ポリゴンをあらかじめ三角分割しておく必要があります。
a. DAEクラスを使う場合:
29行目を参考に、オブジェクトロード時にマテリアルリスト を指定できます。
package{ import flash.events.*; import org.papervision3d.materials.*; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.parsers.DAE; import org.papervision3d.objects.primitives.*; import org.papervision3d.view.*; import org.papervision3d.scenes.Scene3D; import org.papervision3d.cameras.Camera3D; import org.papervision3d.render.BasicRenderEngine; public class main extends BasicView { public function main():void { var viewport:Viewport3D = new Viewport3D( 640, 480, true, true ); addChild( viewport ); var renderer:BasicRenderEngine = new BasicRenderEngine(); var scene:Scene3D = new Scene3D(); var camera:Camera3D = new Camera3D(); var materials:MaterialsList = new MaterialsList( { all:new WireframeMaterial( 0xFF0000 ) } ); var object:DAE = new DAE (); object.load( "オブジェクトのパス", materials ); scene.addChild( object ); addEventListener( Event.ENTER_FRAME, function():void { object.pitch(1); object.yaw(1); renderer.renderScene( scene , camera, viewport ); } ); } } }
b. Colladaクラス を使う場合:
28行目を参考に、オブジェクトロード時にマテリアルリスト、スケール、両面ポリゴン化の有無を指定できます。
package{ import flash.events.*; import org.papervision3d.materials.*; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.parsers.Collada; import org.papervision3d.objects.primitives.*; import org.papervision3d.view.*; import org.papervision3d.scenes.Scene3D; import org.papervision3d.cameras.Camera3D; import org.papervision3d.render.BasicRenderEngine; public class main extends BasicView { public function main():void { var viewport:Viewport3D = new Viewport3D( 640, 480, true, true ); addChild( viewport ); var renderer:BasicRenderEngine = new BasicRenderEngine(); var scene:Scene3D = new Scene3D(); var camera:Camera3D = new Camera3D(); var materials:MaterialsList = new MaterialsList( { all:new WireframeMaterial( 0xFF0000 ) } ); var object:Collada = new Collada( "オブジェクトのパス", materials, 1, false ); scene.addChild( object ); addEventListener( Event.ENTER_FRAME, function():void { object.pitch(1); object.yaw(1); renderer.renderScene( scene , camera, viewport ); } ); } } }