トップページ > Java3D入門 > Java3Dの基礎知識(2)
Java3Dで扱える図形には,線分・面・立体図形などがあります。自由にポリゴンとして定義できる他に, 既に代表的な幾何学図形については完成された物が用意されています。 それらは,まとめて「プリミティブ」と呼ばれていますが,詳しい解説は後回しにします。 今回はプリミティブとして用意されている“Sphere”(スフィア:球)を,前回作ったUniverseに 配置する方法を紹介します。
図形を配置するためには,“BranchGroup”(ブランチ・グループ)というものを介してやる必要があります。 このBranchGroupは図形オブジェクトを管理する「枠」のようなものです。 今回のテストプログラムでは1つの立方体だけをBranchGroupに登録していますが,複数の図形を1つの BranchGroupに登録することで,まとめて管理することができます。
また,図形オブジェクトを変形・移動させる等の「座標変換」をする際は, 直接図形ポリゴンに対してして操作を行うのではなく, このBranchGroupに対して操作を行うようになっています。 これの利点は,複数の図形パーツから成る複雑なオブジェクトを仮想空間内で移動させたい時や回転させたい時に, 一括して全パーツへ操作を行える点です。もしグループ化していないと,1つ1つの細かい図形に対して いちいち座標変換を施す必要が出てしまいます。これは非常に面倒です。
イメージとしては,BranchGroupにまとめられた複数の図形が集まって「複雑な1つの物体」を構成している感じです。 実用的なアプリケーションにおいては, 仮想空間内にそういった複雑な構成の物体が何個も存在することが十分あり得ます。よって,Universeは複数のBranchGroupを 持つことができます。 BranchGroup・・・直訳すると「枝グループ」ですが,仮想空間のUniverseからたくさんの「枝」が伸びるように BranchGroupが複数管理されている感じになります。ただし,最初のテストプログラムの時点から複雑な図形を表示する のは大変なので,今回は1つのBranchGroupだけを用意し,さらにBranchGroupの中に入っている図形も1つだけとしました。
それではテストプログラムを動かしてみましょう。以下のソースコードをコピペして, “Object_test.java”の名前で保存,コンパイル,実行します。 今回は,前回までのコメントを削ってあります。途中まで書かれている内容は前回と全く同じです。 最後の「SimpleUniverseにSphereを追加」のブロックだけが新しく加えられたところです。
//******************************************************************************
//Java3D Object_test
//UniverseにSphereを追加するだけ。
//******************************************************************************
//==============================================================================
//インポート・ファイル
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import java.awt.*;
import javax.swing.*;
//==============================================================================
//メイン・クラス
public class Object_test
{
//=============================================================================
//メイン・メソッド
public static void main(String[] args)
{
Object_test test = new Object_test();
}
//=============================================================================
//コンストラクタ
public Object_test()
{
//============================================================================
//まずは,基礎フレームの設定。
//============================================================================
JFrame frame = new JFrame();
frame.setSize(250,250);
frame.setTitle("Object_test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel cp = new JPanel();
cp.setLayout(null);
frame.add(cp);
//============================================================================
//次にJava3D関係の設定。
//============================================================================
GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(g_config);
canvas.setBounds(0,0,250,250);
cp.add(canvas);
//============================================================================
//空のSimpleUniverseを生成。
//============================================================================
SimpleUniverse universe = new SimpleUniverse(canvas);
frame.setVisible(true);
//============================================================================
//SimpleUniverseにSphereを追加
//============================================================================
//ブランチ・グループを生成
BranchGroup group1 = new BranchGroup();
//Sphereを生成(半径は0.5)
Sphere sphere = new Sphere(0.5f);
//sphereをブランチ・グループへ登録
group1.addChild(sphere);
//ブランチ・グループを仮想空間へ登録
universe.addBranchGraph(group1);
}
}
//ソースコードここまで。
//******************************************************************************
相変わらず真っ暗で何も映っていません(^^; 物体が置かれていたとしても, ライトとカメラを設定しないと正常に表示されないことが確認できました。 ここから先は,ソースコードの解説になります。新しく追加された部分だけ解説しています。
“com.sun.j3d.utils.geometry.*” というファイルが追加されています。Java3Dでは図形一般を“geometry”(ジオメトリ)と呼んでいます。 今回使用している球のプリミティブのクラスもここに含まれています。
BranchGroupを“group1”という名前で生成しています。また,球のプリミティブである Sphereクラスのインスタンスを“sphere”という名前で生成しています。コンストラクタの引数は球の半径であり, 引数の型はfloat型が指定されているので“0.5f”と,末尾にfをつけてfloatであることを 明示しています。大きさは適当です。
図形をBranchGroupに追加するには,addChild()メソッドを使います。引数には登録するオブジェクトを 入れます。また,BranchGroupをUniverseに追加するには,addBranchGraph()メソッドを使います。 引数には登録するBranchGroupを指定します。このメソッドの名前は「アド・ブランチ・グラフ」です。 (“addBrachGroup”:アド・ブランチ・グループ ではないんですね・・・紛らわしいです。)