/*------------*/ /* Ex62.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 Ex62 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 trans = new Transform3D(); BranchGroup branchG0 = new BranchGroup(); //背景色の設定(設定が無い場合は黒) Background background = new Background(new Color3f(0.3f, 0.3f, 0.3f)); background.setApplicationBounds(bounds); branchG0.addChild(background); //Interpolator用のノード TransformGroup transG0 = new TransformGroup(); branchG0.addChild(transG0); //光源を追加 branchG0.addChild(createDirectionalLight()); //平行光源 transG0.addChild(createPointLight()); //点光源 //Appearanceを作成 Appearance ap = new Appearance(); Material ma = new Material(); ap.setMaterial(ma); //Appearance[発光物体]を作成 Appearance ap2 = new Appearance(); Material ma2 = new Material(); ma2.setDiffuseColor(new Color3f(0.0f, 0.0f, 0.0f)); ma2.setEmissiveColor(new Color3f(1.0f, 0.0f, 0.0f)); ap2.setMaterial(ma2); //原点に球を作成 Sphere sphere = new Sphere(0.5f, Primitive.GENERATE_NORMALS, 80, ap); branchG0.addChild(sphere); //発光物体を作成 trans.setTranslation(new Vector3f(-0.8f, 0.0f, 0.0f)); TransformGroup transG1 = new TransformGroup(trans); transG0.addChild(transG1); Box box = new Box(0.01f, 0.01f, 0.01f, ap2); transG1.addChild(box); //回転のアニメーション設定 transG0.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); Transform3D rotAxis = new Transform3D(); Alpha rotationAlpha = new Alpha(-1, 4000); //1周期4s,繰返し RotationInterpolator rotator = //Y軸まわりの回転 new RotationInterpolator(rotationAlpha, transG0, rotAxis, 0.0f, (float)Math.PI*2.0f); //開始位置,終了位置 rotator.setSchedulingBounds(bounds); transG0.addChild(rotator); branchG0.compile(); return branchG0; } //平行光源を作成する private Light createDirectionalLight(){ DirectionalLight lightD = new DirectionalLight( true, //初期ライトON/OFF new Color3f(1.0f, 1.0f, 0.0f), //光の色 new Vector3f(-1.0f, -1.0f, -1.0f) //光のさす方向 ); lightD.setInfluencingBounds(bounds); //光が影響する範囲 return lightD; } //点光源を作成する private Light createPointLight(){ PointLight lightP = new PointLight( true, //初期ライトON/OFF new Color3f(1.0f, 0.0f, 0.0f), //赤の光 new Point3f(-0.7f, 0.0f, 0.0f), //光源の位置 new Point3f(1.0f, 0.0f, 0.0f) //光の減衰(constant,linear,quadratic) ); lightP.setInfluencingBounds(bounds); //光が影響する範囲 return lightP; } public void destroy(){ simpleU.cleanup(); } public static void main(String[] args){ //Application MainFrame frame = new MainFrame(new Ex62(), 512, 512); } }