- 2007-08-06 0:51
- papervision3d
以前のエントリ「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
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
