Home > papervision3d > Papervision3Dで複数のオブジェクトを扱う

Papervision3Dで複数のオブジェクトを扱う

今回はPapervision3Dで複数のオブジェクトを扱います。
Papervision3Dも当たり前ですが基本はActionScriptなので、表示はツリー構造となります。
複数のオブジェクトをどこにぶら下げるのかを注意する必要があるので、今回は2パターン試してみます。
と言っても予想通りの当たり前の結果にしかなりませんが。

コンテナに同レベルでオブジェクトをぶら下げる

1つのコンテナに兄弟関係になるようにオブジェクトをぶら下げてみます。

まずはコンテナを作り、ベースとなるノードを作ります。

//コンテナ生成
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);

rootNodeというのがベースとなるノードです。
これにオブジェクトを兄弟関係になるようにぶら下げます。

では1つめのオブジェクトを作り、rootNodeにぶら下げます。

//マテリアル1設定
material1 = new ColorMaterial(0xcccccc,1);
material1.name = "gray";
material1.doubleSided = true;
 
//オブジェクト1生成
obj1 = new Plane(material1, size, size, segment, segment);
obj1.x = -size;
rootNode.addChild(obj1);

次に、2つめのオブジェクトを作り、rootNodeにぶら下げます。
こうすることで兄弟関係としてrootNodeに2つのオブジェクトをぶら下げる事になります。

//マテリアル2設定
material2 = new ColorMaterial(0x999999,1);
material2.name = "black";
material2.doubleSided = true;
 
//オブジェクト2生成
obj2 = new Plane(material2, size, size, segment, segment);
obj2.x = size;
rootNode.addChild(obj2);

それでは、結果です。

それぞれが独立して回転しています。

親子関係でオブジェクトをぶら下げる

先ほどはベースに対して兄弟関係でオブジェクトをぶら下げましたが、次は、親子関係でぶら下げてみます。
つまり、1つめのオブジェクトに2つめのオブジェクトをぶら下げます。

まずは、1つめのオブジェクトをrootNodeにぶら下げます。

//オブジェクト1生成
obj1 = new Plane(material1, size, size, segment, segment);
obj1.x = -size;
rootNode.addChild(obj1);

そのオブジェクトに2つめのオブジェクトをぶら下げます。

obj1.addChild(obj2);

つまり、obj1の下にobj2がぶら下がっています。
そうすると、obj1の位置がobj2に影響を及ぼす事が予想されます。

では、結果を見てみます。

予想通り、ちゃんとobj1の周りにobj2が衛星のように回転しています。

ソースコード

1つめの例で示した、オブジェクトが兄弟関係になる場合のソースコードを公開します。

package {
  import flash.display.*;
  import flash.events.*;
 
  import org.papervision3d.core.proto.*;
  import org.papervision3d.scenes.*;
  import org.papervision3d.objects.*;
  import org.papervision3d.cameras.*;
  import org.papervision3d.materials.*;
 
  [SWF(
       backgroundColor="0xffffff",
       frameRate="45"
      )]
 
  public class BrotherPlane extends Sprite
  {
    private var container : Sprite;
    private var scene     : Scene3D;
    private var camera    : Camera3D;
    private var rootNode  : DisplayObject3D;
    private var obj1      : DisplayObject3D ; //オブジェクト1
    private var obj2      : DisplayObject3D ; //オブジェクト2
    private var size      : int = 200;//オブジェクトの長さ
    private var segment   : int = 1;  //面の分割数
    private var material1 : MaterialObject3D;
    private var material2 : MaterialObject3D;
 
    //--------------------------------------------Constructor
    public function BrotherPlane():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);
 
      //マテリアル1設定
      material1 = new ColorMaterial(0xcccccc,1);
      material1.name = "gray";
      material1.doubleSided = true;
 
       //マテリアル2設定
      material2 = new ColorMaterial(0x999999,1);
      material2.name = "black";
      material2.doubleSided = true;
 
      //オブジェクト1生成
      obj1 = new Plane(material1, size, size, segment, segment);
      obj1.x = -size;
      rootNode.addChild(obj1);
 
      //オブジェクト2生成
      obj2 = new Plane(material2, size, size, segment, segment);
      obj2.x = size;
      rootNode.addChild(obj2);
 
      //camera設定
      camera = new Camera3D();
      camera.z = -size;
      camera.focus = 300;
      camera.zoom = 1;
 
      //イベントリスナの登録			
      container.addEventListener(MouseEvent.CLICK, clickObj);
    }
 
    //--------------------------------------------loop 
    private function loop(event:Event):void
    {
      // 回転
      obj1.rotationY += container.mouseY / 100;
      obj1.rotationX += container.mouseX / 100;
      obj2.rotationY -= container.mouseY / 100;
      obj2.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;
    }
 
    //--------------------------------------------mouse click	
    private function clickObj (e : MouseEvent):void {
      var material  : MaterialObject3D;
      material = obj1.material;
      obj1.material = obj2.material;
      obj2.material = material;
      scene.renderCamera(camera);
    }
  }
}
関連のありそうなエントリ

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/136/papervision3d_objects.html/trackback/
Listed below are links to weblogs that reference
Papervision3Dで複数のオブジェクトを扱う from throw Life

Home > papervision3d > Papervision3Dで複数のオブジェクトを扱う

Search
Feeds
Meta

Return to page top