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); |
図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」はあまりに有名 |