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

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

- ゲストブック
- 質問BBS

[Programming]

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

Java3D プログラミングイントロダクション


- ベースプログラムの作成

アップレットとして一番最初のプログラムを作成してみましょう。

// Java3DProgram.java

import java.applet.Applet;
import com.sun.j3d.utils.applet.MainFrame;

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

public class Java3DProgram extends Applet {

    public void init() {
    }

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

このプログラムは以下のコマンドで実行できます。

java Java3DProgram

このプログラムは、アップレットを表示するだけなので、
真っ白なキャンバスがウィンドウが表示されるだけです。

目次へ


- Canvasの準備

次にJava3Dで表示するためのCanvasの準備をします。

// Java3DProgram.java

import java.applet.Applet;
import com.sun.j3d.utils.applet.MainFrame;
import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;

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

public class Java3DProgram extends Applet {

    public void init() {

        setLayout(new BorderLayout());

        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();

        Canvas3D canvas = new Canvas3D(config);

        add("Center", canvas);
    }

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

Canvas3Dオブジェクトを準備して、アプレットのキャンバスとしてセットしています。
Java3Dでは、このCanvas3D上に描画が行われることになります。

やっていることは、たいしたことないので、使っている関数については、深く考えなくてよいです。

目次へ


- 3D空間の作成(SimpleUniverse の作成)

Java3Dを使うためには、3D空間を作成しなければなりません。

3D空間は、カメラと3D空間上にあるオブジェクト群によってなりますが、
すべてを自前で定義するのは面倒です。

そのために、SimpleUniverseクラスというものがあり、このクラスを使うことで、 簡単に3D空間を作ることが出来ます。

// Java3DProgram.java

import java.applet.Applet;
import com.sun.j3d.utils.applet.MainFrame;
import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;

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

public class Java3DProgram extends Applet {

    public SimpleUniverse universe = null;

    public void init() {

        setLayout(new BorderLayout());

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

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

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

これを実行してみると、ちょっと変わりましたね?
前のプログラムは背景が真っ白だったにもかかわらず、今度は真っ黒になってしまいました。

プログラム中に3D空間を作成し、それをキャンバスに映し出しているために、
真っ黒になってしまったのです。
すなわち、今見えているのは、カメラから見えている画像ということになります。

空間上には、まったくオブジェクトが存在しないし、光源や背景もないので、
真っ暗になってしまっています。

目次へ


- オブジェクトの表示

では実際にオブジェクトを表示してみましょう。

図:実行してみた

ここでは、ColorCubeという色つきの立方体を表示してみます。

// Java3DProgram.java

import java.applet.Applet;
import com.sun.j3d.utils.applet.MainFrame;
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.ColorCube;

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

public class Java3DProgram extends Applet {

    public SimpleUniverse universe = null;

    public BranchGroup createObjects() {

        BranchGroup root = new BranchGroup();

        // 色つき立方体の作成
        root.addChild(new ColorCube(0.4));
        root.compile();

        return root;
    }

    public void init() {

        setLayout(new BorderLayout());

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

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

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

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

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

createObjectsメソッドにて、3D空間上に表示を行うオブジェクトを追加していきます。

ColorCubeオブジェクトを作成して3D空間上に追加していますが、
その前にBranchGroupオブジェクトに追加してBranchGroupオブジェクトに追加をします。

Java3Dでは、オブジェクトの空間を木構造で表現します。すなわち、BranchGroupは枝であり
ColorCubeは葉であることになります。

この3D空間のオブジェクト群を構成した木構造のグラフを、シーングラフといいます。

図:BranchGroupとColorCubeの関係(シーングラフ)

BranchGroupはいくつでも葉を持つことが出来るので、表示したいオブジェクトが複数ある場合には、
BranchGroupに追加することでいくつでも表示するためのオブジェクトを増やすことが出来ます。

ただ注意したいのは、「座標変換」というものを行わなければ、
すべて原点にオブジェクトが表示されてしまうので、ただBranchGroupに追加するだけでは、
オブジェクトが重なって表示されるだけになってしまいます。

次では、オブジェクトを座標変換によってずらして表示を行ってみましょう。

目次へ


- マウスでぐりぐり動かす

座標の変換を行う前に、現在表示されているオブジェクトをマウスでぐりぐり
動かしてみましょう。

図:マウスでぐりぐり動かしてみた

ちょこっと追加するだけで、マウスでぐりぐり動かすことが出来ます。

// Java3DProgram.java

import java.applet.Applet;
import com.sun.j3d.utils.applet.MainFrame;
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.ColorCube;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;

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

public class Java3DProgram extends Applet {

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

    public BranchGroup createObjects() {

        BranchGroup root = new BranchGroup();

        // 色つき立方体の作成
        root.addChild(new ColorCube(0.4));
        root.compile();

        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();
        Canvas3D 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 Java3DProgram(), 200, 200);
    }
}

setOrbitBehaviorにて、マウスでぐりぐり動かすための処理を追加しています。
これだけの処理を追加するだけでマウスでぐりぐり動かすことが出来るようになります。

実際にはBehaviorというオブジェクトを使います。Java3Dでは、Behaviorと呼ばれるオブジェクトによって、
対象のオブジェクトを操作したりします。

詳しくは後ほど説明しますが、ここではこんな処理を入れればマウスで動かせるようになるんだと
思っておいてもらえればいいです。

目次へ


- 座標変換

座標変換を行って、別の位置に色つき立方体を表示してみましょう。

座標変換を行うためには、TransformGroupというオブジェクトを、
シーングラフ中のBranchGroupとLeafオブジェクトの間に挿入します。
具体的には、以下のようにします。

図:シーングラフの構造

TransformGroupを使ったプログラムを作ってみます。
createObjectsの内部にて、平行移動を定義しています。

// Java3DProgram.java

import java.applet.Applet;
import com.sun.j3d.utils.applet.MainFrame;
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.ColorCube;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;

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

public class Java3DProgram extends Applet {

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

    public BranchGroup createObjects() {

        BranchGroup root = new BranchGroup();

        // 平行移動を定義
        TransformGroup transRoot = new TransformGroup();
        Transform3D transform = new Transform3D();

        // x方向に1.0m移動
        transform.set(new Vector3d(1.0, 0, 0));
        transRoot.setTransform(transform);

        // 色つき立方体の作成
        transRoot.addChild(new ColorCube(0.4));
        root.addChild(transRoot);
        root.compile();

        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();
        Canvas3D 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 Java3DProgram(), 200, 200);
    }
}

X方向に1mだけ移動してみたのですが、どうでしょうか。
実際に移動しているでしょうか。マウスでぐりぐりと動かしてみると分かります。

目次へ

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