CX's Hatena Blog

はてなブログを使ってみるテスト

Java 3D で地球を回してみるテスト

最近、色々なライブラリで地球を回すのがマイブーム!?になってます。

今回日程 シリーズ構成言語
1日目OpenGL で地球を回してみるテスト C/C++
2日目DirectX で地球を回してみるテスト C/C++
3日目Java 3D で地球を回してみるテスト Java
4日目WebGL で地球を回してみるテスト JavaScript
5日目Three.js で地球を回してみるテスト JavaScript
6日目Babylon.js で地球を回してみるテストJavaScript
7日目gl.enchant.js で地球を回してみるテストJavaScript
8日目PhiloGL で地球を回してみるテストJavaScript
9日目CubicVR.js で地球を回してみるテストJavaScript
最終日Away3D で地球を回してみるテストJavaScript
追加+1Flash 版 Away3D で地球を回してみるテストActionScript
追加+2WPF で地球を回してみるテストC# + XAML
追加+3JavaFX 3D で地球を回してみるテストJava

今回は、Java 3D で同様のことを実現したいと思います。

f:id:cx20:20140121225804p:plain

0. 事前準備

以下のコンパイラとライブラリを用意します。

以下は、Java 3D のインストール時の画面イメージです。

f:id:cx20:20140121230637p:plain

f:id:cx20:20140121230638p:plain

f:id:cx20:20140121230639p:plain

1. ソースを作成する

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 Earth extends JFrame
{
    public static void main(String[] args)
    {
        Earth frame = new Earth("Hello, Java 3D World!");
        frame.setVisible(true);
    }

    public Earth( String title )
    {
        super(title);
        setSize(450,450);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Canvas3D canvas3D = createCanvas3D();
        BranchGroup scene = createScene();
        connect(canvas3D, scene);
    }
 
    private Canvas3D createCanvas3D() {
        getContentPane().setLayout(new BorderLayout());
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(config);
        getContentPane().add(canvas3D);
        return canvas3D;
    }
 
    private BranchGroup createScene()
    {
        BranchGroup objRoot = new BranchGroup();
        objRoot.setCapability(BranchGroup.ALLOW_DETACH);
        Bounds bounds = new BoundingSphere(new Point3d(), 100.0);

        Light light = new DirectionalLight();
        light.setInfluencingBounds(bounds);
        objRoot.addChild(light);

        Background bg = new Background(new Color3f(0.0f, 0.0f, 0.0f));
        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);
        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.8f,Sphere.GENERATE_TEXTURE_COORDS,50,createAppearance());
        trans.addChild(earth);
        objRoot.addChild(trans);

        return objRoot;
    }

    private Appearance createAppearance()
    {
        Appearance app = new Appearance();
        BufferedImage bimage = loadImage("earth.jpg");
        Texture2D texture2d = (Texture2D)new TextureLoader(bimage, this).getTexture();
        app.setTexture(texture2d);
        return app;
    }

    private void connect(Canvas3D canvas3D, BranchGroup scene) {
        SimpleUniverse universe = new SimpleUniverse(canvas3D);
        universe.getViewingPlatform().setNominalViewingTransform();
        universe.addBranchGraph(scene);
    }
    
    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);
        }
    }

}

上記、コードは、

■ 地球がまわる - 超初心者のプログラム入門

http://sky.geocities.jp/kmaedam/java2/view_earth.htm

のものを、一部、修正したものになります。

2. コンパイルする

コマンドプロンプトより以下のコマンドを実行します。

javac Earth.java

エラーが出なければ、とりあえず、コンパイル完了です。

3. 出力先フォルダにテクスチャファイルをコピーする

テクスチャに使用する画像ファイルは、「earth.jpg」としてください。

f:id:cx20:20140120002054p:plain

4. 実行する

コマンドプロンプトより以下のコマンドを実行します。

javaw Earth

f:id:cx20:20140121225804p:plain

地球が回れば、成功です。

参考

■ 地球がまわる - 超初心者のプログラム入門

http://sky.geocities.jp/kmaedam/java2/view_earth.htm

■ CX's Hello, World! » Hello, Java 3D World!

http://cx20.main.jp/blog/hello/2012/11/06/hello-java-3d-world/