トップページ > Java3D入門 > Java3Dの基礎知識(4)

ライトについて

ライトを追加します

今回は,必要最低限の要素であるカメラ,図形オブジェクト,ライトの全てが揃います。 ライトもこれまでと同様に,BranchGroupを用意してその中に登録する形になります。 既に用意されている図形オブジェクトなどのBranchGroupに含めることもできますが, 分かりやすくするために上の図のようにライト専用の独立したBranchGroupを作ることにします。

ライトの設定には,ライトの色,ライトの方向,ライトの効果が及ぶ範囲を決める必要があります。 これらの具体的な設定法はテストプログラムで確認します。

ライトには複数種類あるのですが,今回は“DirectionalLight”(ディレクショナル・ライト)を 使ったテストプログラムを書いてみます。DirectionalLightは「平行光源」とも呼ばれ, 一定方向へ全ての物体に均等な光を当てるライトです。おそらく最も無難な光源だと思います。

試しにDirectionalLightを使ってみます

ライトを追加したテストプログラムです。以下のソースコードをコピペして, “Light_test.java”の名前で保存,コンパイル,実行します。 今回も,前回までのコメントを削ってあります。 最後の「ライトの設定」だけが新しく加えられたところです。

ソースコード : 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を作って,これまでと同様に登録作業をします。




前へ   戻る