Papervision3D – primitiveとColladaファイル(.dae)の表示方法 (AS3.0)

  • hatena bookmark
  • Twitter
  • Delicious
  • Blogger Post
  • Evernote
  • Google Bookmarks
  • Share/Bookmark

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

1. プリミティブを表示する

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. colladaファイル(.dae)を表示する

以下の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 );
				}
			);

		}

	}

}
  • hatena bookmark
  • Twitter
  • Delicious
  • Blogger Post
  • Evernote
  • Google Bookmarks
  • Share/Bookmark
関連する記事:
  1. Papervision3D – ポリゴンにSWFファイルを貼り付ける方法 (AS3.0)
  2. GoogleMaps API for Flash – 3D表示できるMap3Dクラスを試してみました (AS3.0)
  3. Flashで別ドメイン(クロスドメイン)にある画像の表示方法(AS3.0)
  4. ActionScript3.0(AS3.0) – addEventListenerで関数へ引数を渡す
コメント 停止中