/*--------------*/ /* Wk71.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 com.sun.j3d.utils.image.TextureLoader; //TextureLoader import javax.vecmath.*; //Point3f,Color3f import java.awt.event.*; //Listener public class Wk71 extends Applet{ private SimpleUniverse simpleU; private BoundingSphere bounds = new BoundingSphere(new Point3d(), 10.0); Background background; //背景 PolygonAttributes pa; //ポリゴン属性 private Point3f lightPos = new Point3f(-0.7f, 0.8f, 0.2f); private Color3f lightColor = new Color3f(0.8f, 0.8f, 0.0f); 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 = new Background(new Color3f(0.3f, 0.3f, 0.3f)); background.setApplicationBounds(bounds); branchG0.addChild(background); //---------------------// // Appearanceの設定 // //---------------------// //ポリゴン属性(全パーツ共通) pa = new PolygonAttributes(); pa.setPolygonMode(PolygonAttributes.POLYGON_FILL); //初期値はソリッド //[時計盤(大)]Appearance1を作成 Appearance ap1 = new Appearance(); ColoringAttributes ca1 = new ColoringAttributes(); ca1.setColor(new Color3f( 0.5f, 0.9f, 0.5f)); ap1.setColoringAttributes(ca1); ap1.setPolygonAttributes(pa); Material ma1 = new Material(); ma1.setDiffuseColor(new Color3f( 0.5f, 0.9f, 0.5f)); ma1.setAmbientColor(new Color3f( 0.2f, 0.2f, 0.2f)); ma1.setSpecularColor(new Color3f( 0.2f, 0.2f, 0.2f)); ma1.setShininess(1.0f); ap1.setMaterial(ma1); //[時計盤(小)]Appearance2を作成 Appearance ap2 = new Appearance(); ColoringAttributes ca2 = new ColoringAttributes(); ca2.setColor(new Color3f( 0.7f, 1.0f, 0.7f)); ap2.setColoringAttributes(ca2); ap2.setPolygonAttributes(pa); Material ma2 = new Material(); ma2.setDiffuseColor(new Color3f( 0.7f, 1.0f, 0.7f)); ma2.setAmbientColor(new Color3f( 0.2f, 0.2f, 0.2f)); ma2.setSpecularColor(new Color3f( 0.2f, 0.2f, 0.2f)); ma2.setShininess(1.0f); ap2.setMaterial(ma2); //[台]Appearance3を作成 Appearance ap3 = new Appearance(); ColoringAttributes ca3 = new ColoringAttributes(); ca3.setColor(new Color3f( 1.0f, 1.0f, 0.5f)); ap3.setColoringAttributes(ca3); ap3.setPolygonAttributes(pa); Material ma3 = new Material(); ma3.setDiffuseColor(new Color3f( 1.0f, 1.0f, 0.5f)); ma3.setAmbientColor(new Color3f( 0.2f, 0.2f, 0.2f)); ma3.setSpecularColor(new Color3f( 0.2f, 0.2f, 0.2f)); ma3.setShininess(1.0f); ap3.setMaterial(ma3); //[針止め]Appearance4を作成 Appearance ap4 = new Appearance(); ColoringAttributes ca4 = new ColoringAttributes(); ca4.setColor(new Color3f( 0.5f, 0.0f, 0.5f)); ap4.setColoringAttributes(ca4); ap4.setPolygonAttributes(pa); Material ma4 = new Material(); ma4.setDiffuseColor(new Color3f( 0.5f, 0.0f, 0.5f)); ma4.setAmbientColor(new Color3f( 0.2f, 0.2f, 0.2f)); ma4.setSpecularColor(new Color3f( 0.2f, 0.2f, 0.2f)); ma4.setShininess(1.0f); ap4.setMaterial(ma4); //[秒針]Appearance5を作成 Appearance ap5 = new Appearance(); ColoringAttributes ca5 = new ColoringAttributes(); ca5.setColor(new Color3f( 0.4f, 0.4f, 0.4f)); ap5.setColoringAttributes(ca5); ap5.setPolygonAttributes(pa); //[長針]Appearance6を作成 Appearance ap6 = new Appearance(); ColoringAttributes ca6 = new ColoringAttributes(); ca6.setColor(new Color3f( 0.4f, 0.2f, 1.0f)); ap6.setColoringAttributes(ca6); ap6.setPolygonAttributes(pa); //[短針]Appearance7を作成 Appearance ap7 = new Appearance(); ColoringAttributes ca7 = new ColoringAttributes(); ca7.setColor(new Color3f( 1.0f, 0.2f, 0.4f)); ap7.setColoringAttributes(ca7); ap7.setPolygonAttributes(pa); //[光源]Appearance8を作成 Appearance ap8 = new Appearance(); ColoringAttributes ca8 = new ColoringAttributes(); ca8.setColor(lightColor); ap8.setColoringAttributes(ca8); Material ma5 = new Material(); ma5.setDiffuseColor(lightColor); ap8.setMaterial(ma5); //時計台にテクスチャの設定 java.net.URL texFile = null; try{ texFile = new java.net.URL(getCodeBase().toString() + "yellow32.jpg"); }catch(java.net.MalformedURLException ex){ System.out.println(ex.getMessage()); } TexCoordGeneration texGen = new TexCoordGeneration(TexCoordGeneration.EYE_LINEAR, TexCoordGeneration.TEXTURE_COORDINATE_2, new Vector4f(10.0f, 0.0f, 0.0f, 0.0f), new Vector4f(0.0f, 10.0f, 0.0f, 0.0f)); ap3.setTexCoordGeneration(texGen); TextureLoader loader = new TextureLoader(texFile, this); Texture texture = loader.getTexture(); ap3.setTexture(texture); //transG0:マウス操作用ノード TransformGroup transG0 = new TransformGroup(); branchG0.addChild(transG0); //光源を追加 branchG0.addChild(createDirectionalLight()); branchG0.addChild(createPointLight()); //点光源 //---------------------// // 物体の生成 // //---------------------// //[時計盤]を作成 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