座標空間と画面表示

広告

Java3Dでは表示画面の向こうに空間が広がっていて、それを画面を通して見ている、ということになっています。宇宙船の窓から宇宙を見ているようなものです。

そして、その宇宙空間には宇宙の中心である原点があるのですが、その宇宙空間を3次元の空間として見た場合、画面を見ている"人"から見て、原点から右に伸びている軸がX軸、原点から上に伸びている軸がY軸、原点から"人"に向かってくる軸(奥から手前に向かってくる軸)がZ軸となります。

Java3Dでの座標軸

そして視点(見ている人)が空間の中のどこに居るのかですが、宇宙の原点から数メートル手前の位置にいます(ずいぶん近いですけど)。この数メートル手前の位置から窓を通して宇宙空間を見ると、x軸上にあって、原点からそれぞれ1mの幅を持つ物体が、丁度画面の両端いっぱいに表示されることになります。

※上記については『SimpleUniverseとは』を参照して下さい。

Java3Dでの視点の位置

※原点を中心として、x軸上にある幅2メートルの棒が、ちょうど窓の両端いっぱいにぴったり表示される位置にいると思ってもらえばそれでいいです。

では試しに、(x, y, z)=(-0.5, 0, 0)から(x, y, z)=(0.5, 0, 0)へ直線を1本、そして(x, y, z)=(0, -0.5, 0)から(x, y, z)=(0, 0.5, 0)へ直線を1本、引いてみましょう。原点を中心として十字の直線が引かれるはずです。

Sample3D1.java

import javax.swing.*;
import java.awt.event.*;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.Point3d;
import javax.vecmath.Color3f;
import java.awt.Color;

public class Sample3D1 extends JFrame {
  public BranchGroup createSceneGraph() {
    BranchGroup objRoot = new BranchGroup();

    Point3d[] vertex = new Point3d[4];

    vertex[0] = new Point3d(-0.5, 0.0, 0.0);
    vertex[1] = new Point3d(0.5, 0.0, 0.0);
    vertex[2] = new Point3d(0.0, -0.5, 0.0);
    vertex[3] = new Point3d(0.0, 0.5, 0.0);

    LineArray geometry = new LineArray(vertex.length, 
      GeometryArray.COORDINATES | GeometryArray.COLOR_3);
    geometry.setCoordinates(0, vertex);

    geometry.setColor(0, new Color3f(Color.red));
    geometry.setColor(1, new Color3f(Color.red));
    geometry.setColor(2, new Color3f(Color.cyan));
    geometry.setColor(3, new Color3f(Color.cyan));

    Shape3D shape = new Shape3D(geometry);
    objRoot.addChild(shape);
    objRoot.compile();

    return objRoot;
  }

  public Sample3D1() {
    getContentPane().setLayout(new BorderLayout());

    GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();

    Canvas3D canvas = new Canvas3D(config);
    getContentPane().add(canvas, BorderLayout.CENTER);

    BranchGroup scene = createSceneGraph();
    SimpleUniverse universe = new SimpleUniverse(canvas);

    universe.getViewingPlatform().setNominalViewingTransform();
    universe.addBranchGraph(scene);
  }

  public static void main(String[] args) {
   Sample3D1 sample = new Sample3D1();

    sample.setBounds( 10, 10, 240, 240);
    sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    sample.setVisible(true);
  }
}

実行結果は下記の通りです。

Java3Dで原点を中心に十字の線を描いた例

上記は、宇宙の原点から2.4m手前に居る人が、宇宙船の窓を通して原点からx軸方向、そしてy軸方向に伸びる十字の線を見ていることになります。

このようにJava3Dでは宇宙空間に色々な物体を設置して、それをある場所から見ている、という感じで3次元のアプリケーションを作成していくことになります。またJava3Dでは大きさの単位はメートルになっています。

( Written by Tatsuo Ikura+ )

Facebook Page