/*--------------*/ /* Wk52.java */ /*--------------*/ /*-----------------------*/ /* 時計のアニメーション */ /*-----------------------*/ import java.applet.Applet; import java.awt.*; //BorderLayout,GraphicsConfiguration,event import java.util.Calendar; //Calender import javax.media.j3d.*; //Java3d import com.sun.j3d.utils.applet.MainFrame; //MainFrame import com.sun.j3d.utils.universe.*; //SimpleUniverse import com.sun.j3d.utils.geometry.*; //Primitive import com.sun.j3d.utils.behaviors.mouse.*; //Mouse import javax.vecmath.*; //Point3f,Color3f public class Wk52 extends Applet{ private SimpleUniverse simpleU; private BoundingSphere bounds = new BoundingSphere(new Point3d(), 10.0); public void init(){ //アプレットの中央にCanvas3Dを追加 setLayout(new BorderLayout()); Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); add(canvas, BorderLayout.CENTER); //シーングラフの生成 simpleU = new SimpleUniverse(canvas); simpleU.getViewingPlatform().setNominalViewingTransform(); //シーングラフの作成 simpleU.addBranchGraph(createSceneGraph()); } private BranchGroup createSceneGraph(){ //現在時刻取得 Calendar cal = Calendar.getInstance(); int hour = cal.get(Calendar.HOUR_OF_DAY); int minute = cal.get(Calendar.MINUTE); //Transform3Dオブジェクト Transform3D trans = new Transform3D(); //平行移動用 Transform3D rot = new Transform3D(); //回転用 BranchGroup branchG0 = new BranchGroup(); //背景色の設定(設定が無い場合は黒) Background background = new Background(new Color3f(0.3f, 0.3f, 0.3f)); background.setApplicationBounds(bounds); branchG0.addChild(background); //---------------------// // Appearanceの設定 // //---------------------// //[時計盤(大)]Appearance1を作成 Appearance ap1 = new Appearance(); ColoringAttributes ca1 = new ColoringAttributes(); ca1.setColor(new Color3f( 0.5f, 0.9f, 0.5f)); ap1.setColoringAttributes(ca1); //[時計盤(小)]Appearance2を作成 Appearance ap2 = new Appearance(); ColoringAttributes ca2 = new ColoringAttributes(); ca2.setColor(new Color3f( 0.7f, 1.0f, 0.7f)); ap2.setColoringAttributes(ca2); //[台]Appearance3を作成 Appearance ap3 = new Appearance(); ColoringAttributes ca3 = new ColoringAttributes(); ca3.setColor(new Color3f( 1.0f, 1.0f, 0.5f)); ap3.setColoringAttributes(ca3); //[針止め]Appearance4を作成 Appearance ap4 = new Appearance(); ColoringAttributes ca4 = new ColoringAttributes(); ca4.setColor(new Color3f( 0.5f, 0.0f, 0.5f)); ap4.setColoringAttributes(ca4); //[秒針]Appearance5を作成 Appearance ap5 = new Appearance(); ColoringAttributes ca5 = new ColoringAttributes(); ca5.setColor(new Color3f( 0.4f, 0.4f, 0.4f)); ap5.setColoringAttributes(ca5); //[長針]Appearance6を作成 Appearance ap6 = new Appearance(); ColoringAttributes ca6 = new ColoringAttributes(); ca6.setColor(new Color3f( 0.4f, 0.2f, 1.0f)); ap6.setColoringAttributes(ca6); //[短針]Appearance7を作成 Appearance ap7 = new Appearance(); ColoringAttributes ca7 = new ColoringAttributes(); ca7.setColor(new Color3f( 1.0f, 0.2f, 0.4f)); ap7.setColoringAttributes(ca7); //transG0:マウス操作用ノード TransformGroup transG0 = new TransformGroup(); branchG0.addChild(transG0); //---------------------// // 物体の生成 // //---------------------// //[時計盤]を作成 rot.rotX(Math.PI/2); //90度回転 TransformGroup transG1 = new TransformGroup(rot); transG0.addChild(transG1); Cylinder cylinder1 = new Cylinder(0.60f, 0.30f, ap1); Cylinder cylinder2 = new Cylinder(0.42f, 0.31f, ap2); transG1.addChild(cylinder1); transG1.addChild(cylinder2); //[台]を作成 trans.setTranslation(new Vector3f(0.0f, -0.65f, 0.0f)); TransformGroup transG2 = new TransformGroup(trans); transG0.addChild(transG2); Box box1 = new Box(0.5f, 0.1f, 0.3f, ap3); transG2.addChild(box1); //時計表面に移動 trans.setTranslation(new Vector3f(0.0f, 0.0f, 0.2f)); TransformGroup transG3 = new TransformGroup(trans); transG0.addChild(transG3); //[針止め]を作成 rot.rotX(Math.PI/2); //90度回転 TransformGroup transG31 = new TransformGroup(rot); transG3.addChild(transG31); Cone cone1 = new Cone(0.05f, 0.1f, ap4); transG31.addChild(cone1); //[秒針]を作成 TransformGroup transG32 = new TransformGroup(); transG3.addChild(transG32); createArrow(0.015f, 0.40f, 0.01f, ap5, transG32); //[長針]を作成 TransformGroup transG33 = new TransformGroup(); transG3.addChild(transG33); rot.rotZ(-(2*Math.PI)*((double)minute/60)); TransformGroup transG331 = new TransformGroup(rot); transG33.addChild(transG331); createArrow(0.02f, 0.45f, 0.0f, ap7, transG331); //[短針]を作成 TransformGroup transG34 = new TransformGroup(); transG3.addChild(transG34); rot.rotZ(-(2*Math.PI)*((double)((hour)*60+minute)/(12*60))); TransformGroup transG341 = new TransformGroup(rot); transG34.addChild(transG341); createArrow(0.04f, 0.35f, -0.01f, ap6, transG341); //2D文字盤を作成 String AnatimeStr[] = {"3","2","1","12","11","10","9","8","7","6","5","4"}; for(int i=0;i