SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine(コードジン) DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Java 3Dの変換処理を理解する

Java 3D API解説

全般的な背景情報 3

Java 3Dの変換方程式

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

図6 5つの3D変換を表す行列演算
図6 5つの3D変換を表す行列演算

 図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階層を示しています。

図7 Java3D010プログラムのBranchGroup階層
図7 Java3D010プログラムのBranchGroup階層

次のページ
全般的な背景情報 4

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Richard Baldwin(Richard Baldwin)

大学教授(テキサス州オースティン、Austin Community College)、およびプライベートコンサルタント。Java、C#、およびXMLの組み合わせに特に注目している。JavaアプリケーションとC#アプリケーションの、プラットフォームや言語に依存しない多くの利点に加えて、Java、C#、およびXMLの組み合わせは、Web上で構造化情報を提供するうえでの主要な原動力になると信じている。これまで多くのコンサルティ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2145 2010/01/05 11:13

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー