org.papervision3d.objects.Plane クラスの segmentsW と segmentsH の数をいろいろ変えてみるテスト。どんな三角形に分割されているか知りたかったから。

segmentsW と segmentsH に指定した数が0のときは、1という扱いになるらしい。

Papervision3D API Documentation には次のように書いてある。

segmentsW:Number (default = 0) - [optional] - Number of segments horizontally. Defaults to 1.
segmentsH:Number (default = 0) - [optional] - Number of segments vertically. Defaults to segmentsW.

以下、サンプルコード。

ソースコード: Planes.as


package {
 
  import flash.display.*;
  import flash.events.*;
 
  import org.papervision3d.scenes.*;
  import org.papervision3d.objects.*;
  import org.papervision3d.cameras.*;
  import org.papervision3d.materials.*;
 
  public class Planes extends Sprite {
 
    private var container : Sprite;
    private var scene     : Scene3D;
    private var camera    : Camera3D;
    private var rootNode  : DisplayObject3D;
 
    private var obj:Array = new Array();
 
    // 3Dオブジェクト踊らせ用パラメータ
    private var valx    : Number = 0;
 
    public function Planes():void {
 
      // 画面いっぱいに表示(縦横比無視)したいときはコレを使う
      // stage.scaleMode = StageScaleMode.EXACT_FIT;
 
      // リサイズに対応(swfをブラウザで直接ひらいているときとか)
      stage.addEventListener(Event.RESIZE, onStageResize);
 
      // 定期的にイベント発生
      addEventListener(Event.ENTER_FRAME, myLoopEvent);
 
      // 表示用の Sprite オブジェクトを生成
      container = new Sprite();
      container.x = 400 / 2; // at center : swf width  = 400
      container.y = 400 / 2; // at center : swf height = 400
      addChild(container);
 
      // シーンオブジェクトを作る
      scene = new Scene3D(container);
 
      // カメラオブジェクトを作る
      camera = new Camera3D();
      camera.z = -200;
      camera.focus = 500;
      camera.zoom = 1;
 
      // ルートノードを作る
      rootNode = new DisplayObject3D();
      scene.addChild(rootNode);
 
      // いろんな3Dオブジェクトを作ってみて、配列に入れておく
      obj.push(createWireframePlane(-100,  200, 0, 0));
      obj.push(createWireframePlane(   0,  200, 1, 0));
      obj.push(createWireframePlane( 100,  200, 0, 1));
      obj.push(createWireframePlane(-100,  100, 1, 1));
      obj.push(createWireframePlane(   0,  100, 2, 1));
      obj.push(createWireframePlane( 100,  100, 1, 2));
      obj.push(createWireframePlane(-100,    0, 2, 2));
      obj.push(createWireframePlane(   0,    0, 3, 2));
      obj.push(createWireframePlane( 100,    0, 2, 3));
      obj.push(createWireframePlane(-100, -100, 3, 3));
      obj.push(createWireframePlane(   0, -100, 4, 3));
      obj.push(createWireframePlane( 100, -100, 3, 4));
      obj.push(createWireframePlane(-100, -200, 4, 4));
      obj.push(createWireframePlane(   0, -200, 4, 1));
      obj.push(createWireframePlane( 100, -200, 1, 4));
 
      // 3Dオブジェクトをルートノードに追加
      for(var i:int; i<obj.length; i++){
        rootNode.addChild(obj[i]);
      }
    }
 
    private function createWireframePlane(x:int, y:int, segmentsW:Number, segmentsH:Number):DisplayObject3D {
 
      var material:WireframeMaterial = new WireframeMaterial();
      material.oneSide = false;
      material.lineColor = 0x00FF00;
      material.lineAlpha = 1;
 
      var planeSize:int = 90;
 
      var plane:Plane = new Plane(
        material, planeSize, planeSize, segmentsW, segmentsH);
      plane.x =  x;
      plane.y =  y;
      plane.z =  0;
      return plane;
    }
 
    private function myLoopEvent( event:Event ):void {
 
      valx += container.mouseX / 10;
 
      for(var i:int; i<obj.length; i++){
        obj[i].rotationY = valx;
      }
 
      scene.renderCamera(camera);
    }
 
    private function onStageResize(event:Event):void {
      container.x = stage.stageWidth  / 2;
      container.y = stage.stageHeight / 2;
    }
    
  }
}

設定ファイル: Planes-config.xml


<flex-config>
  <output>Planes.swf</output>
  <default-size>
    <width>400</width>
    <height>400</height>
  </default-size>
  <default-frame-rate>30</default-frame-rate>
  <default-background-color>0x000000</default-background-color>
  <use-network>true</use-network>
  <benchmark>true</benchmark>
  <compiler>
    <incremental>true</incremental>
    <source-path>
      <path-element>../libs/</path-element>
    </source-path>
  </compiler>
</flex-config>

../libs/ 以下に Papervision3D 1.5 のソースコードを設置。

コンパイル風景

Flex 2.0.1 でコンパイル。


C:\>mxmlc Planes.as

Planes.swf が生成される。

Ref. Papervision3D : Flash/ActionScriptによる3D描画ライブラリ

tags: zlashdot Flash Flash Flex Papervision3D

Posted by NI-Lab. (@nilab)