トップページ > Java3D入門 > ポリゴン(3)
//******************************************************************************
//ポリゴンを作るテスト “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);
}
}