Javaでの3Dグラフィックプログラミング、パート1:Java 3D

真のJavaプラットフォームを構築するために、Sunは、Java1.0コアプラットフォームで利用可能な制限された機能を超えてAPIの図を記入する必要があることに早くから気づきました。Sunは、1.1および差し迫った1.2リリースでコアを大幅に成長させましたが、Javaパズルにはまだいくつかの部分が欠けています。

Sunとそのパートナーは、不足しているマルチメディアプログラミング部分を提供するためにJava Media and CommunicationAPIを開発しました。2Dと3Dグラフィックスの2つの最大の部分は、それぞれJava2Dと3DAPIの対象です。Java2DはJava1.2以降のコアプラットフォームAPIですが、Java3Dは1.2プラットフォームが利用可能になった直後に拡張APIとしてリリースされます。最近、Java2Dの一連の列を終了しました。ここで、Java3Dに注目します。

Java 3Dは、Java開発者が、ユーザーに3次元のインタラクティブなコンテンツを提供するアプレットやアプリケーションを作成できるようにすることを目的としています。Sunは、この分野で他の3Dグラフィックステクノロジーと激しい競争を繰り広げており、Java 3Dは、現在のグラフィックス標準であるOpenGLを打ち負かすために、困難な戦いを繰り広げています。

Java用の3DグラフィックスAPIに関する読者のコメントのリクエストは、Java3DおよびJavaOpenGLバインディングに深刻な関心を示していたため、今後数か月以内にこれらのテクノロジーに注力することにしました。

VRMLでは、より限定された関心が表明されました。したがって、VRML97コンテンツローダーとSunのJava 3DVRML97ブラウザーを使用したJava3Dでの使用方法を示すことにより、VRMLを扱います。Direct3Dはほとんど関心を持たなかったので、他のテクノロジーの1つがそれをサポートまたは相互運用できる場所に言及することを除いて、このパスを追求しないことにしました。

Java3Dの長所と短所

今月は、Java 3Dを探索することにより、Java用の3DグラフィックスAPIのツアーを開始します。まず、APIの主な長所と短所のいくつかについて説明します。3Dグラフィックスは、時にはかなり鈍感に見えることがあるため、説明が難しい場合があります。私の例や説明について長引く混乱がある場合は、質問やコメントを添えて私に書いてください。私はそれらに対処するために最善を尽くします。

Java 3Dのセールスポイント:

  • 3Dグラフィックスの高レベルのオブジェクト指向ビューを提供します。 Java 3Dは、シーングラフベースの3Dグラフィックモデルを使用してこれを部分的に実現します。 (この概念については、この記事の後半で詳しく説明します。)このアプローチは、グラフィックスやマルチメディアプログラミングの経験があまりないプログラマーがアプリケーションで3Dを使用できるようにすることを目的としています。 OpenGLのような低レベルの手続き型3DAPIとはまったく対照的に、Java 3Dは、可能な限り最高の速度を最適化し、プログラマーにレンダリングプロセスを最大限に制御できるように設計されています。これは、経験豊富なJavaプログラマーが学ぶ。

  • レンダリング操作への低レベルのアクセスが必要ない場合は、Java3Dがオプションになる場合があります。レンダリングアクセスは、Java 2Dのレンダリングヒントと形式および機能が類似している属性および機能ビットを介した要求に制限されます。(Java 2Dに関する以前のシリーズへのリンクについては、リソースを参照してください。これには、2Dのレンダリングヒントの説明と例が含まれています)。

  • Java 3Dは、可能な限り速度が最適化されています。実際、ランタイムはレンダリング機能ビットを使用して、シーングラフを最適化して可能な限り最速のレンダリングを実現します。このアプローチにより、Java 3Dは、オフラインの高品質グラフィックスアプリケーション(レンダーファームなど)よりもインタラクティブなグラフィックス環境(ゲーム、シミュレーション、低遅延の状況)に適用しやすくなります。

  • コンテンツをJava3Dランタイムにインポートするために、ますます多くの3Dローダーを使用できます。Sunは、Java 3DVRML97ファイルローダーとブラウザーをコードで自由に利用できるようにしました。来月のメディアプログラミングのコラムを探して、Java3Dローダーをさらに詳しく調べてください。

  • Java 3Dには、Javaプラットフォームの他の場所では利用できないベクトル計算機能が必要です。これらの数学演算は現在javax.vecmathパッケージに含まれており、将来的にコアプラットフォームに移動される可能性があります。

  • Java 3Dは、多くのエキゾチックなデバイス(ワンド、データグローブ、ヘッドセットなど)をサポートしています。com.sun.j3d.utils.trackersSunの実装に含まれているパッケージはFakespace、ロジクール、およびPolhemus社のデバイスのためのクラスを提供します。ただし、これらのデバイスは広く使用されていないため、詳細については説明しません。デバイスのサポートについて詳しく知りたい場合は、SunのJava3DサイトとJava3Dメーリングリストアーカイブ(どちらも以下のリソースに含まれているメインのSun Java 3D URLから入手できます)を参照してください。

Java 3Dには多くの長所がありますが、短所はどうですか?それらが含まれます:

  • Java3Dは標準の拡張APIです。Javaプラットフォームのライセンシーには、必要に応じてAPIを実装するオプションが与えられますが、実装する必要はありません。Java 3Dを標準の拡張機能として位置付けると、プラットフォーム間でのJava 3Dコードの移植性が低下するリスクがあります。ほとんどのベンダーは、コアプラットフォームへの変更や追加だけに追いつくのに苦労しなければなりません。

  • Java 3Dには、厳しい可用性の制約があります。これらは、拡張APIとしてのJava3Dのステータスの結果です。現在Java3D実装を提供している唯一の主要ベンダーは、SolarisおよびWin32用の実装を備えたSunです。Unix、Windows、および他の多くのオペレーティングシステムのすべてのフレーバーで利用可能なOpenGLと比較すると、Java3Dコードのクロスプラットフォームの移植性には疑問があります。

  • ソフトウェアの可用性の問題に加えて、ドキュメントの不足が発生します。 Sunは、Java 3Dの開発者トレーニングとサポートを提供するために勇敢な努力をしていますが、OpenGLとその使用法を文書化する業界の他の努力と比較するとまだ不十分です。 OpenGLコンソーシアムのWebサイトは、SunがこれまでにJava3D用にまとめたものよりもはるかに深く幅広いものです。これはマイナーなポイントではありません。3DグラフィックスAPIは比較的複雑であるため、適切なドキュメントが必要になります。

  • Java 3Dは、レンダリングパイプラインの詳細を開発者から隠します。 Java 3Dは高レベルのAPIであるため、レンダリングパイプラインの詳細を開発者から意図的に隠します。これにより、そのような詳細が重要な多数の問題には不適切になります。 (OpenGLの低レベルモデルとレンダリングパイプラインへのアクセスについては、この3Dシリーズの後半で説明します。)

  • Java3Dコンポーネントは重量があります。つまり、実際にレンダリングを行うネイティブ(Java以外の)ピアがあります。これにより、Java SwingとそのすべてのJavaまたは軽量コンポーネントを使用する場合、GUI開発が複雑になる可能性があります。いくつかの特別な回避策がありますが、一般に、軽量コンポーネントと重量コンポーネントは、同じコンテナオブジェクトとウィンドウ内でうまく混合されません。軽量-重量コンポーネントの問題の詳細については、この記事の最後にある「参考文献」を参照してください。

Java3Dのインストール

Java 3Dの主な機能と制約を理解したので、いくつかのサンプルコードを試す準備をしましょう。

Java 3Dは、Win32およびSolarisのベータ版で利用できます。 SunのJava3Dのより成熟した実装は、OpenGLの上に構築されています。アルファ品質のDirect3D実装もWin32で利用できます。すべてにJava1.2が必要であり、最新のJava3DベータはJava1.2ベータ4に対応しています。Sunは、現在1998年12月に予定されているJava1.2のリリース直後に最終的なJava3D実装をリリースすることを約束しました。

少し紛らわしいことはさておき、SunはJava 3D 1.0APIに対応するJava3D 1.0アルファ実装をリリースしましたが、1.0APIのアルファ以外のものをリリースすることはありませんでした。次に、SunはAPIを変更し、変更されたバージョンをJava 3D 1.1APIとしてリリースしました。このバージョンに続いて、1.1ベータ実装と呼ばれるものがリリースされました。これまでのところ2つです。 Sunは、Java1.2プラットフォームの最終リリースの直後に最終APIと実装をリリースすることを約束しました。うまくいけば、APIが安定し、復活することはありませんが、世界はまだ実装の真の最終リリースを待っています。

将来のコラムでJavaOpenGLバインディングについて説明するので、これらのインストール手順でもJava3DのOpenGLバージョンを節約して使用することにしました。これらのJava3Dサンプルで使用するOpenGLバージョンをインストールすると、後でJava-OpenGLサンプルを使用するために必要なレンダリングライブラリが得られます。

Java3Dを使用するために必要なソフトウェアコンポーネントは次のとおりです。

  • Sunから入手可能なJava3Dランタイム(無料のJava Developer Connectionログインが必要です)。プラットフォームには必ずOpenGLバージョンのJava3Dを選択してください(私はWin32を使用しています)。現在、OpenGL用の最新のWin32 Java3Dはjava3d11-beta2-win32-opengl.exeの1.1Beta 2であり、重量は約1.7MBです。

  • Windows NT4.0およびWindows95 OSR2にバンドルされているOpenGL1.1。ただし、Windows95のOSR1リリースを使用している場合は、OpenGLサポートをダウンロードできます。最新のWindows95-OpenGL 1.1実装は、Microsoftからopengl95.exeとして入手でき、約0.5MBです。

  • Java 1.2、Sunから入手可能。(私がこれを書いているときに、Sunは新しいJava 1.2-リリース候補1をリリースしたことに注意してください。例はできるだけ早く最新リリースに更新されます。)Java 3Dは1.2プラットフォームに結合され、Sunはjava3d-APIを分離し、以前のプラットフォームリリースで利用できるようにすることに関心がないという関心のあるメーリングリスト。

オプションで、Java3Dのドキュメントとサンプルコードをダウンロードすることもできます。どちらも、Java3Dランタイムと同じリンクから入手できます。

javaまたはappletviewer実行可能ファイルが拡張ライブラリを見つけるためにCLASSPATH環境変数を設定する必要がなくなったことに注意してください。Java 1.2で、Sunはついに標準の拡張ディレクトリを作成しました。このディレクトリは、JDKインストールディレクトリ内の/ jre / lib / ext /にあります。たとえば、私のシステムでは、Java 1.2 Beta4は次の場所にインストールされています。

C:\jdk1.2beta4\

標準の拡張ディレクトリは次の場所にあります。

C:\jdk1.2beta4\jre\lib\ext\

すべての拡張ライブラリは、インストール時にjarアーカイブをこの拡張ディレクトリに配置する必要があります。すべての標準JDKツールは、ここで必要なクラスファイルを検索することを認識しています。

SunのJava3Dの場合、これらのアーカイブには、パブリック(Java 3D API仕様に記載)クラスとプライベート(Sun実装固有)クラスの両方が含まれます。パブリッククラスのアーカイブは次のとおりです。

  • j3dcore.jar-パブリックJava3Dパッケージのクラスファイルが含まれていますjavax.media.j3d

  • vecmath.jar-のクラスが含まれていますjavax.vecmath

プライベートアーカイブには次のものが含まれます。

  • j3daudio.jarcom.sun.j3d.audio--Java 1.2でデビューした、ヘッドスペースベースのオーディオエンジンであるJavaSoundのJava部分のカスタムコピーの上に空間オーディオのサポートを構築するクラスをアーカイブします。

  • j3dutils.jar-さまざまなSunユーティリティクラスを合計16個のパッケージとその下のサブパッケージにカプセル化しますcom.sun.j3d。来月のJava3Dの議論の続きで、これらのパッケージをさらに深く掘り下げます。

  • j3dutilscontrib.jar--Sunの取り組みに他の人が貢献した有用なユーティリティをアーカイブします。上記com.sun.j3dcom.sun.j3d.utils.trackersコードを含め、階層の下には7つのパッケージがあります。繰り返しになりますが、来月のコラムでは、このjar内のパッケージに関する詳細情報を提供します。

理論的には、のような非標準パッケージで提供されるクラスのいずれかでメソッドをインスタンス化して呼び出すことができることに注意してください。ただしcom.sun注意:コードが実行されるプラットフォームでメソッドが使用できる保証はありません。現在の慣行では、Java 3DはSunからのみ入手可能であるため、実際、多くの開発者はSunのプライベートアーカイブ内のクラスを使用しています。そうすることを選択する際に伴う潜在的な移植性のトレードオフに注意する必要があります。

パブリックおよびプライベートのJava3Dクラスがシステムリソースとインターフェイスする方法にも魔法はありません。 Sunは、ディレクトリ内J3D.dllおよびディレクトリのj3daudio.dll下にネイティブライブラリをインストールします/jre/bin/。 Java 3Dクラスは、ネイティブメソッドを使用してこれらのDLLを呼び出し、Win32プラットフォームおよびOpenGLレンダリングライブラリとインターフェイスします。 (Solaris実装にも同様のライブラリがあります。)

インストールに関する最後の注意事項:OpenGLレンダリングパイプラインは、OpenGLアクセラレーションハードウェアを利用してグラフィックスアプリケーションを高速化するように設計されています。ただし、このコラムでは、特別なハードウェアを使用せずに例を試すことができるはずです。(実際、私はOpenGLアクセラレーションハードウェアを備えていないPentium 150 MHz MMXラップトップですべての例を開発しています。)アクセラレーションカードに興味がある場合は、OpenGLWebサイトまたはJava3Dメーリングリストを参照してください(詳細については、「参考文献」を参照してください。アクセラレーションハードウェアに関する来月のJava3Dコラムにももう少し情報を含める予定です。

シーンのビューブランチを構築する

先に述べたように、シーングラフグラフィックモデルの最大の強みの1つは、経験の浅いグラフィックプログラマーがアプリケーションに3Dを追加できることです。従来、3Dプログラマーは、個々の線やその他のグラフィックスプリミティブをどこにどのように描画するかを指定する必要がありました。ただし、プログラマーはシーングラフを使用して、レンダリングされるオブジェクトを表すノードとレンダリング命令(モニターに表示される視点の位置、プログラマーの3D世界の物理的ジオメトリなど)を含むツリーのような構造を作成するだけです。作成している、および物事間の相対的な距離)。