最新バージョン Java3D 1.2 完全ガイド


技術評論社 JavaPress vol.13 に掲載された記事を公開します (無断転載禁止)。

はじめに / 動作環境 / オフスクリーン / マルチプルテクスチャ / その他の新機能 / おわりに / 戻る / トップページ


はじめに

今年の 5/18、Java の 3D グラフィックス API である Java3D の最新バージョン 1.2 がリリースされました。 バージョン 1.1 ではサポートされず実現不可能であった機能が実装され、 Java3D はより使いやすいものとなりました。 オフスクリーンレンダリングやマルチプルレンダリング、2Dでの描画などが その新機能として挙げられ、パフォーマンスの向上もしています。
 
本記事ではこれらの新機能についてサンプルをあげながら解説していきます。 Java3D しか 3D グラフィックエンジンを使ったことがない人にもわかるように オフスクリーンレンダリングなどの用語や使用目的についても説明していきます。

動作環境は?

6/1 時点でバージョン 1.2 は OpenGL 版のみがリリースされています。 (http://java.sun.com/products/java-media/3D/download.html からダウンロードできます)
 
Java3D 1.2 は Windows 95 / 98 / NT4.0 / 2000 と Solaris 2.6 以上で動作します。 Windows 版では Java2 1.2.2 以上の実行環境、バージョン 1.1 以上の OpenGL、 NT4.0 ではサービスパック 3 以降が必要です。 Solaris 版では Java2 1.2.2 以上の実行環境、OpenGL をサポートしているフレームバッファ、 OpenGL for Solaris 1.2.1 以上が必要です。 また、近日中に Blackdown (http://www.blackdown.org/java-linux/jdk1.2-status/java-3d-status.html) から Linux 版もリリースされる予定です。
 
Java Plug-in を使ってブラウザ上で実行させる場合は Java Plug-In 1.2.2 以上 (Java2 1.2 実行環境に含まれています) が必要です。 基本的にバージョン 1.1 が動作する環境であればバージョン 1.2 も動作します。

オフスクリーンレンダリングのサンプル

それでは、早速サンプルを使って解説していきたいと思います。
 
図 1,図 2 をご覧下さい。 このサンプルは地面の上にボール・箱・円錐の置かれた仮想空間を 自由に動きまわるものです。 プログラムリストは リスト 1リスト 2 (誌面の都合で掲載できなかったリスト FreeWalk.java, FreeViewBehavior.java, Math2.java がここからダウンロードできます) をご覧下さい。
 
図 1 の右上には仮想空間の地図が表示されています。 この地図は BranchGroup クラスのサブクラスのノードとして実装されています。 リスト 1 の Map.java がその地図を表しているクラスのソースです。 リスト 2 の RenderOffscreenBehavior.java はその地図を逐次書きかえる Behavior のソースです。
 
(図1 FreeView の実行結果1) (図2 FreeView の実行結果2)

オフスクリーンレンダリング

図 1 の右上に表示されている地図自体もレンダリング (脚注:SceneGraph を元に実際に 3D グラフィックを描画することを レンダリングといいます) されたものである点に注目してください。
 
仮想空間を歩き回るプログラムなら Java3D 1.1 でも実現可能ですが、 この地図のようにレンダリング結果を画面に重ねることは非常に困難でした。 このサンプルの地図の表示には Java3D 1.2 で導入された新機能である オフスクリーンレンダリングを使っています。
 
オフスクリーンレンダリングとは画面に直接レンダリングするのではなく、 画像オブジェクトなどにレンダリングをすることです。 オフスクリーンレンダリングを使えば、レンダリングした画像を 表示する前にさらに加工することができます。 このサンプルの場合は空の上から見た画面をレンダリングして、 地図 (板の形をした Shape3D ノード) にテクスチャとして貼っています。
 
オフスクリーンレンダリングには他にも様々な利用法があります。 例えば、光源位置から見える範囲は光の当る範囲であることを利用して、 光源位置からレンダリングした画像を 影のテクスチャとして使う方法があります。 他には、鏡の像をレンダリングして鏡にテクスチャとして 貼りつけることも可能です。

使い方

では、オフスクリーンレンダリングの具体的な使い方を サンプルのソースを使って説明します。
 
まず、Canvas3D オブジェクトにレンダリング対象を オンスクリーンにするかオフスクリーンにするかを決めるフラグがあり、 コンストラクタ Canvas3D(GraphicsConfiguration graphicsConfiguration,boolean offScreen) の引数 offScreen でそのフラグを設定します。
 
オンスクリーンはこれまで Java3D 1.1 で使われてきた方法で、 AWT, Swing の Canvas クラスのように Container に追加して使用します。 レンダリングはシステムによって適当なタイミングで行われます。
 
一方、オフスクリーンの場合、Container には追加せずに使います。 レンダリング対象としたい ImageComponent2D オブジェクトを setOffScreenBuffer(ImageComponent2D buffer) メソッドで設定します。 この時、レンダリングされる画像の大きさは ImageComponent2D オブジェクトの大きさで指定します。 Canvas3D オブジェクトの Component としての大きさは無視されます。
 
サンプルではリスト 1 の 49〜58 行目がこれに当ります。 Java3D では画像オブジェクトとして ImageComponent2D オブジェクトを使用しますので、 BufferedImage オブジェクトを作った後に ImageComponent2D オブジェクトに渡します。 この画像がレンダリング対象となります。
 
レンダリングは renderOffScreenBuffer() メソッドを呼び出すことで行われます。 Canvas3D オブジェクトに結び付けられている View オブジェクトで 表現されている視点からの画像が描かれます (リスト 2 の 44 行目)。 サンプルでは behavior を使い、毎フレームごとにレンダリングさせています。 レンダリングは renderOffScreenBuffer() メソッドが呼ばれた後、 実際にはシステムによって適当なタイミングで行われます。 実行を強制的にさせるためには waitForOffScreenRendering() メソッドを呼び出します (リスト 2 の 45 行目)。
 
また、Canvas3D オブジェクトを作るわけですから、 Screen3D オブジェクト、View オブジェクトの設定も必要であることを 忘れないで下さい (リスト 1、60〜69, 85 行目)。

Texture への参照渡し

Texture オブジェクトを構成する画像に関して、 参照渡しで設定することが出来るようになりました。 live 状態の Texture オブジェクトを構成する 画像の修正も出来るようになっています。
 
処理内容としてはテクスチャに設定する ImageComponent2D オブジェクトにさらに設定する BufferedImage オブジェクトを参勝渡し出来るようになっています。
 
これまではテクスチャの画像を変化させることでアニメーションさせる テクスチャアニメーションを行うためには Texture オブジェクトをいちいち入れ替えなければなりませんでした。 そのため、メモリの使用効率を考えると実用的に テクスチャアニメーションをさせることは不可能でした。
 
これからは参照渡しを利用すれば、 BufferedImage オブジェクトの画像を修正し、 ImageComponent2D オブジェクトを Texture オブジェクトに 再設定するだけでテクスチャアニメーションが可能となります。 これでテクスチャアニメーションは実用的になったといっていいでしょう。
 
サンプルでも地図の表示をしているテクスチャを逐次書き換えています。 事前処理として参照渡しを行い (リスト 1 の 52 行目)、 逐次処理はリスト 2 の 47 行目での ImageComponent2D オブジェクトを Texture オブジェクトに 再設定する処理のみで実現できています。
 
サンプルでは視点位置に白い球を描いており、 逐次書き換えの結果、地図にそれが反映されています。 図 3 の地図部分を拡大したものを図 4 に示します。 視点位置が地図に反映されているのがわかりますでしょうか。
 
(図3 FreeView の実行結果) (図4 図3の地図部分のアップ)

使い方

サンプルのリスト 1、52 行目のように ImageComponent2D クラスのコンストラクタの引数 byReference を true にするだけで参照渡しができます。

new Canvas3D(null)

サンプルのリスト 1、57 行目を見て不思議に思われた方がいるかもしれません。 Canvas3D クラスのコンストラクタの引数に何やら見かけない 記述があるからでしょう。 これはオフスクリーンレンダリングであるからというわけではなく、 Java3D 1.2 ではこのような記述が推奨されます。
 
Canvas3D クラスのコンストラクタの GraphicsConfiguration オブジェクトを指定する引数に これまで null を渡すことが多かったはずです。 実際 Java3D 1.1 に付属するサンプルプログラムの多くもこのようにしてきました。 しかし、これはあまり良くない慣習であるため、 今回のバージョンからは使わないほうが良いとされました (脚注:実行時にワーニングが表示されます)。 new Canvas3D(null) という記述は Java3D が適切な GraphicsConfiguration オブジェクトを 自動的に選び出してくれますが、 ステレオ視などの環境で実行した場合、エラーを生じてしまうためです。

使い方

ではどうすればよいのでしょうか。 サンプルのように SimpleUniverse を使っている場合は簡単です。 SimpleUniverse クラスに新たに static メソッド getPreferredConfiguration() が追加されていますので、 リスト 3 のように getPreferredConfiguration() メソッドの返り値を Canvas3D クラスのコンストラクタの引数に渡せば良いのです。 これで SimpleUniverse クラスが 適切な GraphicsConfiguration オブジェクトを自動的に選び出してくれます。
 
SimpleUniverse を使っていない場合は GraphicsConfigTemplate3D クラスを使います。 SimpleUniverse クラスの getPreferredConfiguration() メソッドの ソースを読んで理解しましょう。
(リスト3 Canvas3D のコンストラクタの指定方法)
	Canvas3D canvas=new Canvas3D(SimpleUniverse.getPreferredConfiguration());

マルチプルテクスチャのサンプル

次に新たにサポートされた マルチプルテクスチャをサンプルを使って解説します。
 
水面のアニメーションを描画するサンプルです (図5)。 静止画ではわかりにくいので、サンプルを実行してみることをお勧めします。 プログラムリストは リスト 4 をご覧下さい。
 
水面は BranchGroup クラスのサブクラスとして実装されています。 Water ノードの下に水面そのものの WaterShape3D ノードと 水面をアニメーションさせるための WaterBehavior ノードがぶら下がっています。
 
(図5 Water の実行結果1)

マルチプルテクスチャ

マルチプルテクスチャとは 複数のテクスチャを混ぜ合わせて貼りつけることを言います。
 
図6をご覧下さい。 左の二つのテクスチャを合成して右端のようにレンダリングされます。 この例では、岩模様のテクスチャと光の当り具合を描いたテクスチャを 混ぜ合わせることでリアルな陰影を表現しています。
 
サンプルプログラムでは水のテクスチャを 2 枚重ね合わせて、 それぞれを違う方向にスクロールさせることで リアルな水のアニメーションを表現しています (リスト 4、21〜34 行目)。 雲なども全く同様にして表現することができます。

使い方

これまでは Appearance オブジェクトに Texture オブジェクトを 設定することでテクスチャを指定していました。 マルチプルテクスチャを使う時は方法が少し異なります。 Appearance オブジェクトには 新たに追加された TextureUnitState クラスのインスタンスの配列を設定します。 TextureUnitState クラスは混合される前のテクスチャを表し、 それをテクスチャステージと呼びます。 Texture オブジェクトなどテクスチャステージの設定は TextureUnitState オブジェクトに設定するようになりました (29〜32 行目)。 TextureAttributes オブジェクト、TexCoordGeneration オブジェクトも 同様に TextureUnitState オブジェクトに設定します。
 
また、GeometryArray クラスには複数のテクスチャ座標を 設定出来るメソッドが追加されています。 貼りつけるテクスチャの数だけテクスチャ座標が必要なためです。 テクスチャ座標の数を指定するため、 また別々のテクスチャステージで同じテクスチャ座標を共有できるようにするため、 GeometryArray クラスのサブクラスのコンストラクタの引数で テクスチャ座標の数とステージ・座標の対応を指定します。 引数 texCoordSetCount には幾つのテクスチャ座標を設定するのかを指定します。 引数 texCoordSetMap には int 型の配列を取り、 n 番目の要素で n 番目のテクスチャステージが 何番目のテクスチャ座標に対応するかを指定します (85 行目)。
 
テクスチャの混ぜ方は TextureAttributes オブジェクトの テクスチャモードで指定します (24〜27 行目)。 setTextureMode(int textureMode) メソッドの引数に TextureAttributes クラスの定数 MODULATE, DECAL, BLEND, REPLACE の いずれかを指定して、混合方法を決めます。
 
(図6 マルチプルテクスチャの実行例)

Geometry への参照渡し

Geometry オブジェクトを構成する頂点座標や色情報を 設定・取得する際にも参照渡しが出来るようになりました。
 
これにより動的な幾何情報が扱い易くなります。 サンプルではテクスチャのスクロールを行うために テクスチャ座標を参照型で設定し、動的に値を変えています (リスト 4、91〜94, 127〜149, 174 行目)。

使い方

コンパイル後または live 状態にある Geometry オブジェクトに 参照されている情報を更新するには以下のようにします。
 
まず、capability bit の ALLOW_REF_DATA_WRITE を 設定する必要があります (88 行目)。 次に、頂点座標などの情報を初めて設定する時は setCoordRef3f(Point3f[] coords) メソッドなど 参照型専用のメソッドを使用します (91〜94 行目)。 そして、その情報の更新は決められたメソッド内でのみ許されます。 その決められたメソッドとは GeometryUpdater インターフェースを 実装したクラスの updateData(Geometry geometry) メソッドです。 更新はその GeometryUpdater インターフェースを実装したクラスの インスタンスを Geometry オブジェクトの updateData(GeometryUpdater updater) メソッドの引数に渡すことで行います。 サンプルでは 127〜149 行目、174 行目が この処理を行っています。
 
また、Geometry クラスのサブクラスのコンストラクタで指定する 頂点フォーマットに定数 BY_REFERENCE を含めることも必要です (84 行目)。

その他の新機能

他にも Java3D 1.2 で新たに導入された機能はたくさんあります。 ここではそれらについて一つ一つ説明していきます。

非互換の変更

Deprecated API の除去

バージョン 1.1 で "Deprecated" 表記されていた メソッド・フィールド・コンストラクタが除去されました。
 
これらは開発過程のバージョン 1.0 や 1.1β版などのなごりで、 1.1 の正式版がリリースされた時点ですでに "Deprecated" 表記されていました。 通常のアプリケーションでは これらのメソッド・フィールド・コンストラクタは使われていないはずなので、 非互換性があるからといって心配する必要はないと思います。

レンダリング機能

OrientedShape3D クラス

視点に対して常に同じ向きを見せる Shape3D である OrientedShape3D クラスが追加されました。
 
behavior である Billboard とは異なり、 OrientedShape3D は物体なので SharedGroup ノードの下にぶら下げたりといった応用が利きます。
 
また、Billboard は behavior で実装されており、その性能の限界から 1 フレームだけ回転が遅れてしまうことがありますが (図7)、 OrientedShape3D ノードは常に正確に自分自身を回転してくれます (図8)。
 
OrientedShape3D クラスは Shape3D クラスのサブクラスですので、 使い方は回転軸の設定が出来る以外は Shape3D ノードと同様です。
 
(図7 視点が回った直後の Billboard の表示結果)
 
(図8 視点が回った直後の OrientedShape3D の表示結果)

Canvas3D 用の Graphics2D

Immediate Mode で Canvas3D に 2D の描画が出来るようになりました。
 
Canvas3D クラス用の Graphics2D クラスが用意され、 これにより 2D 描画を行います。 この Graphics2D クラスのサブクラスである J3DGraphics2D クラスは Canvas3D に Java2D, AWT での描画を可能にするためのものです。
 
使い方は AWT で Graphics2D を使うのと同様、 Canvas3D オブジェクトから getGraphics2D() メソッドで J3DGraphics2D オブジェクトを取得し、 この J3DGraphics2D オブジェクトを使って描画します。

形状・テクスチャ機能

複数の Geometry からなる Shape3D

Shape3D ノードはいままで 1 つの Geometry から構成されていましたが、 複数の Geometry からなる Shape3D ノードも指定出来るようになりました。
 
Shape3D オブジェクトは Geometry オブジェクトの配列を保持するようになり、 これまでの 1 つの Geometry を扱う処理は配列の 0 番を扱うことになります。 つまり内部処理は変わりますが、 これまでの 1 つの Geometry を扱う場合の手順はそのまま使えます。

テクスチャカラーテーブル

テクスチャカラーテーブルの機能が追加されました。 テクスチャカラーテーブルとは文字通りテクスチャの色の変換表です。
 
TextureAttributes オブジェクトにテクスチャカラーテーブルの配列を設定します。 この変換表はテクスチャフィルタリングの後に適用されます。

Geometry のサブセット

Geometry オブジェクトを構成する頂点座標や色情報の 一部を無効にすることが出来るようになりました。
 
具体的には有効となるインデックスの範囲を指定できます。

Texture 座標の Y 軸反転

テクスチャ座標の Y 軸方向を反転することが出来るようになりました。
 
通常、テクスチャ座標はテクスチャ画像の左上を原点として 右方向が X 軸正方向、下方向が Y 軸正方向となっています。 これをテクスチャ画像の左下を原点にして 右方向を X 軸正方向、上方向を Y 軸正方向とすることができます。 この変更で OpenGL や他の 3D エンジンとテクスチャ座標を一致させられるので、 より扱いやすくなったと言えると思います。 また参照渡しと併用出来るので、 自作プログラム中で OpenGL との互換性を保つために アニメーションするテクスチャを 縦方向に反転してコピーをしなければならなかった状況で、 その手間を省くことが出来るようになりました。

CompressedGeometry の境界領域情報

CompressedGeometryHeader クラスに境界領域情報が追加されました。
 
これは CompressedGeometry を生成するユーティリティーによって 生成される情報の一つで、Java3D の内部でも使用されます。

外観の機能

自由な直線パターン

LineAttributes オブジェクトで自由な直線パターンの設定が 出来るようになりました。
 
これは Java3D の下位ライブラリである OpenGL や Direct3D でも使うことの出来た機能です。 LineAttributes オブジェクトに setPatternMask(int mask) メソッドで 16 ビットのマスクパターンを設定します。 また、setPatternScaleFactor(int scaleFactor) メソッドで そのパターンの大きさを設定できます。

斜面方向のポリゴンオフセット

それまでの定数オフセットに加えて 斜面方向のポリゴンオフセットを設定出来るようになりました。

見えない物体

物体を見えなくすることが出来るようになりました。
 
これまでも Switch ノードを利用したり Scenegraph から取り外すことで物体を消すことが出来ましたが、 その時は物体の存在そのものを消すことでした。 この場合の物体を消すということはレンダリングされないことを意味し、 その他の処理の対象にはなります。 つまり、picking や衝突判定の対象になりながらも 表示はされない物体が扱えます。 RenderingAttributes オブジェクトに setVisible(boolean visible) メソッドで見えるかどうか指定します。
 
また View クラスの setVisibilityPolicy(int policy) メソッドで レンダリングされる対象を変更できます。 引数が View.VISIBILITY_DRAW_VISIBLE の場合 (デフォルト)、 「見える」と指定された物体のみをレンダリングします。 引数が View.VISIBILITY_DRAW_INVISIBLE の場合、 「見えない」と指定された物体のみをレンダリングします。 引数が View.VISIBILITY_DRAW_ALL の場合、 「見える」「見えない」の指定に関わらずレンダリングします。

αブレンディング関数

αブレンディング関数の設定が出来るようになりました。
 
TransparencyAttributes オブジェクトの setSrcBlendFunction(int blendFunction) メソッドで 物体の色に掛け合わされる関数、 setDstBlendFunction(int blendFunction) メソッドで 背景の色に掛け合わされる関数を指定します。
 
αブレンディングによって最終的に描かれる色は SrcBlendFunction×物体の色+DstBlendFunction×背景の色 によって求められます。 関数としては 0, 1, α, 1-α が用意されています。
 
これによって様々な効果が表現できます。 例えば、輝く光を表現したい時は 光りの画像を描いたテクスチャを貼った OrientedShape3D ノードを用意し、 SrcBlendFunction, DstBlendFunction とも 1 (加算合成と呼びます) に設定します。 すると、きれいな光の輝きが表現できます。
 
また RenderingAttributes オブジェクトで ラスタオペレーションの設定も出来るようになりました。

頂点の色の無視

頂点の色を無視する設定が出来るようになりました。
 
RenderingAttributes クラスの setIgnoreVertexColors(boolean ignoreVertexColors) メソッドで指定します。

AlternateAppearance

ハイライトの実現のため、 新たに AlternateAppearance ノードが追加されました。
 
この AlternateAppearance ノードは一定の範囲にある物体に対して 物体に設定されている Appearance オブジェクトの代わりに 特定の Appearance オブジェクトを適用するものです。 Fog ノードのようにこのノードを 1 つ作って SceneGraph にぶら下げれば、有効となります。
 
AlternateAppearance オブジェクトには 影響の及ぶ Group ノード、 影響範囲 (Bounds オブジェクトまたは BoundingLeaf オブジェクト) と Appearance オブジェクトを指定します。 SceneGraph 上で指定された Group ノードの下にあるノードのうち、 影響範囲に入っている Shape3D, Morph ノードに 指定した Appearance オブジェクトが適用されます。
 
Shape3D, Morph オブジェクトには AlternateAppearance オブジェクトの 影響を受けるかどうかを示すフラグがあり、 setAppearanceOverrideEnable(boolean enable) メソッドで変更します。 デフォルトは False なので、 AlternateAppearance を使う時は True に設定する必要があります。

その他の新機能

ImagePlate → pixel 座標の変換

ImagePlate 座標系上の座標から pixel 座標系上での座標へ変換する メソッドが Canvas3D クラスに追加されました。
 
getPixelLocationFromImagePlate(Point3d position,Point2d xy) メソッドでこの変換を行います。 逆の操作をする getPixelLocationInImagePlate(Point2d xy,Point3d position) メソッドも追加されました。

クリッピングノード

クリッピングするための ModelClip ノードが追加されました。
 
Fog ノードのように このノードを 1 つ作って SceneGraph にぶら下げれば、 有効となります。 6 枚の平面で囲まれた領域でクリッピング領域を表現しており、 各々の平面を個別で無効にもできます。 Immediate Mode でも ModelClip クラスが使えるように GraphicsContext3D クラスにメソッドが追加されています。

Canvas3D のプロパティー

Canvas3D からプロパティーを取得するメソッドができました。
 
queryProperties() メソッドでプロパティーを含む java.util.Map オブジェクトが得られます。 ダブルバッファリングや シーンアンチエイリアシング、 3Dテクスチャが可能かどうかなどが取得できます。
 
現在のところ表 1 のプロパティーが取得できます。
 
doubleBufferAvailable ダブルバッファが可能か
stereoAvailable ステレオが可能か
sceneAntialiasingAvailable シーンアンチエイリアシングが可能か
texture3DAvailable 3D テクスチャが可能か
textureColorTableSize 使えるテクスチャカラーテーブルの大きさ
compressedGeometry.* CompressedGeometry のバージョン番号
(表1 取得可能なプロパティー)

新しい PickShape クラス

PickShape クラスに新たに円錐形と円柱形のクラスが追加されました。
 
PickCone, PickConeRay, PickConeSegment, PickCylinder, PickCylinderRay, PickCylinderSegment の 6 クラスがあります。 これで点や直線をピッキングしやすいようにできます。

ImageComponent の RenderedImage への対応

ImageComponent クラスが扱える画像クラスが BufferedImage クラスから RenderedImage インターフェースへ拡張されました。
 
BufferedImage クラスは RenderedImage インターフェースを 実装していますので、 より広い形式の画像が扱えるようになりました。

GraphicsContext3D の flush

GraphicsContext3D オブジェクトを flush 出来るようになりました。
 
Immediate Mode において描画命令は一時バッファに蓄えられ、 実際にすぐに実行されるとは限りません。 そこで、flush することで強制的に即時実行させられます。

音響機能

MediaContainer クラスで InputStream も扱えるようになり、 それに伴い URL を扱っていたメソッドの名前が変更されました。
 
また、AuralAttributes クラスの反響設定で、 反響範囲と反響遅延の意味の違いを明確にするため メソッド名に変更が加わっています。

その他

vecmath パッケージの色クラスと java.awt.Color クラスの間の変換機能、 PathInterpolator の経路の設定メソッド、 新しいビューモデル属性、 vecmath パッケージの int 型のクラス が追加されています。 CloneTree も強化され、 Java3D システムスレッドのプライオリティーの変更や Immediate Mode のフロントバッファレンダリング、 ステレオの制御も可能となりました。 他には View クラスにレンダリング制御をするためのメソッドが追加され、 1 フレームの最小単位時間の設定やリペイントが出来るようにもなりました。

きれいになった API

Group ノードの意味あいの変更

Group ノードの子ノードの扱いに対する意味あいが変更されました。
 
まず、子ノードとして null が扱えるようになりました。 Switch ノードのインデックス指定がしやすくなり、 予約済みのインデックスを null で表現することができます。
 
また、インデックス例外があった時に ArrayIndexOutOfBoundsException 例外が投げられることがありましたが、 IndexOutOfBoundsException 例外が投げられるように修正されました。

nonfinal 化

javax.media.j3d パッケージの public で final でないクラスの 大部分のメソッドの final 属性がはずされました。 これはかなりの数に及びます。
 
これによりサブクラス化を使った柔軟なプログラムが出来るようになると思われます。 ただし、それらのメソッドをオーバーライドする時は オーバーライドしたメソッドの実装部分で 「super.メソッド名」で親クラスの そのメソッドを呼ばないと正常には動作しませんので注意が必要です。

様々な変更点

API を使いやすくするため、細かい変更が多数なされました。 その内容を以下に列挙します。
 
  • vecmath パッケージのクラス (4 次元のクラス) のコンストラクタが増やされて、使いやすくなりました。
  • setMonoscopicViewPolicy(int policy), getMonoscopicViewPolicy() メソッドがより適切な意味となるように View クラスから Canvas3D クラスに引越しました。
  • Bounds オブジェクトが Hashtable オブジェクトに格納出来るように equals(Object obj), hashCode() メソッドが実装されました。
  • Font3D ノードのテセレーションを指定出来るようになりました。
  • Alpha クラスはそれまで Object クラスのサブクラスでしたが、 より正しい意味となるように NodeComponent クラスのサブクラスに修正されました。
  • VirtualUniverse クラスに Locale ノードを削除するメソッドが追加され、 Locale ノードを SceneGraph から取り除くことが出来るようになりました。
  • set メソッドに対応する get メソッドがないクラス、 必要とされる情報を現在得る手段のないもの についての幾つかは get メソッドが追加されました。
  • デフォルトの物理画面サイズが変更されました。

おわりに

Java3D 1.2 で新たに導入された機能の使い方を解説してきましたが、 いかがでしたでしょうか。
 
特にオフスクリーンレンダリング、マルチプルレンダリングは 使い方次第ではさまざまな効果をもたらすことが出来る新機能です。 これらの機能の面白い使い方を探してみてはいかがでしょうか ?

戻る