/*--------------*/ /* Ex41.java */ /*--------------*/ import java.applet.Applet; import java.awt.*; //BorderLayout,GraphicsConfiguration,event 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 javax.vecmath.*; //Point3f,Color3f public class Ex41 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(){ //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); //[時計盤(大)]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.4f)); ap3.setColoringAttributes(ca3); //↓↓add =============================================== //[針]Appearanceを作成 Appearance ap = new Appearance(); ColoringAttributes ca = new ColoringAttributes(); ca.setColor(new Color3f( 0.0f, 0.0f, 0.0f)); ap.setColoringAttributes(ca); //↑↑add =============================================== //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); //↓↓add =============================================== //長針・短針用ノード trans.setTranslation(new Vector3f(0.0f, 0.0f, 0.2f)); //時計盤表面に移動 TransformGroup transG3 = new TransformGroup(trans); transG0.addChild(transG3); //長針を作成 Point3f[] points1 = new Point3f[4]; points1[0] = new Point3f( 0.01f, 0.00f, 0.0f); points1[1] = new Point3f( 0.01f, 0.40f, 0.0f); points1[2] = new Point3f(-0.01f, 0.40f, 0.0f); points1[3] = new Point3f(-0.01f, 0.00f, 0.0f); QuadArray quadA1 = new QuadArray(points1.length, GeometryArray.COORDINATES); quadA1.setCoordinates(0, points1); Shape3D shape1 = new Shape3D(quadA1, ap); transG3.addChild(shape1); //短針用ノード trans.rotZ(-Math.PI/2); TransformGroup transG4 = new TransformGroup(trans); transG3.addChild(transG4); //短針を作成 Point3f[] points2 = new Point3f[4]; points2[0] = new Point3f( 0.02f, 0.00f, 0.0f); points2[1] = new Point3f( 0.02f, 0.30f, 0.0f); points2[2] = new Point3f(-0.02f, 0.30f, 0.0f); points2[3] = new Point3f(-0.02f, 0.00f, 0.0f); QuadArray quadA2 = new QuadArray(points2.length, GeometryArray.COORDINATES); quadA2.setCoordinates(0, points2); Shape3D shape2 = new Shape3D(quadA2, ap); transG4.addChild(shape2); //↑↑add =============================================== branchG0.compile(); return branchG0; } public void destroy(){ simpleU.cleanup(); } public static void main(String[] args){ //Application MainFrame frame = new MainFrame(new Ex41(), 512, 512); } }