地球がまわる


Sphere(球)に地球のテクスチャを張り付けて回転します。

Java Applet の実行は、次のリンクをクリックして下さい。
地球がまわる

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして applet_earth.java の名前で保存して下さい。
    //★ Sphere に地球のテクスチャを張り付けて自動回転する
    import java.applet.Applet;
    import java.awt.*;
    import java.io.*;
    import java.net.URL;
    import javax.swing.*;
    import javax.imageio.ImageIO;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.geometry.*;
    import com.sun.j3d.utils.image.TextureLoader;
    import java.awt.image.BufferedImage;
    
    public class applet_earth extends Applet
    {   private SimpleUniverse universe = null;
    
        // Applet 初期化
        public void init()
        {   setLayout(new BorderLayout());
    
            // Java3D関係の設定
            GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(g_config);
            add(canvas);
    
            // SimpleUniverseを生成
            universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // シーンの生成
            universe.addBranchGraph(createSceneGraph(getCodeBase().toString() + "earth.jpg"));
        }
    
        // シーンを生成
        private BranchGroup createSceneGraph(String path)
        {   BranchGroup objRoot = new BranchGroup();
            objRoot.setCapability(BranchGroup.ALLOW_DETACH);
            Bounds bounds = new BoundingSphere(new Point3d(), 100.0);
    
            // Light の設定
            Light light = new DirectionalLight();
            light.setInfluencingBounds(bounds);
            objRoot.addChild(light);
    
            // 背景色の設定
            Background bg = new Background(new Color3f(0.5f, 0.5f, 0.5f));
            bg.setApplicationBounds(bounds);
            objRoot.addChild(bg);
    
            // 座標変換の設定
            TransformGroup trans = new TransformGroup();
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
            // モデルの回転設定
            Transform3D yAxis = new Transform3D();
            Alpha rotationAlpha = new Alpha(-1, 4000);  // 繰り返し回数:無限  変化時間:4秒
            RotationInterpolator rotator =
                new RotationInterpolator(rotationAlpha, trans, yAxis, 0.0f, (float)Math.PI*2.0f);
            rotator.setSchedulingBounds(bounds);
            objRoot.addChild(rotator);
    
            // 球を生成
            Sphere earth = new Sphere(0.7f,Sphere.GENERATE_TEXTURE_COORDS,50,createAppearance(path));
            trans.addChild(earth);
            objRoot.addChild(trans);
    
            return objRoot;
        }
    
        // テクスチャーを設定
        private Appearance createAppearance(String path)
        {   Appearance app = new Appearance();
            BufferedImage bimage = loadImage(path);
            Texture2D texture2d = (Texture2D)new TextureLoader(bimage, this).getTexture();
            app.setTexture(texture2d);
            return app;
        }
    
        // 画像の入力
        public BufferedImage loadImage(String path)
        {   BufferedImage img = null;
            {   try
                {   URL u = new URL(path);
                    img = ImageIO.read(u);
                }
                catch (IOException e)
                {   System.out.println("Image Load Error  " + path);  }
            }
            return img;
        }
    
        // 終了処理
        public void destroy()
        {   universe.cleanup();  }
    }
    
  2. Java Applet を起動する HTMLファイルは、何時もと同じです。
    画像ファイル(earth.jpg)をプロジェクトのフォルダーに格納して下さい。
    アプレットの実行は HTMLファイルをダブルクリックして起動して下さい。
    アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。

プログラムの説明

  1. 基本的な説明は ColorCube を自動的に回転する を参照して下さい。
    テクスチャ画像を入力するので import が増えています。
    テクスチャの説明は チューブにテクスチャを貼付る を参照して下さい。
  2. createSceneGraph(String path) メソッドです。
    テクスチャ画像を入力する path をパラメータとして受け取ります。
    Light と背景色を設定します。
    Sphere(スフィア 球)を回転するので TRANSFORM_WRITE を許可して下さい。
    Sphere にY軸を基点に自動回転を設定します。
    今回は Sphere を包み込むように地球のテクスチャを貼り付けます。
    Sphere の生成時に GENERATE_TEXTURE_COORDS を指定して下さい。
    createAppearance(path) がテクスチャを設定する Appearance メソッドです。
        // シーンを生成
        private BranchGroup createSceneGraph(String path)
        {   BranchGroup objRoot = new BranchGroup();
            objRoot.setCapability(BranchGroup.ALLOW_DETACH);
            Bounds bounds = new BoundingSphere(new Point3d(), 100.0);
    
            // Light の設定
            Light light = new DirectionalLight();
            light.setInfluencingBounds(bounds);
            objRoot.addChild(light);
    
            // 背景色の設定
            Background bg = new Background(new Color3f(0.5f, 0.5f, 0.5f));
            bg.setApplicationBounds(bounds);
            objRoot.addChild(bg);
    
            // 座標変換の設定
            TransformGroup trans = new TransformGroup();
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
            // モデルの回転設定
            Transform3D yAxis = new Transform3D();
            Alpha rotationAlpha = new Alpha(-1, 4000);  // 繰り返し回数:無限  変化時間:4秒
            RotationInterpolator rotator =
                new RotationInterpolator(rotationAlpha, trans, yAxis, 0.0f, (float)Math.PI*2.0f);
            rotator.setSchedulingBounds(bounds);
            objRoot.addChild(rotator);
    
            // Sphere(球)を生成
            Sphere earth = new Sphere(0.7f,Sphere.GENERATE_TEXTURE_COORDS,50,createAppearance(path));
            trans.addChild(earth);
            objRoot.addChild(trans);
    
            return objRoot;
        }
        
  3. createAppearance() メソッドでは、テクスチャ画像を入力して Appearance に設定します。
    loadImage(path) メソッドは前回と同じです。
        // テクスチャーを設定
        private Appearance createAppearance(String path)
        {   Appearance app = new Appearance();
            BufferedImage bimage = loadImage(path);
            Texture2D texture2d = (Texture2D)new TextureLoader(bimage, this).getTexture();
            app.setTexture(texture2d);
            return app;
        }
        

Java Game Program