//*********************************************** // 太陽の周りを衛星が回るアニメーション //*********************************************** /*・・・・・・・・・・・・・・・・・・・・ プログラムに必要なパッケージの取り込み ・・・・・・・・・・・・・・・・・・・・*/ import java.applet.*; import java.awt.*; import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.applet.MainFrame; /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ アプレットの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ public class AnimationOrbit extends Applet implements Runnable{ double R1 = 0.9; //球1の軌道の半径 double T1 = 6.0; //球1の周期 double R2 = 0.7; //球2の軌道の半径 double T2 = 4.5; //球2の周期 double R3 = 0.4; //球3の軌道の半径 double T3 = 2.5; //球3の周期 double R4 = 0.2; //球4の軌道の半径 double T4 = 1.5; //球4の周期 Transform3D transform3D1 = new Transform3D(); //sphere1の座標変換 Transform3D transform3D2 = new Transform3D(); //sphere2の座標変換 Transform3D transform3D3 = new Transform3D(); //sphere3の座標変換 Transform3D transform3D4 = new Transform3D(); //sphere4の座標変換 TransformGroup transformGroup0 = new TransformGroup(); //視点の設定用 TransformGroup transformGroup1 = new TransformGroup(); //球1 TransformGroup transformGroup2 = new TransformGroup(); //球2 TransformGroup transformGroup3 = new TransformGroup(); //球3 TransformGroup transformGroup4 = new TransformGroup(); //球4 Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); BorderLayout borderLayout = new BorderLayout( ); SimpleUniverse simpleUniverse = new SimpleUniverse( canvas3D ); BranchGroup objRoot = new BranchGroup( ); BoundingSphere boundingSphere = new BoundingSphere(); DirectionalLight directionalLight = new DirectionalLight( new Color3f( 1.0f,1.0f, 1.0f ), new Vector3f( -1.0f, -1.0f, -1.0f ) ); Appearance appearance0 = new Appearance( ); Material material0 = new Material( ); Appearance appearance1 = new Appearance( ); Material material1 = new Material( ); Appearance appearance2 = new Appearance( ); Material material2 = new Material( ); Appearance appearance3 = new Appearance( ); Material material3 = new Material( ); Appearance appearance4 = new Appearance( ); Material material4 = new Material( ); Sphere sphere0 = new Sphere( 0.07f, Sphere.GENERATE_NORMALS, appearance0 ); //中心の球 Sphere sphere1 = new Sphere( 0.02f, Sphere.GENERATE_NORMALS, appearance1 ); //周回する球1 Sphere sphere2 = new Sphere( 0.02f, Sphere.GENERATE_NORMALS, appearance2 ); //周回する球2 Sphere sphere3 = new Sphere( 0.02f, Sphere.GENERATE_NORMALS, appearance3 ); //周回する球3 Sphere sphere4 = new Sphere( 0.02f, Sphere.GENERATE_NORMALS, appearance4 ); //周回する球4 Thread th; float g_i = 0.0f; public AnimationOrbit( ){ transformGroup1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); transformGroup1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); transformGroup2.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); transformGroup2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); transformGroup3.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); transformGroup3.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); transformGroup4.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); transformGroup4.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); this.setLayout( borderLayout ); this.add( canvas3D, BorderLayout.CENTER ); simpleUniverse.getViewingPlatform( ).setNominalViewingTransform( ); directionalLight.setInfluencingBounds( boundingSphere ); objRoot.addChild( directionalLight ); material0.setDiffuseColor( new Color3f( 0.8f, 0.0f, 0.0f ) ); appearance0.setMaterial( material0 ); objRoot.addChild( sphere0 ); material1.setDiffuseColor( new Color3f( 0.2f, 0.9f, 0.4f ) ); appearance1.setMaterial( material1 ); transformGroup1.addChild( sphere1 ); objRoot.addChild( transformGroup1 ); material2.setDiffuseColor( new Color3f( 0.9f, 0.3f, 0.9f ) ); appearance2.setMaterial( material2 ); transformGroup2.addChild( sphere2 ); objRoot.addChild( transformGroup2 ); material3.setDiffuseColor( new Color3f( 0.1f, 0.9f, 1.0f ) ); appearance3.setMaterial( material3 ); transformGroup3.addChild( sphere3 ); objRoot.addChild( transformGroup3 ); material4.setDiffuseColor( new Color3f( 0.9f, 0.9f, 0.6f ) ); appearance4.setMaterial( material4 ); transformGroup4.addChild( sphere4 ); objRoot.addChild( transformGroup4 ); Transform3D transform3D0 = new Transform3D(); transform3D0.setTranslation(new Vector3d(0.0, 0.3, 2.3)); // 視点を (0.0,1.0,0.0) に設定 transformGroup0 = simpleUniverse.getViewingPlatform().getViewPlatformTransform(); transformGroup0.setTransform(transform3D0); simpleUniverse.addBranchGraph( objRoot ); th = new Thread(this); th.start(); } //end of public AnimationOrbit() /*・・・・・・・・・・・・・・・・・・・・・・・ 作成したクラスファイルの呼び出し ・・・・・・・・・・・・・・・・・・・・・・・*/ public static void main( String[ ] argV ){ AnimationOrbit animationOrbit = new AnimationOrbit( ); MainFrame mainFrame = new MainFrame( animationOrbit, 500, 500 ); } //end of main // この部分にアニメーションを書く public void run(){ int t; double x1, x2, x3, x4; //4つの球のX座標 double y=0.0; double z1, z2, z3, z4; //4つの球のZ座標 double omega1, omega2, omega3, omega4; //角速度 for(t=0; t<8000; t++){ // ○○回繰り返す omega1 = 0.02*Math.PI / T1; x1 = R1 * Math.cos( omega1 * t); z1 = R1 * Math.sin( omega1 * t); omega2 = 0.02*Math.PI / T2; x2 = R2 * Math.cos( omega2 * (t + 50)); z2 = R2 * Math.sin( omega2 * (t + 50)); omega3 = 0.02*Math.PI / T3; x3 = R3 * Math.cos( omega3 * (t + 100)); z3 = R3 * Math.sin( omega3 * (t + 100)); omega4 = 0.02*Math.PI / T4; x4 = R4 * Math.cos( omega4 * (t + 150)); z4 = R4 * Math.sin( omega4 * (t + 150)); try { transform3D1.setTranslation( new Vector3d(x1, y, z1)); transformGroup1.setTransform( transform3D1 ); transform3D2.setTranslation( new Vector3d(x2, y, z2)); transformGroup2.setTransform( transform3D2 ); transform3D3.setTranslation( new Vector3d(x3, y, z3)); transformGroup3.setTransform( transform3D3 ); transform3D4.setTranslation( new Vector3d(x4, y, z4)); transformGroup4.setTransform( transform3D4 ); Thread.sleep(10); } catch(InterruptedException e) { } }//end of for(t=0; t<=100; t++) }//end of public void run() }