Java 3D で地球を回してみるテスト
最近、色々なライブラリで地球を回すのがマイブーム!?になってます。
今回は、Java 3D で同様のことを実現したいと思います。
0. 事前準備
以下のコンパイラとライブラリを用意します。
以下は、Java 3D のインストール時の画面イメージです。
1. ソースを作成する
- Earth.java
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); } } }
上記、コードは、
■ 地球がまわる - 超初心者のプログラム入門
のものを、一部、修正したものになります。
2. コンパイルする
コマンドプロンプトより以下のコマンドを実行します。
javac Earth.java
エラーが出なければ、とりあえず、コンパイル完了です。
3. 出力先フォルダにテクスチャファイルをコピーする
テクスチャに使用する画像ファイルは、「earth.jpg」としてください。
4. 実行する
コマンドプロンプトより以下のコマンドを実行します。
javaw Earth
地球が回れば、成功です。
参考
■ 地球がまわる - 超初心者のプログラム入門
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/