卒業論文
Java3D
による奈良女子大学の3次元モデルの構築
小林 弘美
学籍番号 00251586 2004 年 2 月 12 日 奈良女子大学理学部 情報科学科Java3D
による奈良女子大学の3次元モデルの構築
∗小林 弘美
学籍番号 00251586 内容梗概 Java3D とは、Java 言語の特徴を享受した言語であり、シーングラフという独 自の概念を持っている。そして、Java3D は、このシーングラフを利用して3次 元空間を一気に描画していく。 本研究では、このJava3D を用いて、奈良女子大学キャンパス全体図とG棟の モデルの構築を行った。特にG棟においては、リアリティーを出すために質感を 物体に指定した。作成したモデルを観察しやすくするために、キャンパス全体図 においては、マウスを用いて、自由に角度を変えることができるようにし、G棟 だけの実行結果においては、Y軸による回転をすることができるようにした。こ のように、個々のオブジェクトに動き指定した。また、このキャンパス、及びG 棟内を動き回れるようなキーボード操作を加えた。 ∗奈良女子大学理学部情報科学科卒業論文, 2004 年 2 月 12 日.目 次
第1 章 序論 1 第2 章 Java3D について 2 2.1 Java とは . . . . 2 2.2 Java3D とは . . . . 2 2.3 Java3D の長所、短所 . . . . 3 2.4 プログラミング環境 . . . . 4 2.5 Java3D の基礎知識 . . . . 5 2.5.1 Java3D の座標系 . . . . 5 2.5.2 シーングラフ . . . . 5 2.5.3 シーングラフの作成 . . . . 6 2.6 テクスチャーを用いた物体・・・Mac を描く . . . . 8 第3 章 奈良女子大学キャンパス、G棟の3次元モデルの構築について 10 3.1 機能 . . . . 10 3.2 シーングラフ . . . . 12 3.3 重要なパッケージ . . . . 12 3.4 視点側の構成 . . . . 13 3.5 物体側の構成 . . . . 15 3.6 キャンパス全体図 . . . . 17 3.6.1 シーングラフ . . . . 17 3.6.2 プログラム説明 . . . . 18 3.6.3 キャンパス実行結果 . . . . 20 3.7 G棟 . . . . 20 3.7.1 シーングラフ . . . . 21 3.7.2 プログラムの説明 . . . . 21 3.7.3 G棟の実行結果 . . . . 23 3.8 動き . . . . 23 3.8.1 マウスピッキング . . . . 243.8.2 アニメーション . . . . 24 3.8.3 視点移動 . . . . 25 第4 章 視点移動の操作方法 28 第5 章 まとめ 30 第6 章 謝辞 31 参考文献 32
図 目 次
2.1 Mac のシーングラフ . . . . 8 2.2 Mac . . . . 10 3.1 シーングラフ . . . . 12 3.2 キャンパス全体図のシーングラフ . . . . 17 3.3 キャンパス全体図 . . . . 20 3.4 G 棟のシーングラフ . . . . 21 3.5 電球 . . . . 22 3.6 G 棟 正面図 . . . . 23 3.7 G 棟 側面図 . . . . 23第
1
章 序論
近年、パーソナルコンピュータが急速に普及し、それに伴ってパーソナルコン ピュータは高性能化をとげ、かつては、一部の人しか作ることのできなかった3 次元画像も、今や誰もがつくることのできる環境が整ってきた。その中でも、比 較的手のつけやすいJava3D が3次元表示のツールのひとつとして注目されてき ている。Java3D は、OpenGL や Dorect3D などの3次元グラフィックス API に 比べて、抽象度が高くシーングラフという独自の概念を持っている。Java3D は Java クラスライブラリーであるため、他の API と同様にオブジェクトを生成し、 そのメソッドを呼び出すことで、簡単に3次元グラフィックスを描画することが できる。 仮想空間を描くには、いかに物理空間に類似しているかがポイントとなる。 Java3D の現状をしり、特徴等を調べ、物体の質感、マウスによる回転、視点移動 などをおこなうことで、よりリアルな3次元モデルを描画する必要がある。 本研究は、キャンパス全体図とG棟に分けて3次元モデルを作成し、それぞれ のモデルの中を移動できるようにすることを目的とした。 本論文の構成としては、第2章で、Java3D の概念についてふれる。第3章で は、本研究の奈良女子大学キャンパス、及びG棟の3次元モデルの構築における 個々オブジェクトの説明、システム構成、第4章では、視点移動の操作方法につ いて説明をする。第5章では、本研究のまとめと今後の課題について述べる。
第
2
章
Java3D
について
Java3D とは、Java で3次元グラフィックスを実現するための公式なオプショ ンパッケージAPI である。正式名称は Java3D API である。
2.1 Java
とは
Java 言語は機種依存性が非常に少ない言語である。Java のプログラミング言 語としてもっとも大きな特徴の1つは、完全なオブジェクト指向のプログラミン グ言語であるということである。プログラムで使うあらゆる要素をオブジェクト として扱う。Java 言語はマルチスレッドを取り扱うことのできる言語である。つ まり複数のスレッドを簡単に扱うことができ、平行プログラミングを行うことが できる。 Java 言語は Web ブラウザで動作するプログラムを作成できるということで世 界に普及した。そのためJava 言語はアプレットを記述するための専用の言語と いう誤解を生じた。しかし、実際には、Java 言語は一般のアプリケーションを作 ることのできる言語である。2.2 Java3D
とは
Java3D とは、Java アプレットや、アプリケーションに対してインタラクティブな 3D コンテンツの作成機能を提供する Java API(Aprlication Programing Interface) である。Java3D は、高レベルな構造概念を使ってジオメトリを作成し、編集し、 構造体を作成した後、ジオメトリをレンダリングする。アプリケーション開発者は、これらの構造概念を使用して非常に大きなバーチャルワールドを記述できる。 さらに、Java3D ではそこから必要な情報を収集して、効率なレンダリングを行 うことができる。
Java3D は、Java の write once run anywhere「一度作成すればどこでも実行で きる」という利点を3D グラフィックスアプリケーション及びアプレットから、す べてのJava クラスにアクセスできるため、今後、インターネットでの利用が広 がると考えられる。
Java3D API は、既存のグラフィックス API をベースとしており、これに新し いテクノロジーが織りこまれている。例えば、Java3D の低レベルグラフィックス の構造概念は、低レベルのAPI に見られる長所を組み合わせたものである。同様 に、高いレベルの構造概念は、シーングラフをベースとしたシステムに見られる 長所を組み合わせたものである。
2.3 Java3D
の長所、短所
以下にJava3D の持つ長所、短所をあげる。 (1) 長所1. Java3D は、Java 言語であるため Java を使用して、3D 画像を作成すること ができ、又、Java アプレットとの連帯も可能となる。 2. Java3D ランタイムは、レンダリング機能ビットを使用することにより、可 能な限りシーングラフを最適化し、レンダリングを高速化できる。 3. Java3D は、シーングラフをベースにした 3D グラフィックス・モデルを部 分的に採用している。シーングラフによるアプローチの目的は、グラフィッ クスや、マルチメディアに関するプログラミングの経験が少ないプログラ マーでも、容易に3D グラフィックスを使いこなせるようにすることである。 Java3D は熟練した Java プログラマーであれば、容易に 3D グラフィックス を学習することができるようになっている。 4. Java3D は、ベクトル演算専用のクラスライブラリを Javax.vecmath パッケー ジとして提供している。
(2) 短所
1. Java3D は、現在、Java のコア API ではなく、Standard Extensions API として提供されている。そのため、Java2D などとは異なり、Java のコア API(Java2) とは別にインストールする必要がある。 2. 高レベルの API のせいであるせいか、レンダリング・パイプラインの詳細 が外部からはよくわからない。
2.4
プログラミング環境
Java3D はオブジェクト指向の API である。アプリケーションでは、ここのグ ラフィックス要素を独立したオブジェクトとして作成し、それらをつなぎ合わせ てツリー上の構造を形成する。この構造をシーングラフという。 Java3D のプログラミングモデルは、シーングラフの操作や、属性状態の変更 管理など、定型的な処理をJava3D API に任せ、アプリケーション側の処理を簡 略化できる。これによってパフォーマンスが損なわれる心配はない。Java3D で は、より高次の抽象化によって、API が実行すべき処理の総量が押さえられる。 しかも、API が実行すべき処理の種類が変わる。抽象化のレベルが低い場合には、 数々の制約を免れないが、Java3D では、このようなことはなく、他の API では、 不可能だった最適化が実現される。 さらに、レンダリングの細かな部分をJava3D に任せることによって、ハード ウェアに合わせたレンダリングの調節が可能になる。例えば、他のAPI では、レ ンダリングの順序が固定されているが、Java3D では、順序を変更して操作やレ ンダリングを並行して実行することができる。シーングラフの中で、実行時に変 更されては困る部分を指定しておけば、Java3D はツリーをフラットにし、ネイ ティブハードウェア形式で表現できるようにジオメトリを実行前に変更すること もできる。このとき、元のデータを保持しておく必要はない。2.5 Java3D
の基礎知識
2.5.1 Java3D
の座標系
Java3D の座標系は右手座標系でx軸は左右方向に伸びy軸は上下方向、z軸 は奥行きになる。正の方向はx軸が右方向、y軸は上方向、z軸は手前方向に相 当する。3次元空間の座標系は任意の位置を原点として、そこに新たな座標系を 作る。元の座標系を「ワールド座標系」新しく作られた座標系を「ローカル座標 系」と呼ぶ。ローカル座標系は、一般的にいくつもつくることが可能である。ま た、座標系の原点は0 を示し、単位は 1.0 で1メートルを示す。2.5.2
シーングラフ
シーングラフとはJava3D における独自の概念である。 シーングラフは3次元仮想空間を概念的に表現するためのもので、樹形図のよ うに用いて表現する。このシーングラフをまとめると以下大きく4点のオブジェ クトから成り立っている。 • 空間のオブジェクト • 大地を表すオブジェクト• 物体を表すオブジェクト • カメラを表すオブジェクト これらのひとつひとつのオブジェクトを生成する必要がある。表示する物体が 増えれば、また新しいオブジェクトを生成し、シーングラフに追加しなければなら ない。さらに複雑な仮想空間を作る場合には、樹形図の分岐を増やす必要がある。
2.5.3
シーングラフの作成
Java3D で3次元グラフィックを作る場合、SimpleUniverse オブジェクトを使 うと標準的な空間オブジェクトとカメラを表すオブジェクトを作成する。つま り、SimpleUniverse が視点側オブジェクトを構築してくれる。SimpleUniverse は、 VirtualUniverse のサブクラスである。 しかし、物体側のオブジェクトは自分自身で作る必要がある。その物体オブ ジェクトをひとつのグループにまとめたものがBranchGroup オブジェクトであ る。BranchGroup オブジェクトは javax.media.j3d.Group のサブクラスである。 物体を表すオブジェクトには、部品オブジェクトをグループにまとめたGroup クラスのオブジェクトを基本的な幾何学物体を表すLeaf クラスのオブジェクト がある。Group クラスは BranchGroup クラスや TransformGroup クラス等がある。また、Leaf クラスには、Box や Sphere といった基本的な幾何クラス、光源 のLight クラス、背景や霧を表すクラスがある。Group クラスのオブジェクトに は、さらにGroup クラスのオブジェクトや Leaf クラスのオブジェクトを追加し て複雑な物体を構成していくことができる。
2.6
テクスチャーを用いた物体・
・
・
Mac
を描く
Java3D では様々な物体を作る事ができ、そして、それら物体に様々な効果を もたせて表現することができる。以下、そのある一例を取り出し、実際にMac を 描画していく。 まず最初にシーングラフを構築する。以下、Mac を構築するためのシーングラ フを簡単に表現したものである。 図 2.1 Mac のシーングラフ 物体をよりリアルに見せる方法のひとつにテクスチャーのマッピングがある。物 体にテクスチャーを貼り付けるにはTexture オブジェクトを使用する。Appearance オブジェクト(質感を示すもの)に対して、setTexture(Texture texture) メソッ ドでTexture オブジェクトを作る。 次に示すものは、実際にのプログラムにおいてテクスチャーを指定した部分で ある。Appearance macmark =
getAppearanceFactory().createAppearance(MAC_TEXTURE); Material macMaterial = new Material();
Sphere apple = new Sphere(0.18f,Sphere.GENERATE_NORMALS | Sphere.GENERATE_TEXTURE_COORDS,macmark); このように、createAppearance を呼び出し、プリミティブで指定することで、テ クスチャが物体に適用される。そして、Texture texture = textureLoader.getTexture(); の部分でテクスチャオブジェクトを定義し、同時に表示させる画像ファイルを呼 び出す。
次に示すものが、その実際のプログラムである。
TextureLoader textureLoader = createTextureLoader(textureFile); このように、Appearance オブジェクトを介して Primitive オブジェクトにその 情報を組み込んでいる。テクスチャを使うことにより、物体に、自由な画像を貼 り付けすることができる。
以下の図はこのようにして作成したコンピュータ(iMac)を実行させた結果で ある。
図 2.2 Mac
第
3
章 奈良女子大学キャンパス、G棟
の3次元モデルの構築について
3.1
機能
本研究の目的は、奈良女子大学キャンパス、及びG 棟の3次元モデルを作成 し、その3次元モデルの中で視点移動ができるようにするということである。 この3次元モデルに組み込む機能としては、キーボードを利用して、視点移動 ができるようにする。また、キャンパス全体図、G 棟を別々に構築しそれぞれに、 マウスピッキング、Y 軸によるアニメーションを指定し、モデルを様々な角度か3.2
シーングラフ
次の図は、このプログラムに対するシーングラフになる。 図 3.1 シーングラフ3.3
重要なパッケージ
最初に使用している主なパッケージを説明する。パッケージとはクラスの集ま りのことで、宣言することにより、プログラム内でメソッドを扱える。 • java.applet.*; アプレット関連の機能提供 • java.awt.*; グラフィカルインターフェースを作成するための(AWT) • java.awt.event.*; AWT コンポーネントからイベント処理 • javax.media.j3d.*; 空間やエフェクトなど様々なクラスを提供する。• com.sun.j3d.utils.applet.MainFrame; Java3D のメインフレームを表示する。 • com.sun.j3d.utils.univerese.SimpleUniverse; 視点側のオブジェクトを生成する。 • com.sun.j3d.utils.geometry.*; Java3D のプリミティブを提供 • javax.vecmath.*; ベクトルに関するクラス
3.4
視点側の構成
物体側を見ている側の、目、耳などの身体、視点、スクリーンやグラフィック ス装置などの「見る側」をオブジェクトとして生成し、ツリー構造に構築したも のが必要になる。 視点側のメソッドのプログラミング方法を示すと以下のようになる。最初に次 のようなメソッドを作る。 GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(config);add("Center",c);
this.setLayout(new BorderLayout());
SimpleUniverse u = new SimpleUniverse(c);
上記プログラムの中のCanvas3D は、Java3D を使って描画するときに使うオブ ジェクトである。SimpleUniverse には、システムが持つ適切な GraphicalConfig-uration を取得するメソッドがある。このメソッドを使い GraphicsFigGraphicalConfig-uration オ ブジェクトを取得し、それに引数にCanvas3D を生成する。また、配置を決定す るクラスであるBorderLayout のインスタンスを生成して、Canvas3D に add して
いる。CENTER に設定しているため、3次元グラフィックスの描画画面用のカン バスCanvas3D はアプレットの中央に表示されることになる。 次に、以下の視点側のメソッドを作る。 universe.getViewingPlatform().setNOminalViewingTransform(); この命令により、空間上にあるカメラの視点をz軸の正の方向に約2.41mm 移動 させる。これを設定しておかなければカメラの位置は原点に置かれてしまい、物 体がカメラ内に入ってしまう。これで、視点側の構成が完了する。 最後に以下の視点側のメソッドを付け加える。
BranchGroup scene = createSceneGraph(); universe.addBranchGroup(scene);
この命令により、BranchGroup 型の変数 scene に createSceneGraph メソッドを 呼び出しで作成したシーングラフを入れている。BranchGroup を SimpleUniverse に接続する場合だけは、addBranchGroup メソッドで接続する。
3.5
物体側の構成
BranchGroup より下のツリーの構成が、物体側の構成である。最初に物体側の BranchGroup を用意する。
BranchGroup root = new BranchGroup();
このBranchGroup は、SimpleUniverse の最初の子となり、物体側では、この BranchGroup オブジェクトから下にシーングラフを作成していく。Java3D は図 形の描画を高速に行うため、図形や、その配置を最適化する。このとき一般的に は図形の位置が変化することはないと仮定して最適化をしてしまうので、後で図 形や視点を変更することはできない。実行時に位置が変化する可能性がある場合 には、ケーパビリティーを設定しておく必要がある。次に、TransformGroup の 許可の方法を示す。
TransformGroup trans = new TransformGroup();
trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); TransformGroup クラスはローカル座標系を設置することで、Transform3D ク ラスを設置することができる。この設定により、TransformGroup クラスによっ て設置されたローカル座標内の全ての物体に対してTransform3D クラスが行う 変換が実行される。また、マウスイベント、キーボード操作をする際は、常に ローカル座標が変更されるため、変更の許可を取らなければならない。それが、 setCapability メソッドである。続いて描画範囲の指定方法である。 BoundingSphere bounds =
new BoundingSphere(new Point3d(),100.0); シーングラフの空間は、無限大にに広がっているため、あらかじめ描画範囲を設 定し、その部分にだけ描画を行う影響を及ぼすようにさせるクラスである。主に マウスイベント、光源、背景、霧などを設定するときに使う。
次は、その描画範囲を用いて設定をする光源について説明する。以下のように 光源を指定する。
lightD1.setInfluencingBounds(new BoundingSphere()); Vector3f dir1 = new Vector3f(-1.0f, -1.0f, -0.5f); dir1.normalize(); lightD1.setDirection(dir1); lightD1.setColor(new Color3f(0.0f, 0.0f, 1.0f)); objRoot.addChild(lightD1); 立体感は光源によって照らされることにより、実行画面に効果が初めて表示さ れる。Java3D には光を設定するのに光源を設定する Light クラス、色を設定する Color3f クラス、方向を設定する Vector3f クラス、位置を設定する Point3f クラス などがある。DirectionalLight クラスは平行光線で空間全体を照らす。Color3f で 光の色を指定してVector3f で光の方向を示す。
背景も光源同様に、描画範囲が必要になる。以下のように、背景を指定する。 Background background = createBackground(BACKGROUND_TEXTURE);
background.setApplicationBounds(bounds); objRoot.addChild(background);
背景を設置するにはBackGround クラスを使用する。setApplicationBounds メソッ ドで光源同様に描画範囲を設定する。このプログラムには、背景にテクスチャの 貼り付けを適用する。以下のクラスでテクスチャファイルを読み込む。
private Background createBackground(String backgroundFile){
TextureLoader textureLoader = createTextureLoader(backgroundFile); Background background = new Background(textureLoader.getImage()); return background;
3.6
キャンパス全体図
キャンパス全体図について詳しく述べていく。
3.6.1
シーングラフ
次の図は、キャンパス全体図にたいするシーングラフを簡略化したものである。
3.6.2
プログラム説明
(1) 次のプログラムは、キャンパスの土台を作るプログラムの一部である。 以下のように、頂点を指定して作成する。
private static final float[] coordinateData = { // nishi machi -153.97f, 0.0f, 93.11f, -135.58f, 0.0f, 92.86f, -135.58f, 0.0f, 94.88f, -115.04f, 0.0f, 94.00f, -114.91f, 0.0f, 92.36f, -78.37f, 0.0f, 91.73f, -76.61f, 0.0f, 112.77f, -31.25f, 0.0f, 111.26f, -23.18f, 0.0f, 111.13f, -18.40f, 0.0f, 111.01f, -17.39f, 0.0f, 68.54f, 167.20f, 0.0f, 69.55f, ・・・・省略・・・・ }; この土台にaddObject でオブジェクトをぶら下げていく。
(2) 個々の棟の仕組み、プログラム例
一見、1つのポリゴンのようにみえる棟であるが、Room というクラスを作成し、 このクラスを組み合わせてできている。次のプログラムは全体図におけるG 棟の 内容をしめす
public class GHall extends BranchGroup { static float H = 3.65f; static float H1 = 0.0f; static float H2 = H; static float H3 = H*2; static float H4 = H*3; static float H5 = H*4; public GHall () { addChild(new Room( 12.0f, H1, 0.0f, 3.0f,H*4, 7.0f)); // staircase addChild(new Room( 12.5f, H1,52.0f, 2.5f,H*4, 2.5f)); // EV addChild(new Room( 9.5f, H1,49.0f, 5.5f,H*4, 3.0f)); // staircase // first floor addChild(new Room( 0.0f, H1, 0.0f, 7.0f, H, 14.0f)); addChild(new Room( 0.0f, H1, 7.0f, 6.5f, H, 7.0f)); addChild(new Room( 0.0f, H1,14.0f, 7.0f, H, 7.0f)); addChild(new Room( 0.0f, H1,21.0f, 7.0f, H, 7.0f)); addChild(new Room( 9.5f, H1,12.0f, 5.5f, H, 2.0f)); addChild(new Room( 9.5f, H1,14.0f, 5.5f, H, 7.0f)); addChild(new Room( 9.5f, H1,21.0f, 5.5f, H, 3.5f)); ・・・途中省略・・・ // roof addChild(new Plate( 0.0f, H5, 0.0f, 15.0f, 0.0f, 62.0f));
addChild(new Room( 9.5f, H5, 49.0f, 4.24f, H, 5.90f)); } }
3.6.3
キャンパス実行結果
キャンパス全体図の実行結果を示す。 図 3.3 キャンパス全体図3.7
G棟
G 棟について詳しく述べていく。3.7.1
シーングラフ
図 3.4 G 棟のシーングラフ3.7.2
プログラムの説明
G棟はより詳細に描くためにシーングラフにおいてノードを次々と足した。以 下特別な効果を適用したオブジェクトについて説明する。 (1)半透明な物体・・窓 物体を半透明にするためにはAppearance オブジェクトに対して setTransparency-Attributes メソッドで TransParencysetTransparency-Attributes オブジェクトを指定する。Trans-parencyAttributes オブジェクトは透明度を指定するオブジェクトである。次のよ うにしてプログラム内で透明度を指定した。TransparencyInterpolator ta = new TransparencyInterpolator(alpha,target,0.0f,1.0f); transparency は 0.0∼1.0 の範囲で 1.0 が完全な透明を示す。 (2) 電球・・発光 G棟通路に電球、各教室に蛍光灯を設置した。これらオブジェクトには以下の機 能を適用する。発光による色(emissiveColor)について説明する。 setEmissiveColor() メソッドは、それ自体が発光している物体の発光色を設定す る。発光による色は、光源がなくても有効になる。emissiveColor の設定方法を 示す。
Appearance ap = new Appearance(); Material m = new Material();
m.setEmissiveColor(new Color3f(1.0f,0.9f,0.6f)); ap.setMaterial(m); 実行結果 これは、物体に発光色を設定した実行結果である。 図 3.5 電球 このようにしてG棟には細かな設定を加えている。
3.7.3
G棟の実行結果
つぎの図がこれらのオブジェクトを組み合わせて作成したG棟である。 図 3.6 G 棟 正面図 図 3.7 G 棟 側面図3.8
動き
実際に適用した動きについて説明する。3.8.1
マウスピッキング
マウスピッキングとは、クリックされた位置にある物体を特定し、その上位の TransformGroup を取得する。そして、その TransformGroup に回転、移動を適 用する。キャンパス全体図には、マウスピッキングが指定されている。 マウスピッキングのパッケージcom.sun.j3d.utils.picking.behaviors.*; を最初に インポートする必要がある。次にマウスピッキングの許可を設定しなければなら ない。以下のように設定する。 objTrans.setCapability(objTrans.ALLOW_TRANSFORM_WRITE); objTrans.setCapability(objTrans.ALLOW_TRANSFORM_READ); objTrans.setCapability(objTrans.ENABLE_PICK_REPORTING); その後に、このマウスピッキングの指定範囲をあたえる必要がある。範囲の設定 方法は以下のようになる。 BoundingSphere bounds =new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); 次にPickRotateBehavior の生成をしなければならない。
PickRotateBehavior pick =
new PickRotateBehavior(objRoot, myCanvas, bounds); このようにしていすることで、ピッキングの準備が完了した。最後に以下のよう にaddChild で BranchGoup に構築する。
3.8.2
アニメーション
G棟だけを表示するプログラムには、アニメーションを指定した。 アニメー ションの型とクラスを示す。
Transform3D yAxis = new Transform3D(); Alpha rotationAlpha = new Alpha(-1,40000); RotationInterpolator rotator =
new RotationInterpolator(rotationAlpha,objTrans, yAxis,0.0f,(float)Math.PI*2.0f); 上記におけるRoationInterpolator は物体を回転させるためのクラスである。こ のクラスによって回転する物体はTransformGroup クラスのインスタンスで定義 する。Alpha クラスは時間の流れを得るクラスで、アルファ値と呼ばれる値 0.0∼ 1.0 へと変化する値に変換する。Alpha の引数は、-1 は無限に回転することを示 し、40000 は、Alpha が 0.0 から1.0に変化するまでの秒数(ミリ秒)を示す。
3.8.3
視点移動
キーボード操作による移動についてcom.sun.j3d.utils.behaviors.keyboard パッ ケージを使ってキーボード操作を行う。最初に視点側のTransformGroup を取得 する。 TransformGroup vtrans = getUniverse().getViewingPlatform().getViewPlatformTransform(); PlatformGeometry pg = new PlatformGeometry();取得したTransformGroup をコンストラクタ引数にして com.sun.j3d.utils.behaviors.keyboard パッケージのkeyNavigatorBehavior を生成する。次にその設定方法を示す。
KeyBehavior kb = new KeyBehavior(vtrans); kb.setSchedulingBounds(bounds);
視点側のツリーにkeyNavigatorBehavior を追加するために、com.sun.j3d.universe パッケージのPlatformGeometry を生成する。
PlatformGeometry pg = new PlatformGeometry(); KeyBehavior kb = new KeyBehavior(vtrans);
kb.setSchedulingBounds(bounds); pg.addChild(kb);
この指定により次のプログラム(キー操作)を視点側のTransformGroup に追加 する。
キーボードイベント処理プログラムを次に示す。このプログラムにより、それ ぞれのキーが設定される。
public void processStimulus(Enumeration criteria) { WakeupOnAWTEvent wevent = null;
AWTEvent[] events = null; go = true;
while (criteria.hasMoreElements()) {
wevent = (WakeupOnAWTEvent)criteria.nextElement(); events = wevent.getAWTEvent();
for (int i=0; i<events.length; i++) { if (events[i] instanceof KeyEvent) {
int code = ((KeyEvent)events[i]).getKeyCode(); switch (code) { case KeyEvent.VK_UP: //↑キーの処理部分 break; case KeyEvent.VK_DOWN: //↓キーの処理部分 break; case KeyEvent.VK_RIGHT: //→キーの処理部分 break; case KeyEvent.VK_LEFT: //←キーの処理部分 break; ・・・省略・・・ } }
} }
wakeupOn(kpress); }
第
4
章 視点移動の操作方法
キーボード操作について説明する。キャンパス内をキーボードの↑、↓、→、 ←を用いて、キャンパス内を移動する。その方法について以下のようにまとめて みた。 • ↑ 一回押すごとに20cm前進 • ↓ 一回押すごとに20cm後退 • → 一回押すごとに右へ10度回転 • ← 一回押すごとに左へ10度回転 このキャンパス内の移動は、それだけではない。階段も上り下りできるように設 定してある。 • ↑ 一回押すごとに一段ずつ昇る • ↓ 一回押すごとに一段ずつ下る G棟には階段だけではなくエレベータも設置してある。次は、エレベータにおけ るキーボード操作方法である。 • U 一回押すごとに20cmずつ上昇 • D 一回押すごとに20cmずつ下降 エレベータのキーボード操作におけるキー ”U ”はUp を表す。”D ”は Down を表す。このようなキー操作を指定することで、キャンパス及びG棟内を見て動 き回ることができる。キャンパス内では、池や木、そのほかの建物の配置を見ながら移動できたり、そして、G棟では個々の部屋に入りその様子を楽しむことが できる。
第
5
章 まとめ
結果: 本研究により、Java3D を用いて、奈良女子大学キャンパス3次元モデル、及 びG棟を構築することができた。オブジェクトの配置、G棟における配置は、実 寸をもちいて計算している。また、作成したキャンパス内、G棟内をキーボード 操作を用いて移動できるように指定することができた。ただし、ファイルサイズ が大きくなりすぎ、実行するまでに、時間を要してしまう。移動においても、時 間がかかってしまう。 今後の課題: 3次元モデルをよりリアルなものに近づけていかなければならない。そのため にも、今以上にオブジェクトや操作について学習し、構造の理解を深めていく必 要がある。また、視点移動においても、衝突判定を適用したり、スムーズに移動 できるようにしたりと、さらなる考察が必要である。第
6
章 謝辞
本研究の作成にあたり親身にご指導、助言を頂きました加古富志雄教授に対し て深く感謝致します。また、研究に行き詰まった時に、ご意見や励ましの言葉を 頂きました数理情報学講座の諸氏に感謝を表します。
参考文献
[1] 著者:えんどうやすゆき 平鍋健児 題名:Java3D プログラミング・バイブル 出版社:株式会社ナツメ社 出版年:平成15年4月28日 [2] 著者:太田篤史 題名:やさしくわかるJava3D 出版社:株式会社技術評論社 出版年:平成15年3月1日[3] 著者 Sun’s Java3D engineering team 題名 Java3D API Tutorial