トップページ > 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); } }