全般的な背景情報 3
Java 3Dの変換方程式
記事「Spatial transformations」(稿末の「参考資料」を参照)では、明確に説明しているわけではありませんが、同じ執筆者によって、2Dの方程式を3Dの一連の方程式に拡張できるだけの十分な情報が与えられています。3Dバージョンの同次変換行列方程式を、図6に示します。

図6のz軸を中心とする回転を表す3D行列方程式が、図5の2D回転方程式によく似ていることは、注目に値するでしょう。2Dは、xy平面のみを含むように制約を受けた3Dの1つの形に過ぎない、とも考えられます。そのため、2Dの原点を中心とする回転が、3Dのz軸を中心とする回転に似ているのです。
合成演算
2Dに関する以前のレッスンで学習したように、同次の行列方程式を使用する利点の1つは、個々の変換を表す個々の行列をあらかじめ乗算して1つの合成行列を作成することにより、一連の変換を1つの行列乗算にまとめられることにあります。オブジェクトを表す各点で、一連の変換を個別に実行する必要はありません。合成変換行列をあらかじめ作成しておくことで、各点を表す列ベクトルと、すべての変換を表す合成行列を乗算して、各点を変換できます。計算に要するリソースの削減効果は計り知れません。
耳寄りな話
変換行列の作成と使用を要素レベルに至るまで完全に理解していれば、Java 3Dプログラムの作成は可能です。しかし、幸いなことに、ほとんどのJava 3Dプログラムは、行列についてあまり深く考えなくても作成することができます。これは、Java 3D APIが、行列演算の大部分をごく一般的なJavaプログラミングインターフェイスの背後で抽象化している、便利なメソッドを提供しているためです。しかし、便利なメソッドを使用する場合であっても、背後で実際には何が行われているかについて、多少なりとも認識しておくとよいでしょう。
Java 3Dプログラムの全体構造
Java 3Dシーンのプログラムの全体構造は、階層ツリーです。このツリーのルートはユニバースです。ルートから下に移動すると、次にLocaleクラスのオブジェクトがあります。Localeクラスについて、Sunは次のように述べています。
LocaleオブジェクトはVirtualUniverse内の高解像度の位置を定義するものであり、その位置で、BranchGroupをルートとするサブグラフ(ブランチグラフ)のコレクションのコンテナとしての役割を果たします...。
Localeオブジェクトは、その高解像度の座標を設定および取得するメソッドと、ブランチグラフを追加、削除、および列挙するメソッドを定義します。
したがって、Localeオブジェクトはツリー内のノードであり、1つ以上のBranchGroupクラスの子を持つことができます。
BranchGroupクラス
BranchGroupクラスについて、Sunは次のように述べています。
BranchGroupは、シーングラフブランチのルートへのポインタとしての役割を果たします。BranchGroupオブジェクトは、Localeのオブジェクトセットに挿入できる唯一のオブジェクトです。
したがって、BranchGroupもツリー内のノードであり、1つ以上のNode型の子を持つことができます。Nodeクラスは、Java 3Dバージョン1.5.0の時点では、次の2つのサブクラスを持つ抽象クラスです。
- Group
- Leaf
つまり、BranchGroupオブジェクトは、任意の数のGroup型またはLeaf型の子を持つことができます。
Leafクラス
Leafクラスについて、Sunは次のように述べています。
Leafノードは、子を持たないすべてのシーングラフノードの抽象クラスです。Leafノードは、ライト、ジオメトリ、およびサウンドを指定します。また、シーングラフを共有するための特別なリンクおよびインスタンス化の機能を指定します。仮想世界におけるビューの配置と方向を決めるビュープラットフォームも提供します。
このプログラムでは、ColorCubeオブジェクトという、Leafクラスのサブクラスを使用します。上記の説明から、ColorCubeオブジェクトをBranchGroupオブジェクトの子として追加できることがわかりますが、実際にその操作を行います。
Groupクラス
Groupクラスについて、Sunは次のように述べています。
Groupノードオブジェクトは、汎用的なグループ化ノードです。Groupノードは、1つの親と任意の数の子から成り、不特定の順序で(または並列に)レンダリングされます。子がNULLであってもかまいませんが、NULLの子ノードでは処理は実行されません。Groupノードオブジェクトに対する処理には、Groupノードの子の追加、削除、および列挙が含まれます。Groupノードのサブクラスによって、別のセマンティクスが追加されます。
Groupクラスのサブクラスは、次のとおりです。
- BranchGroup
- OrderedGroup
- Primitive
- SharedGroup
- Switch
- TransformGroup
- ViewSpecificGroup
これらのクラスの多くは、さらにいくつかのサブクラスを持ちます。したがって、非常に多くの種類のオブジェクトを、BranchGroupオブジェクトの子として追加することができます。しかし、このプログラムでは、BranchGroupオブジェクトの子として、LeafオブジェクトとTransformGroupオブジェクトのみを使用します。
TransformGroupクラス
TransformGroupクラスについて、Sunは次のように述べています。
変換を含むGroupノードです。TransformGroupノードは、すべての子の配置、方向付け、および拡大縮小を行うことができるTransform3Dオブジェクトを通じて、単一の空間変換を指定します。
指定される変換は、アフィン変換です...。
シーングラフ内の変換の効果は累積的です。LocaleからLeafノードへの直接パス内の各TransformGroupを連結したものが、合成モデル変換(CMT)を定義します...。
「変換を含む」とは
ドキュメントには、TransformGroupオブジェクトは「変換を含む」と記載されていますが、変換はオブジェクトの子ではないことに注意してください。変換は、Transform3D型のオブジェクトへの参照をパラメータとして、オブジェクトでsetTransformメソッドを呼び出すことによって確立されるオブジェクトのプロパティです。したがって、TransformGroupオブジェクトに関連する変換は1つだけですが、オブジェクトはNode型の子をいくつも持つことができます。
「効果は累積的」とは
効果が累積的であるということは、TransformGroupオブジェクトに含まれる変換の効果が、階層内のTransformGroupオブジェクトの子、孫、ひ孫など、すべてのオブジェクトに適用されることを意味します。
BranchGroup階層
図7は、このレッスンで紹介するプログラムのBranchGroup階層を示しています。

