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

Applet でプログラムを体験できます。
地球がまわる

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

プログラムの作成

  1. メモ帳などでタイプして EarthAuto.java の名前で保存して下さい。
    //★ Sphere に地球のテクスチャを張付て自動回転する
    import java.awt.*;
    import javax.swing.*;
    import java.io.*;
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.image.TextureLoader;
    import com.sun.j3d.utils.geometry.*;
    import java.awt.GraphicsConfiguration;
    
    public class EarthAuto extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new EarthAuto();  }
    
        // Constructor
        public EarthAuto()
        {   // JFrame の初期化
            super("Texture Earth");
            setSize(300,300);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D関係の設定
            GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(g_config);
            add(canvas);
    
            // SimpleUniverseを生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // シーンの生成
            BranchGroup scene = CreateScene();
            universe.addBranchGraph(scene);
            setVisible(true);
        }
    
        // テクスチャを張り付けた地球を生成
        private BranchGroup CreateScene()
        {   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);
    
            Appearance ap = createAppearance();
            // 球を生成
            Sphere earth = new Sphere(0.7f,Sphere.GENERATE_TEXTURE_COORDS,50,createAppearance());
            trans.addChild(earth);
            objRoot.addChild(trans);
    
            return objRoot;
        }
    
        // テクスチャーを設定
        private Appearance createAppearance()
        {   Appearance app = new Appearance();
            BufferedImage bimage = loadImage("C:\\DATA\\Test\\earth.jpg");
            Texture2D texture2d = (Texture2D)new TextureLoader(bimage, this).getTexture();
            app.setTexture(texture2d);
            return app;
        }
    
        // 画像の入力
        public static BufferedImage loadImage(String fileName)
        {   InputStream is = null;
            try
            {   is = new FileInputStream(fileName);
                BufferedImage img = ImageIO.read(is);
                return img;
            }
            catch (IOException e)
            {   throw new RuntimeException(e);  }
            finally
            {   if (is != null)
                    try { is.close(); }
                    catch (IOException e) {}
            }
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    Sphere(スフィア 球)に地球のテクスチャが張り付けられて、回転しながら描画されたら完成です。

プログラムの説明

  1. 基本的な説明は 3Dモデルを描画 を参照して下さい。
    テクスチャ画像を入力するので import が増えています。
    テクスチャの説明は 矩形にテクスチャを貼付る を参照して下さい。
  2. テクスチャを張り付けた Sphere(球)を生成する CreateScene() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    Light と背景色を設定します。
    Sphere(球)を回転するので TRANSFORM_WRITE を許可して下さい。
    Sphere にY軸を基点に自動回転を設定します。
    今回は Sphere を包み込むように地球のテクスチャを貼り付けます。
    Sphere の生成時に GENERATE_TEXTURE_COORDS を指定して下さい。
    createAppearance() がテクスチャを設定する Appearance メソッドです。
    RotationInterpolator の説明は「3Dアニメーション」を参照して下さい。
        // テクスチャを張り付けた地球を生成
        private BranchGroup CreateScene()
        {   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);
    
            Appearance ap = createAppearance();
            // 球を生成
            Sphere earth = new Sphere(0.7f,Sphere.GENERATE_TEXTURE_COORDS,50,createAppearance());
            trans.addChild(earth);
            objRoot.addChild(trans);
    
            return objRoot;
        }
        
  3. createAppearance() メソッドでは、テクスチャ画像を入力して Appearance に設定します。
    loadImage() メソッドは前回と同じです。
        // テクスチャーを設定
        private Appearance createAppearance()
        {   Appearance app = new Appearance();
            BufferedImage bimage = loadImage("C:\\DATA\\Test\\earth.jpg");
            Texture2D texture2d = (Texture2D)new TextureLoader(bimage, this).getTexture();
            app.setTexture(texture2d);
            return app;
        }
        

超初心者のプログラム入門(Java2)