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 );
}
);
}
}
}

