トップページ > Java3D入門 > Java3Dの基礎知識(4)
今回は,必要最低限の要素であるカメラ,図形オブジェクト,ライトの全てが揃います。 ライトもこれまでと同様に,BranchGroupを用意してその中に登録する形になります。 既に用意されている図形オブジェクトなどのBranchGroupに含めることもできますが, 分かりやすくするために上の図のようにライト専用の独立したBranchGroupを作ることにします。
ライトの設定には,ライトの色,ライトの方向,ライトの効果が及ぶ範囲を決める必要があります。 これらの具体的な設定法はテストプログラムで確認します。
ライトには複数種類あるのですが,今回は“DirectionalLight”(ディレクショナル・ライト)を 使ったテストプログラムを書いてみます。DirectionalLightは「平行光源」とも呼ばれ, 一定方向へ全ての物体に均等な光を当てるライトです。おそらく最も無難な光源だと思います。
ライトを追加したテストプログラムです。以下のソースコードをコピペして, “Light_test.java”の名前で保存,コンパイル,実行します。 今回も,前回までのコメントを削ってあります。 最後の「ライトの設定」だけが新しく加えられたところです。
//****************************************************************************** //Java3D Light_test //ライトを追加 //****************************************************************************** //============================================================================== //インポート・ファイル import javax.media.j3d.*; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.*; import javax.vecmath.*; import java.awt.*; import javax.swing.*; //============================================================================== //メイン・クラス public class Light_test { //============================================================================= //メイン・メソッド public static void main(String[] args) { Light_test test = new Light_test(); } //============================================================================= //コンストラクタ public Light_test() { //============================================================================ //まずは,基礎フレームの設定。 //============================================================================ JFrame frame = new JFrame(); frame.setSize(250,250); frame.setTitle("Light_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 sphere = new Sphere(0.5f); group1.addChild(sphere); universe.addBranchGraph(group1); //============================================================================ //視点の設定 //============================================================================ ViewingPlatform camera = universe.getViewingPlatform(); camera.setNominalViewingTransform(); //============================================================================ //ライトの設定 //============================================================================ //ライトの色を設定 Color3f light_color = new Color3f(1.7f,1.7f,1.7f); //ライトの方向を設定 Vector3f light_direction = new Vector3f(0.2f,-0.2f,-0.6f); //ライト生成 DirectionalLight light = new DirectionalLight(light_color,light_direction); //球体領域を作成 BoundingSphere bounds = new BoundingSphere(); //ライトの効果範囲を設定 light.setInfluencingBounds(bounds); //ライトのためのBranchGroupを作る BranchGroup group2 = new BranchGroup(); //ライトをBranchGroupへ登録 group2.addChild(light); //ライトのためのブランチ・グループを仮想空間へ登録 universe.addBranchGraph(group2); } } //ソースコードここまで。 //******************************************************************************
やっと球が表示されました。図形オブジェクト,カメラ,ライトのどれか1つが欠ると何も画面に映らないことが わかりました。
新しく追加された“javax.vecmath.*” には,主にベクトル計算や行列計算のためのクラスが含まれています。 今回使用しているColor3fやVector3fはこのパッケージに登録されています。
Color3fというのは,R(Red:赤),G(Green:緑),B(Blue:青)の3つの色の強さを パラメータとして持つクラスです。ほぼフィールだけのクラスとも言えるので, 色設定のための構造体のようなイメージです。各パラメータはfloat型です。 パラメータをDouble型で定義できる“Color3d”というクラスもあります。
Vector3fというのは,x,y,zの座標の値をフィールドとして持ちます。 3次元ベクトルそのまんまのクラスです。各パラメータはfloat型です。 パラメータをDouble型で定義できる“Vector3d”というクラスもあります。
DirectionalLightを生成した後に,setInfluencingBounds()メソッドで ライトの適用範囲を指定します。今回は“BoundingSphere”という原点中心の 球形の適用範囲を使っています。BoundingSphereクラスのコンストラクタは, 引数に何もいれないと自動で半径1の球形領域を生成します。
最後にBranchGroupを作って,これまでと同様に登録作業をします。