- 2007-08-04 0:47
- 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
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
