プログラマの隠れ里 〜プログラミング初心者のサイト〜
[Contents]

- トップページ
- 自己紹介
- ダウンロード
- プログラマ度診断
- リンク

- ゲストブック
- 質問BBS

[Programming]

- VB 2005
- C 言語
- アセンブラ
- Windows
- Win2K Apache
- Java3D
- ヒント
- 書籍紹介

Java3D シーングラフについて


- Java3D の基本

まず基本として、座標系を知っていなければなりません。
座標系とは、Java3Dの世界を定義しているものであり、Java3Dのオブジェクトが
どのようなX-Y-Zの座標を元に配置されるのかに関係してきます。

Java3Dの座標系は右手座標系をとります。

図:Java3Dの座標系

右手を出してみてください。親指をX軸、人差し指をY軸、中指をZ軸に見立てて、
上の図のような形を作ってみてください。
Java3Dでは、上記のような座標系でオブジェクトの位置を定義していきます。

目次へ


- コアパッケージ

Java3Dのコアパッケージは、以下の2つです。

javax.media.j3dJava Media APIの Java3Dに関するパッケージ
javax.vecmath多次元ベクトル、行例計算に関するパッケージ

これらをコアとして、Java3Dは形作られています。実際に使うのは、com.sun.j3d.〜
といったような、Sunから提供されているユーティリティを使ってJava3Dを使います。

目次へ


- シーングラフ

Java3Dで表示を行うためにはシーングラフで3Dのシーンの作成を行います。
シーンは木構造であらわされ、これをシーングラフといいます。

したの図を参照してください。

Java3Dを使うには、図のようなシーングラフを作成する必要があります。
まずは、空間としてUniveseオブジェクトを作成します。
そのオブジェクトの下に、カメラ空間と、オブジェクト空間を定義します。

しかしながら、SimpleUniverseクラスを使う場合には、
カメラ空間については、あらかじめ作成してくれますので、
オブジェクト空間だけを定義すればいいことになります。

オブジェクトの空間は、前回のプログラムでも見たように
やはり木構造で作成を行います。

一般的にシーングラフの構造をあらわす場合には、Universeは角の丸い四角形、
BranchGroupやTransformGroupなどのような子のあるノードには、丸を、
ColorCubeのような、末端ノードには三角形を使います。

目次へ


- シーン作成

それでは実際にシーンを作成して見ましょう。まず、どのようなシーンにするかシーングラフを 作成します。

図:自作シーングラフ

カメラについては省略を行っています。ColorCube、Sphere、Boxをそれぞれ座標変換をして、 表示を行います。
Sphereとは、球体のことです。Boxとは、直方体のことです。

// Java3DProgram.java

import java.applet.Applet;
import java.awt.*;
import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;

/*
    <applet code=Java3DProgram width=200 height=200>
    </applet>
*/

public class SceneGraphTest extends Applet {

    public SimpleUniverse universe = null;
    public Canvas3D canvas = null;

    public BranchGroup createObjects() {

        BranchGroup root = new BranchGroup();

        // ここにシーングラフの追加を行う

        return root;
    }

    public void setOrbitBehavior() {

        // マウスでぐりぐりするための処理
        OrbitBehavior orbit = new OrbitBehavior(canvas, OrbitBehavior.REVERSE_ALL);
        orbit.setSchedulingBounds(
            new BoundingSphere(new Point3d(0, 0, 0), 100.0));
        universe.getViewingPlatform().setViewPlatformBehavior(orbit);
    }

    public void init() {
        setLayout(new BorderLayout());

        // キャンバスの準備
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        canvas = new Canvas3D(config);
        add("Center", canvas);

        // SimpleUniverseの作成
        universe = new SimpleUniverse(canvas);

        // カメラの移動(原点から少しだけ後ろにずれる)
        universe.getViewingPlatform().setNominalViewingTransform();

        // マウスでぐりぐり動かすための処理
        setOrbitBehavior();

        // オブジェクトの追加
        universe.addBranchGraph(createObjects());
    }

    public static void main(String[] args) {
        new MainFrame(new SceneGraphTest(), 200, 200);
    }
}

前回作成した物と同じなので、分かると思いますが、シーングラフはcreateObjectsの中に
作成をしていきます。

目次へ


- シーン実装

それでは、シーングラフを実装してみます。

    public BranchGroup createObjects() {

        BranchGroup root = new BranchGroup();

        // ここにシーングラフの追加を行う
        Transform3D transform1 = new Transform3D();
        Transform3D transform2 = new Transform3D();
        Transform3D transform3 = new Transform3D();

        TransformGroup transnode1 = new TransformGroup();
        TransformGroup transnode2 = new TransformGroup();
        TransformGroup transnode3 = new TransformGroup();

        transform1.set(new Vector3d(1.0, 1.0, -1.0));
        transform2.set(new Vector3d(0, 0, -1.0));
        transform3.set(new Vector3d(-1.0, -1.0, -1.0));

        transnode1.setTransform(transform1);
        transnode2.setTransform(transform2);
        transnode3.setTransform(transform3);

        Appearance appearance = new Appearance();
        appearance.setColoringAttributes(
            new ColoringAttributes(1.0f, 1.0f, 1.0f, ColoringAttributes.FASTEST));

        transnode1.addChild(new ColorCube(0.4));
        transnode2.addChild(new Sphere(0.4f, appearance));
        transnode3.addChild(new Box(0.4f, 0.4f, 0.4f, appearance));

        root.addChild(transnode1);
        root.addChild(transnode2);
        root.addChild(transnode3);
        root.compile();

        return root;
    }

上のプログラムを挿入して実行してみると上のようになります。

図:実行してみた図

プログラム中にある、Appearanceオブジェクトは、オブジェクトの表示を指定するクラスです。
今回は真っ白な色を指定してみました。
なので、ぐりぐり動かしてみてもオブジェクトは真っ白なままですね。

実際には、Appearanceクラスを使って、色だけではなくて
そのオブジェクトの質感や、周りの景色の写りこみ、反射、影、テクスチャなども定義することが出来ます。
それについては、またあとのほうで説明を行いましょう。

実際に実行してみる。

目次へ

Copyright 1999-2005 けんいち All Right Reserved. V6PJ.