トップページ > Java3D入門 > ポリゴン(3)

ポリゴンのサンプルコード

ソースコード : Polygon_test.java

//******************************************************************************
//ポリゴンを作るテスト  “Polygon_test.java”
//
//※作成当時は時間が無かったので,気合いで座標を手打ちしています
//時間に余裕ができたらvertex配列を出力するエディタを作ります
//
//マウスでドラッグすることで視点移動
//※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("Polygon_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.1)
  Canvas3D_ViewChange canvas = new Canvas3D_ViewChange(40.0f, 0.1f, 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);


  //============================================================================
  //オブジェクト(?)を作成
  //============================================================================

  BranchGroup object_group = new BranchGroup();		

  //物体の形の形成(左回り??)
  Point3d[] vertex = new Point3d[76];

  //============================================================================
  //ここから頂点の座標

  //上1
  vertex[0] = new Point3d(-0.2,0.48,-0.8);
  vertex[1] = new Point3d(-0.8,0.48,0.0);
  vertex[2] = new Point3d(0.0,0.48,-0.3);
  vertex[3] = new Point3d(0.0,0.48,-0.8);

  vertex[4] = new Point3d(0.0,0.48,-0.8);
  vertex[5] = new Point3d(0.0,0.48,-0.3);
  vertex[6] = new Point3d(0.8,0.48,0.0);
  vertex[7] = new Point3d(0.2,0.48,-0.8);

  //右
  vertex[8] = new Point3d(0.8,0.48,0.0);
  vertex[9] = new Point3d(0.8,0.36,0.0);
  vertex[10] = new Point3d(0.2,0.36,-0.8);
  vertex[11] = new Point3d(0.2,0.48,-0.8);

  //奥
  vertex[12] = new Point3d(0.2,0.36,-0.8);
  vertex[13] = new Point3d(-0.2,0.36,-0.8);
  vertex[14] = new Point3d(-0.2,0.48,-0.8);
  vertex[15] = new Point3d(0.2,0.48,-0.8);

  //左
  vertex[16] = new Point3d(-0.2,0.48,-0.8);
  vertex[17] = new Point3d(-0.2,0.36,-0.8);
  vertex[18] = new Point3d(-0.8,0.36,0.0);
  vertex[19] = new Point3d(-0.8,0.48,0.0);
  
  //下1
  vertex[20] = new Point3d(-0.2,0.36,-0.8);
  vertex[21] = new Point3d(0.0,0.36,-0.8);
  vertex[22] = new Point3d(0.0,0.36,-0.3);
  vertex[23] = new Point3d(-0.8,0.36,0.0);
  //下2
  vertex[24] = new Point3d(0.0,0.36,-0.8);
  vertex[25] = new Point3d(0.2,0.36,-0.8);
  vertex[26] = new Point3d(0.8,0.36,0.0);
  vertex[27] = new Point3d(0.0,0.36,-0.3);

  //手前左	
  vertex[28] = new Point3d(-0.8,0.48,0.0);
  vertex[29] = new Point3d(-0.8,0.36,0.0);
  vertex[30] = new Point3d(0.0,0.36,-0.3);
  vertex[31] = new Point3d(0.0,0.48,-0.3);
  
  //手前右	
  vertex[32] = new Point3d(0.0,0.48,-0.3);
  vertex[33] = new Point3d(0.0,0.36,-0.3);
  vertex[34] = new Point3d(0.8,0.36,0.0);
  vertex[35] = new Point3d(0.8,0.48,0.0);


  //============================================================================
 
  //先端上
  vertex[36] = new Point3d(-0.03,0.46,-1.8);
  vertex[37] = new Point3d(-0.14,0.48,-0.8);
  vertex[38] = new Point3d(0.14,0.48,-0.8);
  vertex[39] = new Point3d(0.03,0.46,-1.8);

  //先端下
  vertex[40] = new Point3d(0.03,0.42,-1.8);
  vertex[41] = new Point3d(0.14,0.36,-0.8);
  vertex[42] = new Point3d(-0.14,0.36,-0.8);
  vertex[43] = new Point3d(-0.03,0.42,-1.8);

  //先端右	
  vertex[44] = new Point3d(0.14,0.48,-0.8);
  vertex[45] = new Point3d(0.14,0.36,-0.8);
  vertex[46] = new Point3d(0.03,0.42,-1.8);
  vertex[47] = new Point3d(0.03,0.46,-1.8);

  //先端左	
  vertex[48] = new Point3d(-0.03,0.42,-1.8);
  vertex[49] = new Point3d(-0.14,0.36,-0.8);
  vertex[50] = new Point3d(-0.14,0.48,-0.8);
  vertex[51] = new Point3d(-0.03,0.46,-1.8);

  //先端奥	
  vertex[52] = new Point3d(0.03,0.46,-1.8);
  vertex[53] = new Point3d(0.03,0.42,-1.8);
  vertex[54] = new Point3d(-0.03,0.42,-1.8);
  vertex[55] = new Point3d(-0.03,0.46,-1.8);

  //============================================================================

  //翼右
  vertex[56] = new Point3d(0.03,0.48,-0.2);
  vertex[57] = new Point3d(0.03,0.48,-0.7);
  vertex[58] = new Point3d(0.03,1.08,0.3);
  vertex[59] = new Point3d(0.03,1.1,0.4);

  //翼左
  vertex[60] = new Point3d(-0.03,0.48,-0.7);
  vertex[61] = new Point3d(-0.03,0.48,-0.2);
  vertex[62] = new Point3d(-0.03,1.1,0.4);
  vertex[63] = new Point3d(-0.03,1.08,0.3);

  //翼上
  vertex[64] = new Point3d(-0.03,1.08,0.3);
  vertex[65] = new Point3d(-0.03,1.1,0.4);
  vertex[66] = new Point3d(0.03,1.1,0.4);
  vertex[67] = new Point3d(0.03,1.08,0.3);

  //翼前
  vertex[68] = new Point3d(-0.03,0.48,-0.7);
  vertex[69] = new Point3d(-0.03,1.08,0.3);
  vertex[70] = new Point3d(0.03,1.08,0.3);
  vertex[71] = new Point3d(0.02,0.48,-0.7);
          
  //翼後
  vertex[72] = new Point3d(-0.03,1.1,0.4);
  vertex[73] = new Point3d(-0.03,0.48,-0.2);
  vertex[74] = new Point3d(0.03,0.48,-0.2);
  vertex[75] = new Point3d(0.03,1.1,0.4);

  //頂点座標ここまで
  //============================================================================

  //物体色の設定
  Color3f enemy_color[]  = new Color3f[vertex.length];
  for(int i=0;i < vertex.length;i++)
  {
    enemy_color[i] = new Color3f(1.0f, 0.0f, 0.0f);
  }

  //外見の設定
  Appearance ap = new Appearance();
  Material mat = new Material();
  mat.setLightingEnable(true);
  ap.setMaterial(mat);
  
  //物体の登録
  GeometryInfo gi = new GeometryInfo(GeometryInfo.QUAD_ARRAY);	 
  gi.setCoordinates(vertex);
  gi.setColors(enemy_color);	

  //頂点の設定
  NormalGenerator ng = new NormalGenerator();
  ng.generateNormals(gi);

  GeometryArray ga = gi.getGeometryArray();
  Shape3D shape = new Shape3D(ga,ap);

  TransformGroup tg = new TransformGroup();
  Transform3D tr = new Transform3D();
  tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  object_group.addChild(tg);
  tg.addChild(shape);

  //拡大,回転
  Vector3d zoom = new Vector3d(6, 6, 6);
  tr.setScale(zoom);  
  Transform3D object_rot = new Transform3D();
  object_rot.rotY(Math.PI);
  tr.mul(object_rot);
  tg.setTransform(tr);

  //unigerseに登録
  universe.addBranchGraph(object_group);


  //============================================================================
  //弾オブジェクト(?)を作成
  //============================================================================

  BranchGroup bullet_group = new BranchGroup();		

  //============================================================================
  //ここから頂点の座標(左回り)

  //上
  Point3d[] vertex_bullet = new Point3d[48]; 
  vertex_bullet[0] = new Point3d(-0.12,0.02,-0.2);
  vertex_bullet[1] = new Point3d(-0.17,0.02,0.0);
  vertex_bullet[2] = new Point3d(-0.05,0.02,0.0);
  vertex_bullet[3] = new Point3d(-0.10,0.02,-0.2);

  //右
  vertex_bullet[4] = new Point3d(-0.05,0.02,0.0);
  vertex_bullet[5] = new Point3d(-0.05,-0.02,0.0);
  vertex_bullet[6] = new Point3d(-0.1,-0.02,-0.2);
  vertex_bullet[7] = new Point3d(-0.1,0.02,-0.2);

  //手前
  vertex_bullet[8] = new Point3d(-0.17,0.02,0.0);
  vertex_bullet[9] = new Point3d(-0.17,-0.02,0.0);
  vertex_bullet[10] = new Point3d(-0.05,-0.02,0.0); 
  vertex_bullet[11] = new Point3d(-0.05,0.02,0.0);

  //左
  vertex_bullet[12] = new Point3d(-0.12,0.02,-0.2);
  vertex_bullet[13] = new Point3d(-0.12,-0.02,-0.2);
  vertex_bullet[14] = new Point3d(-0.17,-0.02,0.0);
  vertex_bullet[15] = new Point3d(-0.17,0.02,0.0);

  //下
  vertex_bullet[16] = new Point3d(-0.10,-0.02,-0.2);
  vertex_bullet[17] = new Point3d(-0.05,-0.02,0.0);
  vertex_bullet[18] = new Point3d(-0.17,-0.02,0.0);
  vertex_bullet[19] = new Point3d(-0.12,-0.02,-0.2);

  //奥	
  vertex_bullet[20] = new Point3d(-0.1,0.02,-0.2);
  vertex_bullet[21] = new Point3d(-0.1,-0.02,-0.2);
  vertex_bullet[22] = new Point3d(-0.12,-0.02,-0.2);
  vertex_bullet[23] = new Point3d(-0.12,0.02,-0.2);

  //==============================================================================================
  //上2
  vertex_bullet[24] = new Point3d(0.10,0.02,-0.2);
  vertex_bullet[25] = new Point3d(0.05,0.02,0.0);
  vertex_bullet[26] = new Point3d(0.17,0.02,0.0);
  vertex_bullet[27] = new Point3d(0.12,0.02,-0.2);

  //右2
  vertex_bullet[28] = new Point3d(0.17,0.02,0.0);
  vertex_bullet[29] = new Point3d(0.17,-0.02,0.0);
  vertex_bullet[30] = new Point3d(0.12,-0.02,-0.2);
  vertex_bullet[31] = new Point3d(0.12,0.02,-0.2);

  //手前2
  vertex_bullet[32] = new Point3d(0.05,0.02,0.0);
  vertex_bullet[33] = new Point3d(0.05,-0.02,0.0);
  vertex_bullet[34] = new Point3d(0.17,-0.02,0.0);
  vertex_bullet[35] = new Point3d(0.17,0.02,0.0);

  //左2
  vertex_bullet[36] = new Point3d(0.10,0.02,-0.2);
  vertex_bullet[37] = new Point3d(0.10,-0.02,-0.2);
  vertex_bullet[38] = new Point3d(0.05,-0.02,0.0);
  vertex_bullet[39] = new Point3d(0.05,0.02,0.0);

  //下2
  vertex_bullet[40] = new Point3d(0.12,-0.02,-0.2);
  vertex_bullet[41] = new Point3d(0.17,-0.02,0.0);
  vertex_bullet[42] = new Point3d(0.05,-0.02,0.0);
  vertex_bullet[43] = new Point3d(0.1,-0.02,-0.2);

  //奥2	
  vertex_bullet[44] = new Point3d(0.12,0.02,-0.2);
  vertex_bullet[45] = new Point3d(0.12,-0.02,-0.2);
  vertex_bullet[46] = new Point3d(0.1,-0.02,-0.2);
  vertex_bullet[47] = new Point3d(0.1,0.02,-0.2);

  //頂点座標ここまで
  //============================================================================


  //物体色の設定
  Color3f pb_color[]  = new Color3f[vertex_bullet.length];
  for(int i=0;i < vertex_bullet.length;i++)
  {
    pb_color[i] = new Color3f(0.0f,0.6f,0.8f);
  }

  //外見の設定
  Appearance ap_bullet = new Appearance();
  Material mat_bullet = new Material();
  mat_bullet.setLightingEnable(true);
  ap_bullet.setMaterial(mat_bullet);

  //物体の登録
  GeometryInfo gi_bullet = new GeometryInfo(GeometryInfo.QUAD_ARRAY);	
  gi_bullet.setCoordinates(vertex_bullet);
  gi_bullet.setColors(pb_color);	

  //法線の設定
  NormalGenerator ng_bullet = new NormalGenerator();
  ng_bullet.generateNormals(gi_bullet);

  //トランスフォームの設定
  GeometryArray ga_bullet = gi_bullet.getGeometryArray();
  Shape3D shape_bullet = new Shape3D(ga_bullet,ap_bullet);

  TransformGroup tg_bullet = new TransformGroup();
  Transform3D tr_bullet = new Transform3D();
  tg_bullet.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  bullet_group.addChild(tg_bullet);
  tg_bullet.addChild(shape_bullet);

  //拡大,回転
  Vector3d zoom2 = new Vector3d(10, 10, 10);
  tr_bullet.setScale(zoom2);
  Transform3D bullet_rot = new Transform3D();
  bullet_rot.rotY(Math.PI);
  tr_bullet.mul(bullet_rot);
  tg_bullet.setTransform(tr_bullet);

  //universeに登録
  universe.addBranchGraph(bullet_group);



  //============================================================================
  //ライトの設定(いつもと同じ平行光源を設定)
  //============================================================================
  //ライトの強さ及び色
  Color3f light_color = new Color3f(3.4f,3.4f,3.4f);
  //ライトの方向
  Vector3f light_direction = new Vector3f(0.8f,-1.0f,-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);
 }
 
}