BranchGroupクラス

広告

前のページで仮想空間のベースとなるシンプルユニバースを作成しました。この空間内に表示したい物体を、シンプルユニバースに追加していく方法を見ていきます。

実際にはシンプルユニバースに直接物体を配置は行わず、中間に1つブランチグループというものを介して物体の配置を行います。

シンプルユニバースの構成

このように空間に配置したい物体はいったんブランチグループに追加していき、そしてそのブランチグループをまとめてシンプルユニバースに追加することになります。

シンプルユニバースにブランチグループを追加するには、SimpleUniverseクラスで用意されているaddBranchGraphメソッドを使います。

addBranchGraph
public void addBranchGraph(BranchGroup bg)
Used to add Nodes to the geometry side (as opposed to the view side) 
of the scene graph. This is a short cut to getting the Locale object 
and calling that object's addBranchGraph() method.

ではブランチグループについて見てみましょう。クラス定義は下記のようになっています。

  • java.lang.Object
  • javax.media.j3d.SceneGraphObject
  • javax.media.j3d.Node
  • javax.media.j3d.Group
  • javax.media.j3d.BranchGroup
  • public class BranchGroup extends Group

コンストラクタは1つ用意されています。

コンストラクタ
BranchGroup()
Constructs and initializes a new BranchGroup node object.

ブランチグループに物体などを追加する(Java3Dでは子のノードを追加すると言います)には、親クラスのGroupクラスで用意されているaddChildメソッドを使います。

addChild
public void addChild(Node child)
Appends the specified child node to this group node's list of children. 

Parameters:
  child - the child to add to this node's list of children 
Throws: 
  CapabilityNotSetException - if the appropriate capability is not set 
    and this group node is part of live or compiled scene graph 
  RestrictedAccessException - if this group node is part of live or 
    compiled scene graph and the child node being added is not a 
    BranchGroup node 
  MultipleParentException - if child has already been added as a child 
    of another group node.

ここで注意すべき点があります。空間に配置したい物体をブランチグループに追加し、そのブランチグループをシンプルユニバースに追加するわけですが、まず物体をブランチグループに追加し終わってからブランチグループをシンプルユニバースに追加する必要があります。シンプルユニバースにブランチグループを追加してから、そのブランチグループに物体を追加してはいけません(出来なくは無いのですが、他に設定が必要となります)。

簡単に言ってしまいますと、シンプルユニバースにブランチグループが追加された時点でこの仮想空間が有効となります。有効になった仮想空間に物体を追加する場合は事前に許可がされている必要があるためです。その為、まずブランチグループの準備を一通りしておいてから、最後にシンプルユニバースに追加するようにして下さい。

コンパイル

今までの手順で一通りのことは出来るようになっているのですが、シンプルユニバースにブランチグループが追加されて仮想空間が有効になった時に、なるべくスムーズに描画が行われるように、ブランチグループをコンパイルしておくことが出来ます。コンパイルとはブランチグループに追加された各ノードなどの情報を整理しておくようなものだと思っておいて下さい。

コンパイルを行うには、BranchGroupクラスで用意されているcompileメソッドを使います。

compile
public void compile()
Compiles the source BranchGroup associated with this object and creates
and caches a compiled scene graph. 

Throws: 
  SceneGraphCycleException - if there is a cycle in the scene graph 
  RestrictedAccessException - if the method is called when this object 
    is part of a live scene graph.

ブランチグループのコンパイルは、ブランチグループをシンプルユニバースに追加する直前に行います。

まとめ

では今までの分をまとめてみましょう。

GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(config);

SimpleUniverse universe = new SimpleUniverse(canvas);
universe.getViewingPlatform().setNominalViewingTransform();

BranchGroup objRoot = new BranchGroup();

/* ブランチグループに必要なノードを追加する*/
objRoot.addChild(....);
objRoot.addChild(....);
objRoot.addChild(....);

objRoot.compile();

universe.addBranchGraph(objRoot);

ノードの部分には基本図形や光源、また他にも色々な物が追加されることになります。

( Written by Tatsuo Ikura+ )

Facebook Page