トップページ > Java3D入門 > 視点移動(4)

視点移動クラスを作る

ソースコード : Axis_class.java

//******************************************************************************
//座標軸のクラス “Axis_class.java”
//
//このクラスの“Axis_group”フィールドを,
//別プログラム内のSimpleUniverseのインスタンスへaddBranchGraph()して使用する
//******************************************************************************

//Java3D関係のインポート
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;

//フォント関係のためのインポート
import java.awt.*;

public class Axis_class 
{

 //=============================================================================
 //クラスのフィールド

 BranchGroup Axis_group;


 //=============================================================================
 //コンストラクタ (引数はサイズ)
 public Axis_class(float size)
 {
  //「枝」を作成
  Axis_group = new BranchGroup();

  //============================================================================
  //X軸
  //============================================================================
  
  //材質
  Appearance ap_x1 = new Appearance();
  Material mat_x1 = new Material();
  //表面効果
  mat_x1.setDiffuseColor(1.0f,0.0f,0.0f);
  //その他視覚効果
  ap_x1.setMaterial(mat_x1);
  //座標変換クラス
  TransformGroup tg_x1 = new TransformGroup();
  //座標変換の書き換えを許可
  tg_x1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  //座標変換内容
  Transform3D transform_x1 = new Transform3D();
  //円柱(引数は半径,長さ,材質)
  Cylinder x1 = new Cylinder(size/100.0f, size, ap_x1);
  //座標変換クラスへ軸を登録
  tg_x1.addChild(x1);
  transform_x1.rotZ(-Math.PI/2);
  tg_x1.setTransform(transform_x1);
  //全体の「枝」へ座標変換クラスを登録
  Axis_group.addChild(tg_x1);

  //材質
  Appearance ap_x2 = new Appearance();
  Material mat_x2 = new Material();
  //表面効果
  mat_x2.setDiffuseColor(1.0f,0.0f,0.0f);
  //その他視覚効果
  ap_x2.setMaterial(mat_x1);
  //座標変換クラス
  TransformGroup tg_x2 = new TransformGroup();
  //座標変換の書き換えを許可
  tg_x2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  //座標変換内容
  Transform3D transform_x2 = new Transform3D();
  //円錐(引数は半径,長さ,材質)
  Cone x2 = new Cone(size/100.0f*2.5f, size/10.0f, ap_x2);
  //座標変換クラスへ軸を登録
  tg_x2.addChild(x2);
  //全体の「枝」へ座標変換クラスを登録
  Axis_group.addChild(tg_x2);

  Transform3D rot_x2 = new Transform3D();
  rot_x2.rotZ(-Math.PI/2);
  Vector3f x2_vec = new Vector3f(size/2.0f, 0.0f, 0.0f);
  transform_x2.setTranslation(x2_vec);
  transform_x2.mul(rot_x2);
  tg_x2.setTransform(transform_x2);
  

  
  //============================================================================
  //Y軸
  //============================================================================
  
  //材質
  Appearance ap_y1 = new Appearance();
  Material mat_y1 = new Material();
  //表面効果
  mat_y1.setDiffuseColor(0.0f,1.0f,0.0f);
  //その他視覚効果
  ap_y1.setMaterial(mat_y1);
  //座標変換クラス
  TransformGroup tg_y1 = new TransformGroup();
  //座標変換の書き換えを許可
  tg_y1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  //座標変換内容
  Transform3D transform_y1 = new Transform3D();
  //円柱(引数は半径,長さ,材質)
  Cylinder y1 = new Cylinder(size/100.0f, size, ap_y1);
  //座標変換クラスへ軸を登録
  tg_y1.addChild(y1);
  //全体の「枝」へ座標変換クラスを登録
  Axis_group.addChild(tg_y1);


  //材質
  Appearance ap_y2 = new Appearance();
  Material mat_y2 = new Material();
  //表面効果
  mat_y2.setDiffuseColor(0.0f,1.0f,0.0f);
  //その他視覚効果
  ap_y2.setMaterial(mat_y1);
  //座標変換クラス
  TransformGroup tg_y2 = new TransformGroup();
  //座標変換の書き換えを許可
  tg_y2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  //座標変換内容
  Transform3D transform_y2 = new Transform3D();
  //円錐(引数は半径,長さ,材質)
  Cone y2 = new Cone(size/100.0f*2.5f, size/10.0f, ap_y2);
  //座標変換クラスへ軸を登録
  tg_y2.addChild(y2);
  //全体の「枝」へ座標変換クラスを登録
  Axis_group.addChild(tg_y2);
  Vector3f y2_vec = new Vector3f(0.0f, size/2.0f, 0.0f);
  transform_y2.setTranslation(y2_vec);
  tg_y2.setTransform(transform_y2);


  //============================================================================
  //Z軸
  //============================================================================
  
  //材質
  Appearance ap_z1 = new Appearance();
  Material mat_z1 = new Material();
  //表面効果
  mat_z1.setDiffuseColor(0.0f,0.0f,1.0f);
  //その他視覚効果
  ap_z1.setMaterial(mat_z1);
  //座標変換クラス
  TransformGroup tg_z1 = new TransformGroup();
  //座標変換の書き換えを許可
  tg_z1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  //座標変換内容
  Transform3D transform_z1 = new Transform3D();
  //円柱(引数は半径,長さ,材質)
  Cylinder z1 = new Cylinder(size/100.0f, size, ap_z1);
  //座標変換クラスへ軸を登録
  tg_z1.addChild(z1);
  transform_z1.rotX(Math.PI/2);
  tg_z1.setTransform(transform_z1);
  //全体の「枝」へ座標変換クラスを登録
  Axis_group.addChild(tg_z1);

  //材質
  Appearance ap_z2 = new Appearance();
  Material mat_z2 = new Material();
  //表面効果
  mat_z2.setDiffuseColor(0.0f,0.0f,1.0f);
  //その他視覚効果
  ap_z2.setMaterial(mat_z2);
  //座標変換クラス
  TransformGroup tg_z2 = new TransformGroup();
  //座標変換の書き換えを許可
  tg_z2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  //座標変換内容
  Transform3D transform_z2 = new Transform3D();
  //円錐(引数は半径,長さ,材質)
  Cone z2 = new Cone(size/100.0f*2.5f, size/10.0f, ap_z2);
  //座標変換クラスへ軸を登録
  tg_z2.addChild(z2);
  //全体の「枝」へ座標変換クラスを登録
  Axis_group.addChild(tg_z2);

  Transform3D rot_z2 = new Transform3D();
  rot_z2.rotX(Math.PI/2);
  Vector3f z2_vec = new Vector3f(0.0f, 0.0f, size/2.0f);
  transform_z2.setTranslation(z2_vec);
  transform_z2.mul(rot_z2);
  tg_z2.setTransform(transform_z2);


  //============================================================================
  //3Dテキスト
  //============================================================================

  //文字は白色
  Material mat_text = new Material();
  mat_text.setDiffuseColor(1.0f, 1.0f, 1.0f);
  Appearance ap_text = new Appearance();
  ap_text.setMaterial(mat_text);
  //フォントはArial,太字,大きさ
  Font basic_font = new Font("Arial", java.awt.Font.BOLD, 2);
  //3Dフォントを作成
  Font3D font = new Font3D(basic_font, new FontExtrusion());

  //X軸のテキスト(位置はX軸の先端)
  Text3D x_text = new Text3D(font, "X", new Point3f(size/2.0f + size/20.0f, 0.0f, 0.0f));
  Shape3D x_label = new Shape3D();	
  x_label.setGeometry(x_text);
  x_label.setAppearance(ap_text);  
  Axis_group.addChild(x_label);
  //Y軸のテキスト(位置はY軸の先端)
  Text3D y_text = new Text3D(font, "Y", new Point3f(0.0f, size/2.0f + size/20.0f, 0.0f));
  Shape3D y_label = new Shape3D();	
  y_label.setGeometry(y_text);
  y_label.setAppearance(ap_text);  
  Axis_group.addChild(y_label);
  //Z軸のテキスト(位置はZ軸の先端)
  Text3D z_text = new Text3D(font, "Z", new Point3f(0.0f, 0.0f, size/2.0f + size/20.0f));
  Shape3D z_label = new Shape3D();	
  z_label.setGeometry(z_text);
  z_label.setAppearance(ap_text);  
  Axis_group.addChild(z_label);
 } 
}

ソースコード : Axis_test.java

//******************************************************************************
//座標軸のテスト  “Axis_test.java”
//
//X軸,Y軸,Z軸を表示
//マウスでドラッグすることで視点移動
//※Canvas3D_ViewChangeクラスが必要
//******************************************************************************

//Swing関係のインポート
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

//Java3D関係のインポート
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;

public class Axis_test
{
 public static void main(String args[])
 {

  //============================================================================
  //まずは、基礎フレームの設定。
  //============================================================================
  //メイン・ウィンドウ作成
  JFrame frame = new JFrame();
  //ウィンドウのサイズ設定
  frame.setSize(400,400);
  //ウィンドウのタイトル設定
  frame.setTitle("ViewChange_test");
  //ウィンドウを閉じる動作の登録
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  //コンテントペインを作成
  JPanel cp = new JPanel();
  //コンテントペイン上のレイアウトは全て手動で行う
  cp.setLayout(null);
  //フレームに、コンテントペインを登録
  frame.add(cp);

  //============================================================================
  //次にJava3D関係の設定。
  //============================================================================
  //現在使用している画面の、ハードウェア情報を取得する
  GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration();
  //Cnavas3D_ViewChangeクラスを用意する(距離は40, マウス感度は0.03)
  Canvas3D_ViewChange canvas = new Canvas3D_ViewChange(40.0f, 0.03f, g_config);
  //3D表示領域の大きさを設定。今回はウィンドウいっぱいに表示する
  canvas.setBounds(0,0,400,400);
  //コンテントペインにCanvas3Dを登録
  cp.add(canvas);


  //============================================================================
  //3D空間を構築していきます
  //============================================================================
  //Canvas3DクラスのSimpleUniverseを利用。
  SimpleUniverse universe = canvas.universe; 

  //座標軸クラスをインスタンス化
  Axis_class axis = new Axis_class(20.0f);

  //universeへ登録
  universe.addBranchGraph(axis.Axis_group);


  //============================================================================
  //ライトの設定(いつもと同じ平行光源を設定)
  //============================================================================
  //ライトの強さ及び色
  Color3f light_color = new Color3f(3.4f,3.4f,3.4f);
  //ライトの方向
  Vector3f light_direction = new Vector3f(-0.8f,-1.2f,-1.0f);
  //平行光源を用意
  DirectionalLight light = new DirectionalLight(light_color,light_direction);
  //ライトで照らす範囲(球範囲で指定,中心座標とその半径)
  BoundingSphere bounds = new BoundingSphere(new Point3d( 0.0f , 0.0f , 0.0f ) , 1000);
  //範囲を登録
  light.setInfluencingBounds(bounds);
  //ライト用の「枝」を作る
  BranchGroup BranchGroup_Light = new BranchGroup();
  //「枝」にライトを登録
  BranchGroup_Light.addChild(light);
  //仮想空間に「枝」を登録
  universe.addBranchGraph(BranchGroup_Light);



  //ウィンドウを可視化
  frame.setVisible(true);
 } 
}

実行画面

マウスをドラッグすると視点が変わります。座標を表示することで「カメラの動き方」が分かりやすくなっていると思います。。。




前へ   戻る