Java3D FAQ

Japanese Frequently Asked Questions about Java3D
(C) 1999 Java3Djp ML 
Version: 000.006 (draft)
Last Update: 2000.12.25
Author of draft version: Yukio Andoh (andoh@opengl.com)


[Q] Java 3D とは何ですか?

  1998 年に Sun (JavaSoft) が開発した、
  Java の標準的な3次元グラフィック API です。
  Java 3D API クラスは Java で三次元グラフィックスアプリケーションや
  Java アプレットを開発するための Java の拡張クラスです。
  Java 3D API は Java でマルチメディアを扱う為の API である
  Java Media API の一部です。
  "Write once, VIEW anywhere" というスローガンの通り、
  Java 2 をサポートするどの環境でも、再コンパイルすることなく
  三次元グラフィックを実行できることを目標にしています。
  Java 2 (JDK 1.2) と同様に、開発ライセンス、ランタイムライセンスはフリーです。

-------------------------------------------------------------------------------
[Q] Java 3D のホームページはどこですか? 

  http://www.sun.com/desktop/java3d/
  またベータ版などの Early Access は JDC( Java Developer Connection ) で
  公開される
  http://developer.javasoft.com/developer/earlyAccess/java3d.html
 
-------------------------------------------------------------------------------
[Q] Java 3D はどこから手に入れることができますか?

  以下の URL から Windows95/98/NT 版、Solaris(SPARC) 版が無償で入手できます。
  また Sun が配布している Graphics@Sun CD-ROM (非売品) にも入っています。
  SGI から IRIX 版がリリースされています。
  Blackdown から Linux 版がリリースされています。

  http://java.sun.com/products/java-media/3D/
  http://www.sgi.com/developers/devtools/languages/java3d111.html 
  http://nitric.com/pub/java-linux/java3d/1.1.1/i386/
 
-------------------------------------------------------------------------------
[Q] Java 3D に関して話し合われているメーリングリストはありますか?

  本家 JavaSoft のメーリングリスト(英語) と
  ボランティアで運営されている日本語のメーリングリストがあります 

  java3d-interest ML (英語)への入会方法
  http://java.sun.com/products/java-media/3D/forDevelopers/interest_group.html

  Java3Djp ML (日本語)への入会方法
  http://cgi14.plala.or.jp/antun/java3d/ml/

-------------------------------------------------------------------------------
[Q] メーリングリストの討論の内容は保存されていますか?

  以下の URL でアーカイブを読むことができます。

  java3d-interest ML

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

  Java3Djp ML
  http://ar1.easyml.com/MLarchive/user/3384/html/threads.php3 
  http://ar1.easyml.com/MLarchive/user/3384/html/search.php3


-------------------------------------------------------------------------------
[Q] JavaOne 1997 と JavaOne 1998 での Java 3D セッションの
    スライド資料はどこで見ることができますか?

  以下の URL で見ることができます
  JavaOne'98
  http://java.sun.com/javaone/javaone98/sessions/T600/
  JavaOne'97
  http://java.sun.com/javaone/sessions/slides/TT15/index.html

-------------------------------------------------------------------------------
[Q] JavaOne での Java 3D のチュートリアルを見逃してしまいました。 
    web上に資料がありますか?

  OpenGL の大御所である Mason Woo 氏の行ったプレゼンテーションや
  SIGGRAPH で行われたコースノートが
  資料が以下の URL で公開されています。
  http://www.sun.com/desktop/java3d/collateral/index.html

  Mason Woo 氏は日本で行われた OpenGL_Japan セミナーで
  Java3D のプレゼンテーションを行いましたが、
  残念ながらこの資料は web では公開されていません。
  http://www.woo.com/

-------------------------------------------------------------------------------
[Q] Java プログラミングに関しての質問があります。
    そのための FAQ はありますか?

  Java Programmer's FAQ が頻繁に更新されています。
  http://www.afu.com/javafaq.html (英語)
  また日本語翻訳版もありますが、最近は更新されていません。
  http://www.sun.co.jp/java/faq/Java-Programmers-FAQ.html

  他にも Java-House ML のトピックスやアーカイブが役立ちます
  http://java-house.etl.go.jp/ml/

-------------------------------------------------------------------------------
[Q] Java 3D についてのより多くの資料はどこで読むことができますか?

  仕様書や API Documentation などは以下の URL で読むまたは
  ダウンロード可能です
  http://java.sun.com/products/java-media/3D/

  又日本語での Java 3D ページとして以下のページが役立ちます
  Java3DTips
  http://cgi14.plala.or.jp/antun/java3d/index.shtml
  ABA Games Java 3D
  http://www.asahi-net.or.jp/~cs8k-cyu/java3d/index.html
  楽しい Java 3D
  http://www.javaopen.org/j3dbook/text/index.html

  各 Java3D 関連 URL については Java 3D repository が役立ちます
  http://java3d.sdsc.edu/

-------------------------------------------------------------------------------
[Q] Java 3D のクラス階層構造図は、どこにありますか?

  以下の URL に階層構造図があります
  http://www.sun.com/desktop/java3d/collateral/j3dclass.html

-------------------------------------------------------------------------------
[Q] ブラウザ上で Java3D は動くのか?

    動きます。
    以下の手順をふむことによって Netscape + Java-Plugin 環境
    および IE + Java-Plugin 環境で Java3D アプレットを動かすことができます。

    - JDK1.2 もしくは JRE1.2 をインストールします
    - Java Plug-in をインストールします。
    - Java Plug-in html converter をインストールします 
    - Java Plug-in の設定で JDK1.2 もしくは JRE1.2 で動くよう設定します 
    - Java3D 1.1 をインストールします
    - Java3D 関連Jarファイルを CLASSPATH に追加設定します 
      ( j3dcore.jar, j3dutils.jar, j3daudio.jar, vecmath.jar )
    - アプレットの為の HTML ファイルを html converter で変換します

-------------------------------------------------------------------------------
[Q] サンプルをコンパイルしようとすると「クラスが見つかりません」と、
    コンパイルができません。何が間違っているのですか?

    JDK1.2 + Java3D 1.1 が正常にインストールされている環境では
    環境変数 CLASSPATH の設定は必用ありません。

    Win32環境の場合は、Java3D 関連の jar ファイルが正常にインストール
    されているか、以下のディレクトリをチェックしてみてください。
      (1) \jdk1.2\lib
      (2) \jdk1.2\jre\1.2\lib   (JREをインストール済みの場合)
      (3) C:\Program Files\JavaSoft\jre\1.2\lib

       必用な jar ファイル 
		j3dcore.jar
		j3dutils.jar
		j3daudio.jar
		vecmath.jar

    CLASSPATH の設定を確認するとともに詳しくは以下の URL を
    参照してみてください。

    CLASSPATHはこう設定せよ
    http://java-house.etl.go.jp/ml/archive/j-h-b/023336.html#body
    CLASSPATHをちゃんと理解する
    http://java-house.etl.go.jp/ml/archive/j-h-b/021880.html#body

-------------------------------------------------------------------------------
[Q] サンプルを実行した時、なぜ全て白黒で表示されるのですか?
  
    JDK1.2 beta3 以前ではディスプレイが 8bit モードになっていると
    そのような現象が置きました。JDK1.2 beta4 以降ではそのような
    現象はありません。最新版の JDK1.2 をお使いください。

-------------------------------------------------------------------------------
[Q] サンプルを実行すると exceptions(例外) が発生します。
    何が起こっているのですか?

    動作環境に起因するもの

    Java.lang.NoClassDefFoundError: java/awt/color/ColorSpace
    JDK1.1 環境で無理に動かそうとしています
    JDK1.2 をインストールしてください。

    FATAL ERROR in native method: Wrong field ID passes to JNI
    JDK もしくは Java3D のバージョンが古いのが原因です。
    最新版の JDK1.2 と Java3D1.1 をインストールしてください

    java.lang.ExceptionInInitializerError
    環境変数 CLASSPATH にカレントディレクトリ "." が含まれていません

    ClassNotFoundException
    NT 4.0 で PATH= の先頭に WINNT\SYSTEM があるとき、
    JDK 1.2 のインストーラーがここに java.exe と javaw.exe をインストールします。
    この配下に lib\exi\j3d*.jar が無いため Exceptions が発生することがあります。

    またプログラミングミスに起因するものに関しては
    以下の URL が参考になります
    http://www.ipc-tokai.or.jp/~atusi/java3d/class/exception.html

-------------------------------------------------------------------------------
[Q] SimpleSounds のサンプルを実行させると、どうなりますか? 
    空白のウィンドウが現れるだけなのですが?

    Java3D には三次元サウンドに関する実装も行われています。
    それら三次元サウンドのみを扱う場合には、特に描画が行われる
    わけではありません。

-------------------------------------------------------------------------------
[Q] スプライン、NURBS に対応しているのか?

    対応していません。

-------------------------------------------------------------------------------
[Q] マルチスレッドの分担内容は?

    シーングラフのトラバース作業
    カリングの計算
    描画

    といった負荷が分散されているとうたわれていますが、
    詳細は定かではありません。

    描画に関して、OpenGL版ではトラバース作業と並行してレンダリング
    オブジェクトのレンダリングキュー登録が行われています。
    仕様外(実装次第)であり非公開な部分ですが
    レンダリングキューへの追加は
    javax.media.j3d.Traverseからjavax.media.j3d.RenderQueueを利用して
    処理されています。

-------------------------------------------------------------------------------
[Q] ネットワークを介したオブジェクトの転送はどうやるのか?
    
    rmi を使います。
    また HORB などの ORB も活用できるでしょう。
    ただ、現実的にそのようなことが行われた事例は知りません

-------------------------------------------------------------------------------
[Q] リモートレンダリングはできるのか?

    できません。
    Solaris 環境や、Exceed3D などのような Windows + X-Server with OpenGL 
    環境で他のマシンで実行されている Java3D を手元のマシンで表示する
    ことは可能です。(GLX拡張された X-Window System であることが必用)

    ただしこれは OpenGL で言うところの GLR のように
    手元のマシンで実行した Java3D アプリケーションの負荷分散の為
    リモートのレンダリングサーバがレンダリングを行い結果を手元のマシンに
    返してきたり、数台のレンダリングサーバで負荷分散したりといった
    厳密な意味でのリモートレンダリンには該当しません。
    また現在のところ Java3D は リモートレンダリング を実装する予定はありません。

-------------------------------------------------------------------------------
[Q] サポートされていないカリングがあるのか?

    現在のところ オクルージョンカリング は実装されていません。
    仕様には含まれています。

    オクルージョンカリングとは、
    バウンディング・ボリュームが他のオブジェクトによって完全に遮蔽さ
    れている (見えない位置にある) 場合、描画の為の計算を行わず、
    処理を高速化する手法です。

-------------------------------------------------------------------------------
[Q] VR 用 API としてのアドバンテージは?

    他の一般の Graphics API に比べて後発であることから、
    多くの Graphics API のいいところを取り入て洗練されたものであること。
    他の Graphics API がカメラ的な ViewModel を持つのに比べ、
    Java 3D は三次元空間での自由度が高い、魔法の絨毯に乗った人の視点的な
    ViewModel を持つので、各種 VR 入力デバイス・出力デバイスとの相性がいい。
    他の比較的高価な VR 専用 ToolKit に比べると、Java3D は基本開発環境、
    ランタイムとも無償であること。
    
-------------------------------------------------------------------------------
[Q] VR 用 API としてのアドバンテージは? −機能的に十分なのか?

    即答できず、ちょっと調べないと......

-------------------------------------------------------------------------------
[Q] VR 用 API としてのアドバンテージは? −コリジョンディテクションがあること?

    即答できず、ちょっと調べないと......

-------------------------------------------------------------------------------
[Q] Java 3D と VRML の関係は?

    Java 3D は三次元グラフィックスの為のプログラミング API であるのに対して、
    VRML は三次元空間を表現する為のファイルフォーマットである。
    独自のファイルフォーマットを持たない Java3D は
    外部ファイルフォーマットとして
    ローダー次第で各種フォーマットを扱うことができる
    その中でも VRML(VRML97) は表現できる機能が Java3D に似通ったもののため
    Java3D と親和性のあるフォーマットとして使われることが多い。
    また Java3D の仕様策定の段階で VRML との親和性を考え各種機能が
    盛り込まれたことも親和性の要因となっている。

-------------------------------------------------------------------------------
[Q] OpenGL Java binding と Java 3D はどう違うのでしょう?
    どういうときにどちらを選べばいいのでしょう?

    OpenGL Java binding は OpenGL の各関数を wrapper でくるんで、
    Java から利用できるようにしたものです。
    OpenGL はハードウェアに密着した低レベル API であるのに比べ、
    Java3D はシーングラフベースの高レベル API であるのが大きな違いです。

    よりハードウェアに密着した高速のグラフィックスを求める場合には
    OpenGL Java binding を用い、シーングラフベースでモデルデータを 
    扱いたい場合や、カリング等の機能をわざわざ自分で実装するのではなく、
    API にまかせてしまいたい場合は Java3D を使うのが良いでしょう。

    また Java3D は Windows と Solaris, Linux, IRIX 環境でしか動かないのに比べ、
    OpenGL Java binding は各種環境下で動き、ソースが公開されているものも
    あるのが選択の条件になる場合もあります。

    OpenGL Java binding については現在 OpenGL の標準化団体 ARB によって
    策定の最中です。

    非公式の OpenGL Java binding としては主に以下のものがあります。 
    Magician http://www.arcana.co.uk/products/magician
    GL4Java http://www.jausoft.com/gl4java.html
    JSparrow http://www.will.or.jp/~jsparrow/
    一覧は以下の URL にあります
    http://www.opengl.org/Documentation/Implementations/Languages.html

    また Java3D と同じく シーングラフベースで、各種カリング機能を持った
    OpenGL Optimizer の Java binding もあります。
    Sorceress 
    http://www.arcana.co.uk/products/sorceress/

-------------------------------------------------------------------------------
[Q] Java 3D と OpenGL の関係は?

    Java 3D は下位層の Graphics API として OpenGL と Direct3D(Windows) を
    Native で使い実装されています。
    OpenGL はハードウェアに密着した低レベル API であり
    Java3D はシーングラフベースの高レベル API です。お互いに競合するものでは
    ありません。

-------------------------------------------------------------------------------
[Q] VRML のノード対、Java3D ノードとの対応は?

    VRML のノードと Java3Dのノードは
    1対1 に対応しているわけではありませんが、機能的には良く似通っています。
    VRML Loader や VRML Saver を調べることによって
    VRML のどのノードが Java3D のどのノードに対応するのか調べることが
    できるでしょう。

    CyberVRML97 が参考になります
    http://www.cyber.koganei.tokyo.jp/vrml/cv97/cv97java/index.html

-------------------------------------------------------------------------------
[Q] Java 3D は、例えば、どのようなことに使えるのでしょうか?
[Q] Java 3D の用途の例は?

    各企業がどのように Java3D を利用しているかといった例が
    以下の URL で紹介されています。
    http://www.sun.com/desktop/java3d/in_action/index.html
    
    また各種 Java3D のデモをご覧になることによって
    Java 3D の用途がイメージできることでしょう。
    http://www.sun.com/desktop/java3d/demos/index.html

-------------------------------------------------------------------------------
[Q] ドライバのリクルートはするのか?
    プロモーションはするのか?

    サンがどこか特定の企業の VR 入力デバイスや、出力デバイスをサポートするという
    予定はありません。必用な仕様は公開されているので、
    各社が Java3D に対応したものをリリースするのは自由です。
    
-------------------------------------------------------------------------------
[Q] View と Device との関係は?

     ??? 意味不明

-------------------------------------------------------------------------------
[Q] リフレッシュレートとの対応をとるには?

    イミディエイトモードを使いプログラマが描画のタイミングを取り、
    バックバッファをスワップさせて対応を取ってください。
    ただ Java3D は SGI の IRIS Performer のようなフレームレートを
    厳密にコントーロールできるよう設計されたものではありません。
    Java の場合 GC が走るタイミングによって、描画のタイミングも  
    厳密にコントロールできない場合があります。
    秒60フレームの描画が求めるような場合は IRIS Performer 等の
    リアルタイムレンダリングを目的とした Graphics API を 
    使うのが良いでしょう。

-------------------------------------------------------------------------------
[Q] マウスの動き -> View の動きとの対応を簡単に取るには?
 
[Java3Djp:00211] http://www.trilogy.co.jp/~tomoyuki/java3djp_ml/archive/0226.html
[Java3Djp:00216] http://www.trilogy.co.jp/~tomoyuki/java3djp_ml/archive/0231.html
[Java3Djp:00222] http://www.trilogy.co.jp/~tomoyuki/java3djp_ml/archive/0237.html
[Java3Djp:00227] http://www.trilogy.co.jp/~tomoyuki/java3djp_ml/archive/0242.html

-------------------------------------------------------------------------------
[Q] 三次元グラフィックスで Java を使うのは遅くはないのですか?
   
    Java3D は 全部が Java で描かれているわけではなく、描画部分は
    OpenGL や Direct3D を Native でコールしています。
    描画部分に関しては Java とは関係なく、ハードウェアの性能を生かした描画を
    行います。
    Java3D は高レベル API ですので OpenGL で直接描かれたプログラムよりは
    遅いことは否めませんが、比較的現実的な速度で動作します。
    また Alpha Version, Beta Version から比べて正式版の Java3D 1.1 は、
    だいぶ速い印象を受けます。

-------------------------------------------------------------------------------
[Q] シーン・グラフとはなんですか?

    三次元空間内のオブジェクトの形状データやそれらの属性、振る舞いなどを
    メモリ上に展開したデータベースのことをシーングラフといいます。
    このデータベースは三次元画像を描画するための構成要素を
    ツリー構造で表現したものです。

    三次元画像を描くとなると、画面に球を描いて、立方体を描いて.... と
    順次描画していくことを思い浮かべるかもしれません。
    しかしシーングラフベースの Graphic API の場合、シーングラフ内のデータを
    更新することによって、画面に描かれている画像が自動的に更新されます。

    Java3D ではシーングラフのデータをチューニングして保持する
    「コンパイル済みリテインモード」と、通常の「リテインモード」
    でシーングラフをハンドリングしています。
    
-------------------------------------------------------------------------------
[Q] 書籍『Java 3D API 仕様』の最初の方に書いてある
    UniverseBiulder というクラスが見つかりません。
    この本の通り入力してコンパイルするとコンパイルエラーになります。
    なぜでしょうか?

     スペルが間違ってます :-)

     UniverseBuilder は Alpha01 以前の ユーティリティパッケージに含まれていた
     らしいのですが、Alpha02 で廃止になりました。
     UniverseBuilderは 新たに追加されたSimpleUniverseへ移行することになりました。

     第1章の後半に UniverseBuilderを簡略化もののソースが書かれています。
     また、以下の URL に Object から extend された
     UniverseBuilder のソースがあります
     http://www.sun.com/desktop/java3d/collateral/j3d_api/j3d_api_5.html

-------------------------------------------------------------------------------
[Q] Java3D 1.1 には com.sun.j3d パッケージの
    ソースコードが添付されているようですが、
    どこにあるのでしょうか?

    Java3D をデフォルトでインストールすると以下の場所にインストールされます

    C:\jdk1.2\java3d-utils-src.jar

-------------------------------------------------------------------------------
[Q] Java 3D もオープンソースになるのですか?

    現在はオープンソースではありません。
    いまのところサン独自のライセンス形態にものづいて
    Java 2 はソースコードが公開されています。
    http://www.sun.com/software/communitysource/java2/
    しかし Java3D はその中には含まれません。
    Java3D が core API ではなく extention であることが理由です。
    将来的には Java3D もオープンソースとする考えはあることが
    Java3D 開発メンバーから知らされています。

-------------------------------------------------------------------------------
[Q] Java3D 関連書籍

    英語版

  ■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/

  ■Graphics programming for Java
    ???

    日本語版
 
  ■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

-------------------------------------------------------------------------------
[Q] どのプラットホームが Java 3D をサポートしますか?

  IRIX, Linux, Solaris と Windows 環境でサポートします。
  現時点 (1999年10月現在) では、
  Solaris (SPARC)、
  Win32 (Windows 95/98, Intel CPU の NT 4.0)
  Linux(i386)
  IRIX 6.X
  です。

  http://java.sun.com/products/java-media/3D/
  http://www.sgi.com/developers/devtools/languages/java3d111.html
  http://nitric.com/pub/java-linux/java3d/1.1.1/i386/

  SIGGRAPH'99 では HP-UX 版も展示されていました。

  非公式なものとして JFree-D があります。
  http://www.linuxstart.com/~jfreed/

-------------------------------------------------------------------------------
[Q] Java 3D を JDK1.1.X ベースで動かす方法はありますか?

  ありません。
  Java 3D 1.1 正式版からは Java 2 (JDK 1.2) で動作します。

  JDK 1.1 ベースで 3DCG プログラミングをする手段としては、
  OpenGL-Java binding があります。
  また、シーン・グラフベースのものとしては、
  OpenGL Optimizer Java binding、OpenInventor-Java があります。

  JFreeD は JDK1.1 ベースで動作します。
  http://spia.freenix.fr/jfd/

-------------------------------------------------------------------------------
[Q] VRMLローダーの入手方法は?

   下記の URL から VRML Loader/Player をダウンロード出来ます。
   ソースコードも公開されています。
   http://www.vrml.org/WorkingGroups/vrml-java3d/

   これは以前 Sun が開発していたものを、Sun が VRML Consortium に
   加盟したことを受けて、vrml-java3d working group が引き継いだ正式なものです。

-------------------------------------------------------------------------------
[Q] HelloUniverseの立方体を別のプリミティブに代えるには?

    objTrans.addChild(new ColorCube(0.4));

    この new ColorCube(0.4) を、別のプリミティブに変更してください。
    (例えば new com.sun.j3d.utils.geometry.Sphare() など) 

-------------------------------------------------------------------------------
[Q] 光源を設定したのに照明されないのですが?

    物体に法線ベクトルが設定してあっても、
    光源に照明の作用範囲が指定されていないと照明されません。

    作用範囲オブジェクトである javax.media.j3d.Bounds
     (実際にはそのサブクラス)を生成し、
    javax.media.j3d.Light#setInfluencingBouns() メソッドで
    作用範囲を指定してください。

-------------------------------------------------------------------------------
[Q] マウス処理のBehaviorをBranchGraphにaddChild()したのに
    マウス操作ができません。なぜでしょう?

   javax.j3d.Behavior (及びそのサブクラス) は作用範囲の設定が無いと動作しません。
   作用範囲オブジェクト  javax.media.j3d.Bounds (実際にはそのサブクラス)
   を生成し、setSchedulingBounds() メソッドで作用範囲を指定してください。

-------------------------------------------------------------------------------
[Q] シーングラフに動的にNodeを付け加えると
    javax.media.j3d.RestrictedAccessExceptionが発生します。どうしてでしょう?

    BranchGroup ではなく、TransformGroup に動的に Node を addChild() する場合、
    いったん Node を removeChild() してから addChild() してください。
    また、compiled モードの場合は動的に追加/削除できないので、
    retained モードで行ってください。

-------------------------------------------------------------------------------
[Q] addMouseListener()してもマウスイベントが通知されません。
    どうすれば解決するでしょうか?

    java.applet.Applet を extend している場合、
    コンテナである Applet のサブクラスに addMouseListener() しても
    マウスイベントは通知されません。
    Canvas3D に addMouseListener() してください。
    KeyEvent も同様です。

    - Behaviorを使う
    - 従来のJavaのイベント処理を使う(Delegetion-Listenerイベントモデルなど)

    最初のサンプルはJava 3Dのデモ・ソースに含まれています。
    (\jdk1.2.1\demo\java3d\SpinAnim, \jdk1.2.1\demo\java3d\Text2D など)

-------------------------------------------------------------------------------
[Q] スケーリングとはどのようなことをするのですか?

    「スケール」= 「縮尺(縮小率・拡大率)」と考えれば解りやすいでしょう。
     1.0 の時は実物大。0.5 の時は半分の大きさ、2.0 の時は倍の大きさです。

     スケーリングは TransformGroup に対して適用しますが、
     回転や移動を適用したい TransformGroup とは別にした方が良いでしょう。
     
       (T) 回転や移動を適用したい TransformGroup
         |
       (T) スケーリングを適用したい TransformGroup
         |
       (S) Shape3D など

-------------------------------------------------------------------------------
[Q] Canvas3Dのpaint()メソッドのオーバーライド方法は?

    (Canvas3D のバックバッファの取得方法がわからないので保留...)

    [Java3Djp:00215]
    [Java3Djp:00221]

-------------------------------------------------------------------------------
[Q] TransformGroupから任意のNodeを remove したいのですが?

    Groupから継承するクラスなどの中で、
    以下のようなメソッドを定義して利用してみてください。

    public boolean remove(Node node) {
        for (int n=0; n < numChildren(); n++) {
            if (getChild(n) == node) {
                removeChild(n);
                return true;
            }
        }
        return false;
    }
-------------------------------------------------------------------------------
[Q] Behaviorを継承したクラスを書いたがイベントが1回しか通知されません。
    どうしたら正常にイベントが発生するでしょうか?

    proccessStimulus() の最後で wakeupOn() を呼んでください。

-------------------------------------------------------------------------------
[Q] Quat4fをset後値が変なのですが?

    これはバグのようです。

    回避方法は以下を参照
    [Java3Djp:00212]
    [Java3Djp:00213]
    [Java3Djp:00220]

-------------------------------------------------------------------------------
[Q] 法線を計算したいのですが

     com.sun.j3d.utils.geometry.NormalGenerator というクラスがあります。
     まず com.sun.j3d.utils.geometry.GeometryInfo に
     頂点座標の Point3d などの配列、頂点インデックスの int 配列をセットしておき、
     NormalGenerator の public void generateNormals(GeometryInfo geom) で
     法線を計算できます。

     例:
       GeometryInfo ginfo =
         new GeometryInfo(GeometryInfo.TRIANGLE_ARRAY);
       ginfo.setCoordinates(verts);         // verts は Point3d の配列(頂点データ)
       ginfo.setCoordinateIndices(indices); // indices は int の配列 (頂点index)
       NormalGenerator ngen = new NormalGenerator();
       ngen.generateNormals(ginfo); 
       Shape3D shape =
         new Shape3D(ginfo.getIndexedGeometryArray());

-------------------------------------------------------------------------------
[Q] SimpleUniverseで表示できる範囲は?

    原点 (x=0.0、y=0.0、z=0.0) を中心とした ±1.0 の範囲のようです。
    また、ニアークリップ面 (視点にもっとも近いクリップ面) は 0.1、
    ファークリップ面 (視点からもっとも遠いクリップ面) は 10.0 です。
    これより近くても遠くても、物体は描画されません。

-------------------------------------------------------------------------------
[Q] pickingをするには?

    com.sun.j3d.behaviors.picking.PickObject クラスを使用します。
    詳しくは下記を参考にしてください。

    [Java3Djp:00139]
    [Java3Djp:00147]
    [Java3Djp:00155]
    [Java3Djp:00211]
    [Java3Djp:00218]

    pick されたオブジェクトを特定するには、
    javax.media.j3d.SceneGraphObject#setUserData()/getUserData() メソッドで
    独自のデータを付加/取得すると良いでしょう。

-------------------------------------------------------------------------------
[Q] com.sun.j3d.utils.behavior.mouse パッケージと
    com.sun.j3d.utils.behavior.pickingパッケージはどう違うのでしょうか?

    com.sun.j3d.utils.behavior.mouse パッケージの Behavior は、
    適用対象の TransformGroup をはじめに設定しておきますが、
    com.sun.j3d.utils.behavior.pickingパッケージの Behavior は
    マウスプレス時のマウス座標にいちばん近い TransformGroup を pick し、

-------------------------------------------------------------------------------
[Q] Java3D のシーングラフを VRML ファイルに書き出すクラスはありますか?

    CyberVRML97 があります。ソースコードも公開されています。
    
    http://www.cyber.koganei.tokyo.jp/vrml/cv97/cv97java/index.html 

-------------------------------------------------------------------------------
[Q] Java3Dでマウスを使って線を引く方法は?

    [Java3Djp:00152]

-------------------------------------------------------------------------------
[Q] SwingでJava3Dは使えますか?

    Java3D の Canvas3D は Light-weight コンポーネントではないため、
    描画がおかしくなる場合があります。
    現時点では AWT を使うのが無難です。
    Sun (JavaSoft) は Java3D と Swing をうまく共存させるよう努力中のようです。
    考えられる方法としては、
    (1) Java3D の改良。オフスクリーン・レンダリングなどを使い、
         Light-weight コンポーネントの中でも Java3D が描画出来るようにする。
    (2) Swing の改良。Swing の中で Java3D のような Heavy-weight コンポーネントを
        うまく描画出来るようにする。
    の2通りの方法を考えているようです。(1)は描画のパフォーマンスが悪いかも知れません。

-------------------------------------------------------------------------------
[Q] Java3Dを使って、CADのデータ(DXF)を表示することは可能でしょうか?

    可能です。
    Java3D 用の DXF file loader が利用できます。

    Portfolio
    http://havefun.ncsa.uiuc.edu/Java3D/portfolio/
    RightSpace
    http://www.geocities.com/SiliconValley/Horizon/6481/RightSpace.html

    又、Java3D でなくても 幾つか Java ベースの DXF viewer 等があります。

    http://do.ymn.or.jp/yasu/java/DxfView/
    http://pweb.cc.sophia.ac.jp/~s-okabe/java/Java5.htm
    http://do.ymn.or.jp/ex/Niigata/index.html



-------------------------------------------------------------------------------
[Q] Java3D のチュートリアルはありますか?

    http://www.sun.com/desktop/java3d/collateral/j3d_tutorial.pdf
    http://www.sun.com/desktop/java3d/collateral/j3d_tutorial_examples.jar


-------------------------------------------------------------------------------
[Q] 凸型

多角形は基本的に凸型 (すべての頂点の成す角度が180度より小) 

-------------------------------------------------------------------------------
[Q]

Java 3D APIにはどのような機能がありますか?
また、レンダリングエンジンはSunから提供されないのでしょうか?

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------


FAQ に追加したい情報、ご意見、ご質問、ご感想等、 メッセージをいただけるとありがたいです。

andoh@opengl.com

Keeper of the Java3D Repository in Japan
© transcopyright 1999 Yukio Andoh


andoh@opengl.com


本文書の作成には万全を期しますが、明示、暗黙を問わずこの文書の内容 に関してはいかなる保証も適用しません。内容に誤りがあり、またこの文書 によって、不利益を被っても、作者は一切関知いたしません。 この文書は、非営利目的で使う限り、また出処を明示している限り、 自由に転載することを許可します。リンクも自由にしてください。 この文書中の登録商標は、一般にその所有者のものです。

Sun、Sun Microsystems、Java、HotJava は、米国またはその他の国における 米国Sun Microsystems, Inc. の商標または登録商標です。サンのロゴマーク、 Solaris は、米国Sun Microsystems, Inc. の登録商標です。