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

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

以前のエントリ「Papervision3Dで複数のオブジェクトを扱う」に引き続き今回も複数のオブジェクトを扱います。
今回は5つのSphereを扱います。

5つのSphere

まず5つのSphereを作ります。一般的には配列を使いたいところですが、ここでは分かりやすくするために明示的に5つのSphereを作ります。

//オブジェクト1生成
obj1 = new Sphere(material, size, segment, segment);
obj1.x = radius * Math.cos(2 * Math.PI * 1 / 5);
obj1.z = radius * Math.sin(2 * Math.PI * 1 / 5);
rootNode.addChild(obj1);
 
//オブジェクト2生成
obj2 = new Sphere(material, size, segment, segment);
obj2.x = radius * Math.cos(2 * Math.PI * 2 / 5);
obj2.z = radius * Math.sin(2 * Math.PI * 2 / 5);
rootNode.addChild(obj2);
 
//オブジェクト3生成
obj3 = new Sphere(material, size, segment, segment);
obj3.x = radius * Math.cos(2 * Math.PI * 3 / 5);
obj3.z = radius * Math.sin(2 * Math.PI * 3 / 5);
rootNode.addChild(obj3);
 
//オブジェクト4生成
obj4 = new Sphere(material, size, segment, segment);
obj4.x = radius * Math.cos(2 * Math.PI * 4 / 5);
obj4.z = radius * Math.sin(2 * Math.PI * 4 / 5);
rootNode.addChild(obj4);
 
//オブジェクト5生成
obj5 = new Sphere(material, size, segment, segment);
obj5.x = radius * Math.cos(2 * Math.PI);
obj5.z = radius * Math.sin(2 * Math.PI);
rootNode.addChild(obj5);

それぞれのXとZの位置は正五角形になるように計算しています。
それぞれのSphereオブジェクトをrootNodeにaddChildしています。
つまりobj1〜obj5は兄弟関係となり、rootNodeの位置がそれぞれに影響されます。
ということで、衛星のようにクルクル回転させたいので、rootNodeを回転させればobj1〜obj5がその相対位置を維持したまま回転できるはずです。

rootNodeの回転

rootNodeを回転させ、obj1〜obj5をその相対位置を維持したまま回転させます。

// Circleの回転
rootNode.rotationY += 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 CircleSphere 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 obj3      : DisplayObject3D; //オブジェクト3
    private var obj4      : DisplayObject3D; //オブジェクト4
    private var obj5      : DisplayObject3D; //オブジェクト5
    private var size      : int = 100; //オブジェクトの長さ
    private var radius    : int = 400; //半径
    private var segment   : int = 12; //面の分割数
    private var material  : MaterialObject3D;
 
    //--------------------------------------------Constructor
    public function CircleSphere():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 WireframeMaterial(0xcccccc,100);
      material.name = "gray";
      material.doubleSided = true;
 
      //オブジェクト1生成
      obj1 = new Sphere(material, size, segment, segment);
      obj1.x = radius * Math.cos(2 * Math.PI * 1 / 5);
      obj1.z = radius * Math.sin(2 * Math.PI * 1 / 5);
      rootNode.addChild(obj1);
 
      //オブジェクト2生成
      obj2 = new Sphere(material, size, segment, segment);
      obj2.x = radius * Math.cos(2 * Math.PI * 2 / 5);
      obj2.z = radius * Math.sin(2 * Math.PI * 2 / 5);
      rootNode.addChild(obj2);
 
       //オブジェクト3生成
      obj3 = new Sphere(material, size, segment, segment);
      obj3.x = radius * Math.cos(2 * Math.PI * 3 / 5);
      obj3.z = radius * Math.sin(2 * Math.PI * 3 / 5);
      rootNode.addChild(obj3);
 
      //オブジェクト4生成
      obj4 = new Sphere(material, size, segment, segment);
      obj4.x = radius * Math.cos(2 * Math.PI * 4 / 5);
      obj4.z = radius * Math.sin(2 * Math.PI * 4 / 5);
      rootNode.addChild(obj4);
 
      //オブジェクト5生成
      obj5 = new Sphere(material, size, segment, segment);
      obj5.x = radius * Math.cos(2 * Math.PI);
      obj5.z = radius * Math.sin(2 * Math.PI);
      rootNode.addChild(obj5);
 
      //camera設定
      camera = new Camera3D();
      camera.z = -radius;
      camera.y = size * 2;
      camera.focus = 300;
      camera.zoom = 1;
 
    }
 
    //--------------------------------------------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;
      obj3.rotationY += container.mouseY / 100;
      obj3.rotationX += container.mouseX / 100;
      obj4.rotationY += container.mouseY / 100;
      obj4.rotationX += container.mouseX / 100;
      obj5.rotationY += container.mouseY / 100;
      obj5.rotationX += container.mouseX / 100;
 
      // Circleの回転
      rootNode.rotationY += 1;
 
      //再レンダリング
      scene.renderCamera(camera);
    }
 
    //--------------------------------------------stage
    private function resize(e:Event):void{
      container.x = this.stage.stageWidth  / 2;
      container.y = this.stage.stageHeight / 2;
    }
  }
}
関連のありそうなエントリ

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

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

Search
Feeds
Meta

Return to page top