Cosmo Scheduler DなどのLG3Dのアプリケーションを見ていると,いろいろとアプリケーションのアイデアが湧いてきませんか。

LG3Dを触っていると本当にいろいろなアイデアが湧いてきます。筆者は講演などでLG3Dに関して話をすることが何度かありました。そうした後には,決まって様々な方から「こんなことはできないか」とか「こんなことができるのではないか」とアイデアをうかがいます。

それらのアイデアには突飛なものもありますが,考えさせられるものも多くあります。

夢を語ることができ,またそれらを実際に実現できるLG3Dは,とても魅力あるプラットフォームだと思います。

さて,これらのアイデアを実現させることを考えてみましょう。LG3Dを使ったプログラムを作ってみて驚くのは,3Dであるにもかかわらず,プログラミングがとてもシンプルだということです。

そのシンプルさをわかっていただくために,LG3Dで簡単なプログラムを書いてみました。

3Dだということで肩肘を張ることはありません。JavaのGUIライブラリであるAWTやSwingでプログラムを作ったことがあれば,すぐに使いこなせるようになると思います。

さっそくプログラムを見ていきましょう。Cosmo Scheduler Dにならって,地球を表示するサンプルを用意しました。

まずはじめにFrame3DオブジェクトとComponent3Dオブジェクトを生成します。


  // フレームの生成
  Frame3D frame = new Frame3D();
  // コンポーネントの生成
  Component3D component = new Component3D();

AWT/Swingでは最初にFrame/JFrameオブジェクトを作成し,そこにコンポーネントを貼っていきます。LG3Dでも手順はほとんど変わりません。

LG3DでFrame/JFrameクラスに相当するのがorg.jdesktop.lg3d.wg.Frame3Dクラスになります。Containerクラスに相当するのがorg.jdesktop.lg3d.wg.Container3Dクラス,Component/JComponentクラスに相当するのがorg.jdesktop.lg3d.wg.Component3Dクラスです。

ただし,Frame3Dクラスにはアイコン化ボタンや最大,最小化ボタンなどは何もありません。単にアプリケーションのベース・コンテナであるというだけです。

Component3Dクラスは描画処理をシェイプに委譲します。シェイプは形状と表面の状態(アピアランス)を持つオブジェクトです。シェイプを作成している部分を示してみましょう。


  // 球の表面状態を表すアピアランスの生成
  // 表面にイメージを貼るため,引数にイメージ・ファイルを指定
  Appearance appearance = new SimpleAppearance("earth.jpg");

  // シェイプである球の生成
  // 第1引数 半径(単位はメートル)
  // 第2引数 イメージを貼るときに指定する定数
  // 第3引数 分割数 球は三角形のポリゴンで擬似的に表示されるので
  //         分割数が大きいほどなめらかに表示される
  // 第4引数 アピアランス
  Sphere sphere = new Sphere(0.1f, Sphere.GENERATE_TEXTURE_COORDS, 
    50, appearance);
Image File
図27 球の表面に貼るイメージ

アピアランスを表すのはorg.jdesktop.lg3d.sg.Appearanceクラスです。Appearanceクラスでは色だけでなく,反射率や表面に貼るイメージを設定できます。

ここではアピアランスを扱うために,Appearanceクラスの派生クラスであるorg.jdesktop.lg3d.utils.shape.SimpleAppearanceクラスを使用しました。

地球のイメージを貼るために,図27のようなイメージ・ファイル(earth.jpg)をコンストラクタの引数に指定しています。

次に行なっているのが,シェイプの生成です。シェイプは自作することも可能ですが,ここではorg.jdesktop.utils.shapeパッケージで定義されているSphereクラスを利用しました。Sphereクラスはその名の通り球を表しています。

コンストラクタの第1引数には球の半径を指定します。LG3Dでは単位はすべてメートルで表します。「0.1f」と指定しているので,この球の半径は10cmになります(fはfloat型であることを示します)。実際にだいたい10cmで表示されるはずです。第2引数はイメージを貼るときに指定する定数です。お約束だと思ってください。

第3引数は球の分割数になります。球は三角形の集まりとして,擬似的に表示されます。分割数はこの三角形の数であり,多ければ多いほどスムーズに表示されます。

第4引数が先ほど生成したアピアランスです。

ここまでできれば,あとは簡単です。


  // コンポーネントにシェイプを追加
  component.addChild(sphere);
  // フレームにコンポーネントを追加
  frame.addChild(component);

シェイプが生成できたので,それをコンポーネントに追加します。そして,コンポーネントをフレームに追加します。メソッド名が違うだけで,感覚的にはAWTやSwingと同じです。


  // フレームのサイズを設定する
  frame.setPreferredSize(new Vector3f(0.2f, 0.2f, 0.2f));
 
  // フレームの表示
  frame.changeEnabled(true);
  frame.changeVisible(true);

最後にフレームのサイズを設定します。setPreferredSizeは,ウィンドウ・マネージャがこのフレームを3D空間にレイアウトするときに使用するメソッドです。ちょうど,SwingでJComponent#setPreferredSizeメソッドを使用するのに似ています。

setPreferredSizeメソッドの引数は,Java3Dで3次元のベクトルを表すために使用するVector3fクラスです。

これですべての準備が整ったので,最後にフレームを表示させます。表示を行うには,changeEnabledメソッドとchangeVisibleメソッドを連続して呼び出します。それぞれのメソッドの役割は異なるのですが「フレームを表示するには,これら二つのメソッドをコールすればいい」と考えて問題ありません。

著者紹介 櫻庭祐一

横河電機の研究部門に勤務。同氏のJavaプログラマ向け情報ページ「Java in the Box」はあまりに有名