- 2007-08-08 23:44
- papervision3d
Papervision3Dでは様々なプリミティブ・オブジェクトが準備されています。
今回は、それらを一切無視して、独自にオブジェクトを作ってみます。
と、偉ぶってますが、単純に三角形です。
プリミティブ・オブジェクトは全てorg.papervision3d.core.geom.Mesh3Dを継承しています。
ということで、プリミティブ・オブジェクトと同じく、Mesh3Dを使って新たなオブジェクトを作ります。
なにはともあれMesh3Dを作ります。
obj = new Mesh3D(material, new Array(), new Array(), null);
materialは何でも良いのですが、今回はColorMaterialを使います。
material = new ColorMaterial(0xcccccc,1.0);
3点で1つの平面が決定しますので、とりあえず頂点となる3つの頂点を決めます。
頂点はMesh3Dのプロパティのverticsに配列の形で登録します。
obj.geometry.vertices.push(new Vertex3D(size*cos(90), size*sin(90), 0)); obj.geometry.vertices.push(new Vertex3D(size*cos(210), size*sin(210), 0)); obj.geometry.vertices.push(new Vertex3D(size*cos(330), size*sin(330), 0));
おっと、ここで独自メソッドを使っています。sinとcosです。
直感的に分かるかと思いますが、三角方程式です。
一応定義を記しておきます。
private function sin(degree : Number):Number{ return Math.sin(Math.PI * degree / 180); } private function cos(degree : Number):Number{ return Math.cos(Math.PI * degree / 180); }
この3点は時計で言うところの0時、8時、4時の点です。
これを結ぶと正三角形ですね。
点を結んで面を作ります。
面の作り方には注意が必要です。というのも面には裏と表があるからです。
簡単に言うと、3点を反時計回り方向に結んだ面が表です。
今回はmaterialのdoubleSidedをtrueにしておくことで、裏も表も関係ないようにしています。
obj.geometry.faces.push(new Face3D(obj.geometry.vertices, null, null)); obj.geometry.ready = true;
以上で正三角形のオブジェクトが完成しました。いわゆる単一のポリゴンです。
結果はこうなります。
今回の全てのソースコードは以下のようになります。
package { import flash.display.*; import flash.events.*; import org.papervision3d.core.proto.*; import org.papervision3d.core.geom.*; import org.papervision3d.scenes.*; import org.papervision3d.objects.*; import org.papervision3d.cameras.*; import org.papervision3d.materials.*; [SWF( backgroundColor="0xffffff", frameRate="45" )] public class Mesh3DPlane extends Sprite { private var container : Sprite; private var scene : Scene3D; private var camera : Camera3D; private var rootNode : DisplayObject3D; private var obj : DisplayObject3D ; //オブジェクト private var size : int = 200;//オブジェクトの長さ private var segment : int = 1; //面の分割数 private var material : MaterialObject3D; //--------------------------------------------Constructor public function Mesh3DPlane():void { //ステージ this.stage.quality = "MEDIUM"; this.stage.scaleMode = "noScale"; this.stage.align = StageAlign.TOP_LEFT; this.stage.addEventListener(Event.ENTER_FRAME, loop); this.stage.addEventListener(Event.RESIZE, resize); //コンテナ生成 container = new Sprite(); container.x = this.stage.stageWidth / 2; container.y = this.stage.stageHeight / 2; this.addChild(container); //シーン生成 scene = new Scene3D(container); //rootNode生成 rootNode = new DisplayObject3D("rootNode"); scene.addChild(rootNode); //マテリアル設定 material = new ColorMaterial(0xcccccc,1.0); material.name = "white"; material.doubleSided = true; //メッシュを作成 obj = new Mesh3D(material, new Array(), new Array(), null); //頂点 obj.geometry.vertices.push(new Vertex3D(size*cos(90), size*sin(90), 0)); obj.geometry.vertices.push(new Vertex3D(size*cos(210), size*sin(210), 0)); obj.geometry.vertices.push(new Vertex3D(size*cos(330), size*sin(330), 0)); //面を作成 obj.geometry.faces.push(new Face3D(obj.geometry.vertices, null, null)); obj.geometry.ready = true; rootNode.addChild(obj); //camera設定 camera = new Camera3D(); camera.y = size; camera.z = -size * 2; camera.focus = 300; camera.zoom = 1; } //--------------------------------------------loop private function loop(event:Event):void { // 回転 obj.rotationY += container.mouseY / 100; obj.rotationX += container.mouseX / 100; //再レンダリング scene.renderCamera(camera); } //--------------------------------------------stage private function resize(e:Event):void{ container.x = this.stage.stageWidth / 2; container.y = this.stage.stageHeight / 2; } //--------------------------------------------sin private function sin(degree:Number):Number{ return Math.sin(Math.PI * degree / 180); } //--------------------------------------------cos private function cos(degree:Number):Number{ return Math.cos(Math.PI * degree / 180); } } }
- Newer: Papervision3DにTweenerを導入する
- Older: Papervision3Dのオブジェクトを半透明化する
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://www.adamrocker.com/blog/141/papervision3d_mesh3d_triangle_object.html/trackback/
- Listed below are links to weblogs that reference
- Papervision3Dでプリミティブ以外のオブジェクトを作る from throw Life
