Home > papervision3d > Papervision3Dでプリミティブ以外のオブジェクトを作る

Papervision3Dでプリミティブ以外のオブジェクトを作る

Papervision3Dでは様々なプリミティブ・オブジェクトが準備されています。
今回は、それらを一切無視して、独自にオブジェクトを作ってみます。
と、偉ぶってますが、単純に三角形です。

Mesh3D

プリミティブ・オブジェクトは全てorg.papervision3d.core.geom.Mesh3Dを継承しています。
ということで、プリミティブ・オブジェクトと同じく、Mesh3Dを使って新たなオブジェクトを作ります。

Mesh3Dを作成

なにはともあれMesh3Dを作ります。

obj = new Mesh3D(material, new Array(), new Array(), null);

materialは何でも良いのですが、今回はColorMaterialを使います。

material = new ColorMaterial(0xcccccc,1.0);
まずは頂点を3つ

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);
    }
  }
}
関連のありそうなエントリ

Comments:0

Comment Form
Remember personal info

*
To prove that you're not a bot, enter this code
Anti-Spam Image

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

Home > papervision3d > Papervision3Dでプリミティブ以外のオブジェクトを作る

Search
Feeds
Meta

Return to page top