トップページ > 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を作って,これまでと同様に登録作業をします。