/*------------*/ /* Ex61.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 Ex61 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(){ BranchGroup branchG0 = new BranchGroup(); //背景色の設定(設定が無い場合は黒) Background background = new Background(new Color3f(0.3f, 0.3f, 0.3f)); background.setApplicationBounds(bounds); branchG0.addChild(background); //光源を追加 branchG0.addChild(createDirectionalLight()); //Switch用のノード TransformGroup transG0 = new TransformGroup(); branchG0.addChild(transG0); //Appearance1を作成 Appearance ap1 = new Appearance(); Material ma1 = new Material(); ma1.setDiffuseColor(new Color3f(0.75f, 0.60f, 0.23f)); ma1.setSpecularColor(new Color3f(0.63f, 0.56f, 0.37f)); ma1.setAmbientColor (new Color3f(0.25f, 0.2f, 0.07f)); ma1.setShininess(51.0f); ap1.setMaterial(ma1); //Appearance2を作成 Appearance ap2 = new Appearance(); Material ma2 = new Material(); ma2.setDiffuseColor(new Color3f(0.51f, 0.51f, 0.5f)); ma2.setSpecularColor(new Color3f(0.51f, 0.51f, 0.51f)); ma2.setAmbientColor (new Color3f(0.19f, 0.19f, 0.1f)); ma2.setShininess(61.0f); ap2.setMaterial(ma2); //Appearance3を作成 Appearance ap3 = new Appearance(); Material ma3 = new Material(); ma3.setDiffuseColor(new Color3f(0.1f, 0.35f, 0.1f)); ma3.setSpecularColor(new Color3f(0.45f, 0.55f, 0.45f)); ma3.setAmbientColor (new Color3f(0.0f, 0.0f, 0.0f)); ma3.setShininess(128.0f); ap3.setMaterial(ma3); //原点に物体を作成 TransformGroup transG1 = new TransformGroup(); Sphere sphere1 = new Sphere(0.5f, Primitive.GENERATE_NORMALS, 100, ap1); transG1.addChild(sphere1); //原点に物体を作成 TransformGroup transG2 = new TransformGroup(); Sphere sphere2 = new Sphere(0.5f, Primitive.GENERATE_NORMALS, 100, ap2); transG2.addChild(sphere2); //原点に物体を作成 TransformGroup transG3 = new TransformGroup(); Sphere sphere3 = new Sphere(0.5f, Primitive.GENERATE_NORMALS, 100, ap3); transG3.addChild(sphere3); //Switchを作成 Switch switchN = new Switch(); transG0.addChild(switchN); switchN.addChild(transG1); //Index=0 switchN.addChild(transG2); //Index=1 switchN.addChild(transG3); //Index=2 //物体切替のアニメーション設定 switchN.setCapability(Switch.ALLOW_SWITCH_WRITE); Alpha switchAlpha = new Alpha(-1, //無限に繰返し Alpha.INCREASING_ENABLE, //増加有効 0, 0, //開始時間,増加までの時間 5000, 2500, 0, //増加時間,加速時間,停止時間 0 , 0 , 0); //減少時間,加速時間,停止時間 SwitchValueInterpolator switcher = new SwitchValueInterpolator(switchAlpha, switchN, 0, 2); //Switchの開始と終了 switcher.setSchedulingBounds(bounds); transG0.addChild(switcher); branchG0.compile(); return branchG0; } //平行光源を作成する private Light createDirectionalLight(){ DirectionalLight lightD = new DirectionalLight(); //デフォルトの平行光源 lightD.setInfluencingBounds(bounds); //光が影響する範囲 return lightD; } public void destroy(){ simpleU.cleanup(); } public static void main(String[] args){ //Application MainFrame frame = new MainFrame(new Ex61(), 512, 512); } }