import java.applet.Applet; import java.awt.BorderLayout; import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.geometry.Cylinder; import com.sun.j3d.utils.geometry.Sphere; import com.sun.j3d.utils.image.TextureLoader; import com.sun.j3d.utils.universe.*; public class Tunnel extends Applet { /* --- Field --- */ private Canvas3D canvas; private SimpleUniverse universe; /* --- 初期化 --- */ public void init() { canvas=new Canvas3D(null); universe=new SimpleUniverse(canvas); universe.getViewingPlatform().setNominalViewingTransform(); universe.addBranchGraph(createSceneGraph()); setLayout(new BorderLayout()); add(canvas,BorderLayout.CENTER); } private BranchGroup createSceneGraph() { BranchGroup root; root=new BranchGroup(); root.addChild(createLight()); root.addChild(createTunnel()); root.addChild(createBall()); root.addChild(createCrystal()); return root; } private Node createLight() // 光源の設定 { Light light; BoundingSphere bounds; light=new PointLight(new Color3f(10.0f,10.0f,10.0f), new Point3f( 0.3f, 0.3f,10.0f), new Point3f( 0.1f, 0.1f, 0.0f)); // (0.3,0.3,10.0) の位置にある R=10.0,G=10.0,B=10.0 の明るさの点光源 bounds=new BoundingSphere(new Point3d(), Double.POSITIVE_INFINITY); light.setInfluencingBounds(bounds); // 有効範囲は無限 return light; } private Node createTunnel() // トンネルの設定 { Transform3D rotation; TransformGroup transform; Appearance appearance; Texture texture; Material material; Cylinder tunnel; rotation=new Transform3D(); rotation.rotX(Math.PI/2.0+Math.PI/180.0*5.0); transform=new TransformGroup(rotation); // x 軸で回転 appearance=new Appearance(); texture=new TextureLoader("tunnel.jpg",this).getTexture(); appearance.setTexture(texture); // テクスチャを貼る material=new Material(); material.setLightingEnable(true); appearance.setMaterial(material); // 光の反射具合の設定 tunnel=new Cylinder(1.0f,100.0f,Cylinder.GENERATE_NORMALS | Cylinder.GENERATE_NORMALS_INWARD | Cylinder.GENERATE_TEXTURE_COORDS, 300,100,appearance); transform.addChild(tunnel); // 半径 1.0、高さ 100.0 の円柱 (内側方向に法線を設定) return transform; } private Node createBall() // ボールの設定 { Transform3D translation; TransformGroup transform; Appearance appearance; Material material; Sphere ball; translation=new Transform3D(); translation.setTranslation(new Vector3d(0.4,0.4,-1.0)); transform=new TransformGroup(translation); // 平行移動 appearance=new Appearance(); material=new Material(); material.setDiffuseColor(0.01f,0.10f,0.02f); material.setSpecularColor(0.01f,0.10f,0.02f); material.setLightingEnable(true); appearance.setMaterial(material); // 光の反射具合を設定 ball=new Sphere(0.5f,Sphere.GENERATE_NORMALS,appearance); transform.addChild(ball); // 半径 0.5 の球 return transform; } private Node createCrystal() // 水晶の設定 { Transform3D translation,rotation; TransformGroup transform1,transform2; Appearance appearance; Material material; TransparencyAttributes transparent; Crystal crystal; translation=new Transform3D(); translation.setTranslation(new Vector3d(-0.3,-0.4,-0.5)); transform1=new TransformGroup(translation); // 平行移動 rotation=new Transform3D(); rotation.rotZ(Math.PI/180.0*30.0); transform2=new TransformGroup(rotation); transform1.addChild(transform2); // Z 軸で回転 appearance=new Appearance(); material=new Material(); material.setDiffuseColor(0.30f,0.01f,0.02f); material.setSpecularColor(0.90f,0.01f,0.09f); material.setShininess(1250); material.setLightingEnable(true); appearance.setMaterial(material); // 光の反射具合を設定 transparent=new TransparencyAttributes( TransparencyAttributes.BLENDED,0.5f); appearance.setTransparencyAttributes(transparent); // 透明度 0.5 crystal=new Crystal(appearance); transform2.addChild(crystal); // 水晶形 (リスト3) return transform1; } }