[Papervision3D2.0] TriangleMesh3D
2008.01.04
PV3D1.7までは、自前メッシュ定義のためにMesh3Dクラスが用意されてたけど、PV3D2.0でこれがTriangleMesh3Dクラスに変更された。名前が変わっただけっぽいけどメッシュ定義の手続きが若干違うみたいだったので実際やってみた。
TriangleMesh3Dのコンストラクタ定義
TriangleMesh3D(
material:MaterialObject3D,
vertices:Array,
faces:Array,
name:String=null,
initObject:Object=null
)
- material:メッシュに与えるマテリアル
- vertices:頂点座標(Vertex3Dオブジェクト)の格納された配列
- faces:面定義(Triangle3Dオブジェクト)の格納された配列
- name:メッシュのnameプロパティ
- initObject:各種プロパティの定義Object
自前メッシュを作るには、
- マテリアルを定義
- 定義したマテリアル、空の頂点Array、空の面ArrayでTriangleMesh3Dオブジェクトを生成
- 頂点座標を定義してgeometry.verticesに追加
- 頂点座標を元に面を定義してgeometry.facesに追加
て感じで、PV3D1.7とおんなじ流れでいいみたいだ。
んで出来上がったのが以下。三角ポリ一枚定義しただけ。
TriangleMesh3DTest.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 | package { import flash.display.*; import flash.events.*; import org.papervision3d.view.BasicView; import org.papervision3d.core.geom.TriangleMesh3D; import org.papervision3d.core.geom.renderables.Triangle3D; import org.papervision3d.core.geom.renderables.Vertex3D; import org.papervision3d.core.math.NumberUV; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.materials.special.CompositeMaterial; [SWF(backgroundColor=0x000000)] public class TriangleMesh3DTest extends BasicView { private var mesh:TriangleMesh3D; public function TriangleMesh3DTest() { stage.frameRate = 60; stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; stage.quality = StageQuality.MEDIUM; //viewportの定義とカメラタイプ定義 super (0,0,true,false,"Target"); init3D(); } public function init3D():void { //カメラ設定 camera.z = -1000; camera.fov = 30; //マテリアル設定 var colorMat:ColorMaterial = new ColorMaterial( 0x006699, 1 ); colorMat.doubleSided = true; //TriangleMesh3Dオブジェクト生成 mesh = new TriangleMesh3D( colorMat, new Array(), new Array(), null ); scene.addChild(mesh); //頂点定義 var v0: Vertex3D = new Vertex3D( -80, -80, 0 ); var v1: Vertex3D = new Vertex3D( 80, -80, 0 ); var v2: Vertex3D = new Vertex3D( 0, 80, 0 ); mesh.geometry.vertices.push( v0 ); mesh.geometry.vertices.push( v1 ); mesh.geometry.vertices.push( v2 ); //面定義 var uvA:NumberUV = new NumberUV( 0, 0 ); var uvC:NumberUV = new NumberUV( 1, 0 ); var uvB:NumberUV = new NumberUV( 0, 1 ); mesh.geometry.faces.push( new Triangle3D( mesh, new Array(v0,v1,v2), null, new Array(uvA,uvC,uvB) )); mesh.geometry.ready = true; //レンダリング開始 startRendering(); } override protected function onRenderTick(event:Event=null):void { mesh.rotationY += 2; super.onRenderTick(event); } } } |
ハマったのは面の定義。Face3Dクラスが無くなって、三角ポリの面定義にTriangle3Dクラスを使うことになった模様。
Triangle3Dのコンストラクタ定義
Triangle3D(
do3dInstance:DisplayObject3D,
vertices:Array,
material:MaterialObject3D=null,
uv:Array=null
)
- do3dInstance:面が属するDisplayObject3D?(若干自信無い)
- vertices:面を構成する頂点Array
- material:面のマテリアル?(未調査)
- uv:面のUV座標Array
ってとこまではすぐに理解できたんだけども、UVの定義が必須になったってのがわかんなくて、かなりてこずった。コンストラクタのデフォルト値がnullだったんで、UV定義無くてもColorMaterialとか使う分には問題無いかと思ってたらエラーで怒られた。
それにしても、Face3Dを廃止してFace定義を細分化したっぽいあたり、今後は四角ポリが使えるようになったりするのかしら。
関連する投稿
Trackback URL : http://blog.r3c7.net/wp-trackback.php?p=136

Thankx
Metasequoia クラスを GreatWhite に対…
昨年の秋から放置していた Papervision3D をそろそろ触ってみた。あま… (more…)
[...] 参考: [Papervision3D2.0] TriangleMesh3D PV3D 地形データの自動生成(メッシュ版) Careless Adventurers UnitZeroOne 結び目理論 結び目の数学 [...]
[...] [Papervision3D2.0] TriangleMesh3D [...]