ようこそJava 3Dの世界へ!

新しいJavaのグラフィックAPIであるJava 3Dの世界へようこそ。
Javaはオブジェクト指向プログラミングやネットワーク・プログラミングの世界を一新しましたが、Java 3Dは3次元グラフィックの世界を進化させる可能性を秘めています。

■Java 3Dとは?

Java 3Dは、Java の標準的な3次元グラフィックAPIです。
正式名称はJava 3D APIといいます。
蛇足ですがAPIとは"Application Program Interface"の略です。
アプリケーションプログラムから、システム(OS)やライブラリー、言語処理系などに対する、標準的な機能呼び出しの方法について定義したものがAPIです。

Java 3Dは1998年にSun (JavaSoft)によって開発されました。
Javaでは、"Write once, run anywhere"というスローガンがよく使われます。
これは、一度コンパイルすれば、Javaをサポートするどんな環境でも実行可能になることをうたっています。
Java 3Dには、これによく似た"Write once, view anywhere"というスローガンがあります。
Java 3Dでは、一度コンパイルされればJava 2をサポートするどんな環境でも表示可能になることを目指しています。

■■どういう特徴がありますか?

Java 3Dは、シーン・グラフをベースにした3次元グラフィックAPIです。
Java 3Dでは実際の描画処理は、OpenGLやDirect Xなどハードウエアに密着した既存のグラフィックAPIに担当させています。
Java 3Dの目的はJava 2 (JDK 1.2)をサポートするさまざまなハードウエア上で再コンパイルすることなく描画処理を行うことです。
このため、ハードウエア側の事情にに左右されないように、Java 3Dのプログラムモデルは抽象化されているのです。
具体的には、プログラマーは個々の描画APIを直接使用するのではなく、シーン・グラフと呼ばれるオブジェクト・モデルを構築していくことでグラフィック・プログラミングを行います。

この、ハードウエアに左右されないという利点は、特定ハードウエアでの処理効率(パフォーマンス)を追求する場合には欠点にもなります。
しかし、アプレットや分散オブジェクトでネットワーク・プログラミングを一新させたJavaの優位性はJava 3Dにも当てはまります。
Java 3Dを使ったアプレットは、通常のアプレットと同様にネットワークを経由して動的にダウンロードされ、ブラウザー上で実行できます。
さまざまなハードウエアが混在するネットワーク環境にも対応できる、ユニークな3次元APIと言えます。

■■OpenGLって何ですか? Direct Xとは?

OpenGLはSGI(シリコングラフィックス)が開発した3次元グラフィックAPIです。
同社のUNIXワークステーションをはじめ、IBM、Sunなど他社のUNIXワークステーション、Windows 95/98, Windows NTなどに移植されています。

Direct XはMicrosoftとIntelが開発したマルチメディアAPIです。DirectXWindows 95/98, Windows NT, Windows 2000などで動作します。DirectXはDirect3Dという3次元グラフィックスAPIを含みます。

■■シーン・グラフとは何ですか? Java 3Dのシーン・グラフの特徴は?

シーン・グラフとは、オブジェクトを木構造に構築していくことで描画を実現するグラフィック・モデルです。
ここで言うオブジェクトには、目に見えるものも見えないものも含んでいます。
たとえば球体や円錐、円柱など、目に見える物体もこれに含まれます。
また、色や透明度、質感などの属性もひとつのオブジェクトです。
さらに、物体に対する移動、回転、拡大/縮小などの座標変換操作もひとつのオブジェクトを構成します。
これらの静的な要素に加えて、物体の運動などの時間的な変化や、マウスなど入力装置に対応する物体/属性の振る舞いを定義したもの(Behaviorと呼ばれます)もひとつのオブジェクトを構成します。

このようなシーン・グラフをベースにしたグラフィックAPIとしては、シリコングラフィックスが開発したIRIS PaformerやOpen Inventorなどがあります。
ここで多少脱線しますが、著者が好きなグラフィックAPIのひとつであるOpen Inventorについて少し書いておきます。
Open InventorはOpenGLを使って構築されたC++のクラスライブラリーです。
Open Inventorは洗練されたファイルシステムも持っています。このファイルシステムはVRML 1.0の母体にもなりました。
IRIS PerformerやOpen Inventor3Dは、Java 3DやOpenGL Optimizer、Fahrenheitなど、その後のシーン・グラフベースのAPIに強い影響を与えました。(著者は残念ながらIRIS Paformerを使った経験がありません)

Java 3Dはこれら既存のシーン・グラフベースのAPIの資産に加えて、ビュー・モデルもシーン・グラフとして構築する道を選びました。
これは、Java 3Dの仕様決定に、バーチャル・リアリティー分野の技術者が多くかかわっていることと関係があるように思えます。
それまでの3次元グラフィックではディスプレイやマウス、キーボード、ジョイスティックなど、コンソール装置だけを考えればよかったので、表示側のモデル(ビューモデル)は比較的単純でよかったのです。
バーチャル・リアリティーの分野では、視線や頭の動きに追随するヘッドマウント・ディスプレイ、体の動きをフィードバックするデータ・スーツ、データ・グローブなど、さまざまな表示装置、入力装置を同時にサポートしなければなりません。
描画されるシーンと、それを表示するビュー、シーンを操作する入力ディバイスなどをすべて統合し、制御するためのシーン・グラフモデルが必要になったのだと思います。

j3dscene.gif

上の図の左側に伸びているのがシーン側のツリーです。
シーンを構成する要素としては、移動、回転、拡大縮小など座標変換操作を適用するためのTransformGroupノード、物体の形状や頂点座標、色などの属性を管理するShape3Dノード、物体の振る舞いを制御するためのBehaviorノードなどがあります。

ビューを構成する要素としては、ビュー側の移動、回転など座標変換操作を適用するためのTransformGroupノード、ユーザーの視点や人体の物理状態を管理したり、レンダリングに必要なさまざまなパラメーターを保持しているViewオブジェクト、Viewオブジェクトから参照され、描画側の物理装置を制御・管理しているViewPlatformオブジェクト、などがあります。

シーンやビューを構成するこれらのツリーは、BranchGroupと呼ばれるノードによって保持されています。
BranchGroupはシーンやビューのツリーの起点となるノードです。
Java 3Dには"compile"モードと呼ばれるシーンの最適化モードがありますが、compile()メソッドはこのBranchGroupに対して適用されるメソッドです。
また、シーン・グラフのツリーを動的に追加したり削除したりする機能がありますが、基本的にはこのBranchGroupノードを起点として追加したり削除したりします。

さらにその上位にはLocaleオブジェクトがあります。
Localeオブジェクトは、VirtualUniverseと呼ばれる仮想空間上の特定位置を保持しています。
Java 3Dの高解像度の仮想空間は256ビット固定小数点の座標系を持ち、プランク長から惑星、銀河、全宇宙レベルまでのほとんどあらゆる座標を定義できます。
ひとつまたは複数のLocaleオブジェクトは、ただひとつのVirtualUniverseオブジェクトによって保持されます。
VirtualUniverseオブジェクトは、Java 3Dのすべての仮想空間を保持することになります。
(実際にはVirtualUniverseオブジェクトは何も仕事をしないように見えます。Java 3Dの全宇宙の起点となる最上位のオブジェクトです)

個々のオブジェクト、ノードについてはこの後の章でもそれぞれ解説していく予定です。
ここではざっと「いろんなオブジェクトがあって、木構造で構成されている描画モデル」という程度に理解しておいてください。

■■Java 3Dのシーングラフの構造を表示する方法がありますか?

J3dTreeというライブラリーがあります。

http://www.tornadolabs.com/News/J3dTree_Home/j3dtree_home.html

自分のプログラムにこのライブラリーを組み込むことで、Java 3Dのシーングラフ構造をJFC SwingのJTreeに表示することができます。

■■OpenGLとかDirectXとかVRMLとか、どれをやったらよいのかわかりません。

でしたらJava 3Dをお薦めします。(笑)
あなたがC言語と3次元グラフィックの経験、知識があり、ハードウエア固有のパフォーマンスを追求するようなプロフェッショナル向けのグラフィック・アプリケーションを作りたいのならOpenGLをお薦めします。OpenGLはプロのための道具です。
OpenGLはシリコングラフィックスのUNIXークステーションや、他社のさまざまなUNIXワークステーション、さらにWindows 95/98、Windows NT (Windows 2000)などで動作します。

また、あなたに上記と同様のC言語とグラフィックの経験、知識があり、Windows 95/98やWindows 2000などのゲーム開発をしたいならDirect Xをお薦めします。

Java 3Dはこれらの高速なグラフィックスAPIを使っていますが、プログラミングにはJava言語を使用します。また、シーングラフ構造を記述するだけで手軽にグラフィックス描画を体験できます。Java 3Dのプログラミングはとても簡単で楽しいです。このことは本書を通して繰り返し書いていくつもりです。

VRMLについては、OpenGLやDirect X、Java 3Dなどとかなり異なります。
まず、VRMLは3次元グラフィックのための実行時APIではありません。
3次元モデルや物体の振る舞いを記述するための記述言語です。
Java 3Dを使ったアプレットもネットワーク経由でダウンロードされ、描画されますが、Java 3Dアプレットはプログラムがネットワーク経由でダウンロードされて描画されるのに対し、VRMLではデータだけがダウンロードされます。 実際のシーンの再現と描画は、ブラウザーのプラグインとして提供されているVRMLのローダーとビュアーが行います。 Java 3Dは実行時APIであり、固有のファイルシステムは持っていませんが、VRMLをロードできるライブラリーがいくつか公開されています。

VRMLについてですが、従来VRMLの普及、仕様策定などのための組織であったVRML ConsortiumがWeb3D Consortiumと改称しました。

VRML1.0、VRML97の次の規格は、XML仕様に準拠したX3Dという規格としてまとめられるようです。

X3Dについての詳細はWeb3D Connourtiumを参照してください。

http://www.web3d.org/

■■Java 3D はどんな描画モードを持っていますか? その特徴は?

Java 3D には描画モードがいくつかあります。大きく分けると次の2つです。

リテインド・モードでのプログラマーの主な作業はシーングラフの構築です。シーングラフの描画は処理系に委ねます。

具体的には、シーングラフが LocaleaddBranchGraph() されると描画が開始されます。いつどんな順序で何がどこに描画されるか、プログラマーが知る術は (基本的には) ありません。

この、シーングラフが Locale に接続されている状態を "live" 状態と呼びます。live 状態になった後ではできない操作があります。(capabitily bit の設定など。プログラミングのところで説明します) このような操作は live になる前に行う必要があります。

リテインド・モードのメリットとしては、シーングラフの構築に重点を置けば良いという点だと思います。本書ではすべてリテインド・モードを使用しました。デメリットは細かい描画の制御ができないという点でしょう。

イミディエイト・モードでは描画はプログラマーの仕事です。点、線分、ポリゴンなどを一つづつ定義し、描画していかなければなりません。いつどんな順序で何をどこに描画するのか、プログラマーはすべてをコーディングしなければなりません。イミディエイト・モードで最初にすることは、Java 3D の自動描画機能を停止させることです。

イミディエイト・モードのメリットはプログラマーが描画を制御できるという点でしょう。デメリットはすべて自分で制御しなければ描画できないという点です。

シーングラフを構築し、描画の一部をプログラマーが行う次のモードもあります。

混合モードでは、Java 3D の自動描画機能は停止させません。自動描画のあるタイミングで、プログラマーはイミディエイト・モードと同じ方法でオブジェクトの描画を行います。シーングラフとして構築したオブジェクトは自動的に描画されます。

リテインド・モードには次のモードもあります。

BranchGroup ノードには compile() というメソッドがあります。この BranchGroup 配下のツリーを「コンパイル」することができます。

ここで言う「コンパイル」とは何でしょうか?

Java 3D のソースコードが公開されていないので詳細はわかりませんが、 BranchGroupの「コンパイル」によってシーングラフは最適化され、描画のパフォーマンスが向上します。

いったん「コンパイル」されてしまうと、できなくなる操作があります。例えば、「コンパイル」したシーングラフへノードを追加したり、削除したりすることは出来ません。

「コンパイル」のメリットは描画パフォーマンスの向上です。可能な限り「コンパイル」を使った方が良いでしょう。ただしコンパイル前に capability bit の設定などの作業を忘れないようにしましょう。デメリットは、実行時に動的にツリーを追加、削除できなくなるという点です。

註: capability bit について
Java 3D のオブジェクトの多くは、その属性値の読み取り/書き込みなどの許可/不許可のビットを持っています。デフォルトでは不許可です。
実行時に、不許可になっている属性値への操作(読み取りなど)が行われると、CapabitilyNotSetException() という例外が発生します。

■Java 3DのWebページは?

まず、JavaSoftのJava 3DのWebページがあります。ここではJava 3Dや各種ドキュメントをダウンロードすることができます。
また、Java 3DのAPI仕様やホワイトペーパー、FAQを読むこともできます。

http://java.sun.com/products/java-media/3D/

気象、宇宙天文、医学、地質などの分野の、Java 3Dを使った3次元視覚化アプリケーションが紹介されています。

http://java.sun.com/products/java-media/3D/in_action/

Sunの、Graphics@Sunも紹介しておきましょう。ここはOpenGLやJava 3Dなどの活用事例、応用プロジェクトの紹介があります。

http://www.sun.com/software/graphics/

■Java 3Dのメーリングリストは?

英語によるメーリングリストとしては、Sun (JavaSoft)のJava 3D interest groupがあります。
参加方法は下記ページにあります。

http://java.sun.com/products/java-media/3D/forDevelopers/interest_group.html

このメーリングリストのアーカイブは下記から参照できます。

http://archives.java.sun.com/archives/java3d-interest.html

日本語によるメーリングリストは、著者が管理しているJava 3Djpメーリングリストがあります。
参加方法は下記ページにあります。

http://www.ipc-tokai.or.jp/~atusi/java3d/ml/index.html

Java 3Djpメーリングリストのアーカイブは下記から参照できます。

http://www.javaopen.org/j3dbook/mlarchive/threads.html

■Java 3DのFAQやTipsは?

英語によるFAQとしては、Sun (JavaSoft)によるものが下記にあります。

http://java.sun.com/products/java-media/3D/forDevelopers/java3dfaq.html

Sun以外のものとしてはNCSAのStephen R. Pietrowiczらによるものがあります。なお、Stephen R. PietrowiczはこのFAQを元に書籍を執筆予定とのことです。

http://www.j3d.org/faq/

Java 3D API TutrialがSunから公開されています。

http://www.sun.com/desktop/java3d/collateral/#tutorial

このJava 3D API TutorialはJava 3Dの最良の入門書だと思います。本書で扱わなかったAPIもカバーされています。このTutrialのサンプルをダウンロードすることができます。

http://java.sun.com/products/java-media/3D/collateral/j3d_tutorial_examples.jar.zip

http://java.sun.com/products/java-media/3D/collateral/j3d_tutorial_examples.jar.tar

日本語によるFAQには次のものがあります。

Java 3D日本語FAQ

http://tech.webcity.ne.jp/~andoh/java/3d/

ABA Games Java 3D -Java 3D自分FAQ-

http://www.asahi-net.or.jp/~cs8k-cyu/java3d/

詳細なプログラミングガイドとしては次ののもがあります。

Java 3DTips

http://www.ipc-tokai.or.jp/~atusi/java3d/

なお、本書のサポートページは以下にあります。

http://www.javaopen.org/j3dbook/index.html

■Java 3Dの参考書は?

英語のものでは、Java 3D API Specificationを書籍にしたものがあります。

The Java 3D API Specification

著 Kevin Rushforth, Michael Deering, Henry A. Sowizral
出版社 Addison-Wesley Pub Co, $39.95 ISBN 020-1325764
http://java.sun.com/docs/books/java3d/

上記の日本語版があります。

The Java 3D API 仕様 (日本語版)

著 Kevin Rushforth, Michael Deering, Henry A. Sowizral 翻訳 竹内里佳 監修 安藤幸央
出版社: 株式会社アスキー 価格: 6400 円(税抜) ISBN 4-7561-3017-8
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3017-8.html

これらはJava 3Dの開発チームによってかかれたAPI仕様です。
ただし Java 3D 1.1 Alpha 仕様をもとにしているので現在では多少古くなっています。最新のAPI仕様はSunからダウンロードできます。

Java 3D API Specificationのオンライン版は下記にあります。
(本書を執筆している1999年12月の時点ではバージョン1.1.2です)

http://java.sun.com/products/java-media/3D/forDevelopers/j3dguide/j3dTOC.doc.html

また、下記からダウンロードできます。

http://java.sun.com/products/java-media/3D/j3dguide.zip (HTML版 zipファイル)

http://java.sun.com/products/java-media/3D/j3dguide.tar.Z (HTML版 tar + Compressファイル)

http://java.sun.com/products/java-media/3D/j3dguide.pdf (PDF版)

http://java.sun.com/products/java-media/3D/j3dguide.ps (Postscript版)

著者は日本語訳がまだ無いとき、これをすべて印刷しました。書籍を購入するより高くついたかも知れません。

Java 3Dの書籍に付いては以下のページも参考にしてください。

http://www.j3d.org/books/

■Java 3Dの各種ソースは?(demo, com.sun.j3d)

まず、Java 3Dのデモ・サンプルのソースコードですが、Java 3D 1.1.3をインストールすると、デフォルトの設定ではC:\jdk1.2\demo\Java 3Dディレクトリー配下にインストールされます。

また、com.sun.j3d 以下のパッケージのソースコードが、JDKディレクトリー配下にファイル名Java 3D-utils-src.jarとしてインストールされます。 これのソースコードはSun(JavaSoft)によるユーティリティークラスのソースコードであり、Java 3Dの貴重なプログラム・サンプルです。ぜひプリントアウトして熟読してみてください。(著者はそうしています;->)

■VRMLとの連携は?(CyberVRMLの紹介)

Java 3Dは実行時APIであり、特にファイルシステムを持ちませんが、VRML97 形式ファイルのローダー/ビュアーが公開されています。
下記から VRML Loader/Player をダウンロード出来ます。ソースコードも公開されています。

http://www.vrml.org/WorkingGroups/vrml-java3d/

ファイル読み込みに関しては、WaveFrontの.objファイルのローダー/ビュアーがJava 3D 1.1.1に付属します。
WaveFrontは長い歴史を持つ3次元グラフィック・ソフトです。エイリアス・ウエーブフロント社の製品です。
また、src.com.sun.j3d.loaders.lw3dパッケージとしてLightWaveファイルのローダー/ビュアーが付属します。
LightWaveはAmigaのVideoToasterというソフトに添付された3次元グラフィックソフトとしてスタートし、Windows、Macintoshなど多くのプラットフォームに移植されたデスクトップ市場向けの3次元グラフィックソフトです。
比較的低価格ながら100万円を超えるソフトに匹敵する豊富な機能を持ち、いまや代表的な3次元グラフィックソフトになりました。

ファイルの保存(書きこみ)が可能なライブラリーはそう多くありません。
というか、私の知る限りひとつしかないのです。
その唯一のソフト、CyberVRML97 for Java 3Dをご紹介します。

http://www.cyber.koganei.tokyo.jp/vrml/cv97/cv97java/index.html

このソフトは今野賢さんの作品です。
(今野さんは、SunのJava 3Dプログラムコンテストに入賞された唯一の日本人プログラマーです)
このCyberVRML97を使えば、あなたが構築したJava 3DのシーンをVRML97形式のファイルとして保存することができます。

このCyberVRML97 for Java 3Dとは逆に、VRML97, Autodesk 3DS, Wavefront OBJ, LightWave3D LWS, SENSE8 NFFなどのグラフィックファイルを読み込み、Java 3Dのソースコードを生成できる(!) CyberForm for Java 3Dもご紹介しておきましょう。

http://www.cyber.koganei.tokyo.jp/vrml/cyberform/j3d/index.html

■■他形式ファイルの利用にあたって注意すべき点

ここで「他形式」とは「Java 3D API仕様に規定されていない」という意味です。

「Java 3D API仕様で何らかのファイル形式が規定されている」ということはありません(*)ので、「他形式」と呼ぶのはは適切な表現でないかも知れません。しかし他に良い言い方が見つからないので「他形式ファイル」と呼ぶことにします。

VRML97などのファイルフォーマットをJava 3Dに読み込む場合、元のファイルにあるすべての要素が再現できるとは限りません。特にアニメーションなどの設定は完全に再現できない可能性があります。

また、Java 3Dで構築したシーンを保存する場合にも、その内容のすべてが保存できるとは限りません。

他形式ファイルの利用にあたっては、何がどこまで再現できるのか十分テストし、その特徴を見極めたうえで上手に利用することが望ましいと思います。

(*)注
Java 3D API仕様では「ジオメトリ圧縮フォーマット」という形式が規定されています。
これがJava 3D API仕様で規定されている唯一のフォーマットと言えるかもしれません。
ただし通常のシーングラフをそのまま保存するものではありません。その名の通り、頂点データなどの幾何学データをバイナリー圧縮するフォーマットです。