トップページ > Java3D入門 > Java3Dの基礎知識(1)
Java3Dでは主に3次元の立体図形を扱うことになります。 3D図形を設置するためには3D空間が必要になりますが,この3D空間のことをJava3Dでは “Virtual Universe”(バーチャル・ユニバース)と呼んでいます。 「宇宙」なんですね…なんか大げさな感じです。 直訳して「仮想宇宙」と書くよりも「仮想空間」の方が頻繁に用いられる用語なので, このページでもJava3Dで扱う3次元空間のことを仮想空間と呼ぶことにします。
3D空間を表現するためには,メインとなる「3D図形オブジェクト」を空間内に配置します。 ただし,これだけでは画面には何も表示されません。図形オブジェクトを見る「視点」と, 図形オブジェクトを光で照らす「ライト」を仮想空間内に配置する必要があります。
視点はカメラのようなものです。カメラの場所・カメラの方向などを正しく設定しないと, 空間内に配置された図形オブジェクトを見ることができません。初期のデバッグ作業では 画面に何も映らなかった場合にカメラが原因なのか,それとも本当に図形オブジェクトが無いのか を考えながら行うことになります。
視点が正しく設定されていても,画面が真っ暗ということがあります。 仮想空間は「Universe」というだけあって,初期段階では物を照らす光が全くない 状態で生成されます。図形オブジェクトがあって,カメラがあっても, それを照らすライトを設定しないと何も見えない状態になります。 面倒だ・・・と感じるかもしれませんが,ライトを自分で設定することで 視覚的に面白い効果を出すことができる他,影の効果など非常にリアルな 表現が可能になっています。
Java3Dでは,3D仮想空間を表示するための“Canvas3D”というクラスが用意されています。 Javaで平面図形を描画するために用意されている“Canvas”クラスの3D版という感じです。 実際のアプリケーションを組む際は,最初にフレーム(空のウィンドウ)を 用意し,その上にコンテント・ペイン(実体はJPanel)を貼り付けます。 後は,他のGUI部品と同様にCanvas3Dをコンテント・ペイン上に張り付けるだけです。 コンテント・ペインは無くても構わないのですが, Canvas3D以外にたくさんのGUI部品をフレーム上に配置する場合はコンテント・ペインがあったほうが 便利です。さらに,後から全体をまとめてクラス化する時も重宝するので,今回はこの構成でいきます。
“SimpleUniverse”というのは,VirtualUniverseクラスのサブクラスで必要最低限の要素を既に含んだものです。 細かい設定をせずに,簡単に3D描画を行いたい場合はこのクラスを使ったほうが楽です。
ここではテストプログラムとして,Java3Dアプリケーションの最低限の骨組である「Canvas3Dを載せたウィンドウ」 を表示させてみます。何も面白くありません(汗)ただし,これは今後何度も出てくるものなので,最初に 確認しておくと後が楽です。
細かい説明は後回しにします。まずはテストプログラムを動かしてみましょう。 以下のソースコードをコピペして,“SimpleUniverse_test.java”の名前で保存,コンパイル,実行します。
//****************************************************************************** //Java3D SimpleUniverse_test //空のUniverseを表示するだけです。 //****************************************************************************** //============================================================================== //クラスのインポート import javax.media.j3d.*; import com.sun.j3d.utils.universe.*; import java.awt.*; import javax.swing.*; //============================================================================== //メイン・クラス public class SimpleUniverse_test { //============================================================================= //メイン・メソッド public static void main(String[] args) { SimpleUniverse_test test = new SimpleUniverse_test(); } //============================================================================= //コンストラクタ public SimpleUniverse_test() { //============================================================================ //まずは,基礎フレームの設定。 //============================================================================ //メイン・ウィンドウ作成 JFrame frame = new JFrame(); //ウィンドウのサイズ設定 frame.setSize(250,250); //ウィンドウのタイトル設定 frame.setTitle("SimpleUniverse_test"); //ウィンドウを閉じる動作の登録 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //コンテントペインを作成 JPanel cp = new JPanel(); //コンテントペイン上のレイアウトは全て手動で行う cp.setLayout(null); //フレームに,コンテントペインを登録 frame.add(cp); //============================================================================ //次にJava3D関係の設定。 //============================================================================ //現在使用している画面の,ハードウェア情報を取得する GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration(); //Canvas3Dは,3Dグラフィクスを表示する領域 Canvas3D canvas = new Canvas3D(g_config); //3D表示領域の大きさを設定。今回はウィンドウいっぱいに表示する canvas.setBounds(0,0,250,250); //コンテントペインにCanvas3Dを登録 cp.add(canvas); //============================================================================ //空のSimpleUniverseを生成。 //============================================================================ //仮想空間のインスタンスを生成。表示先としてcanvasを指定。 SimpleUniverse universe = new SimpleUniverse(canvas); //canvasにuniverseを登録後,ウィンドウ可視化 frame.setVisible(true); } } //ソースコードここまで。 //******************************************************************************
真っ暗です。物体もライトも無いので,こうなります。これから,この仮想空間にカメラやオブジェクトを追加する 作業をしていきます。
ここから先は,ソースコードの解説です。
“import javax.media.j3d.*;”でJava3D APIパッケージをインポートしています。これにはCanvas3Dをはじめ, 3D描画に関わる基本的なクラスが含まれています。“import com.sun.j3d.utils.universe.*;”では SimpleUniverseなど,仮想空間生成に関わるクラスがインポートされます。 “import java.awt.*;“と”import javax.swing.*;”はお馴染みですね。 GUIを使うために必要なクラスがインポートされています。
コンストラクタを呼んでいるだけです。
フレームを生成,フレームのタイトルとサイズ,「×ボタン」を押したときの処理について記述されています。 その後,コンテント・ペインを生成してフレームへ貼り付けます。 ここまでは普通のウィンドウ・アプリケーション作成の手順と全く同じです。
Cnavas3Dを生成しているところです。Canvas3Dを生成する際には,現在使用している画面のハードウェア的な 情報が必要となるので“SimpleUniverse.getPreferredConfiguration()”メソッドを呼んでハードウェア情報を 取得しています。後は,生成したCanvas3Dのサイズを設定してコンテント・ペインの上へ貼り付けています。
Canvas3Dのインスタンス,“canvas”を対象としてSimpleUniverseをインスタンス化,登録しています。 最後にGUI部品が全部そろったところで,setVisible(true)を呼んでウィンドウを表示しています。