プレビュー
このレッスンでは、Java3D010という名前のJava 3Dプログラムを紹介します。このプログラムは、以前のレッスン「Understanding transforms in Java 2D」(参考資料」を参照)に出てきたJava2D001という名前のJava 2Dプログラムによく似ています。
目的
このプログラムの目的は、次の4つの変換を順番に簡単に実行することです。
- 平行移動
- 回転
- 平行移動
- 拡大縮小
操作
プログラムが作成するユーザー入力GUIを使用すると、上記の一連の変換(図8を参照)で使用されるパラメータを変化させることができます。ユニバースには8個のColorCubeオブジェクトがあります。
その中の2つのColorCubeオブジェクトは、赤色の四角形、および赤色と青色の立方体として図8に示されています。残りの6個のColorCubeオブジェクトは、それぞれが3つから成る2組に分けられ、細長いColorCubeオブジェクトに調整されて、2組の可視3D軸をシミュレートします。
ColorCubeオブジェクトは、BranchGroup階層の異なるレベルでTransformGroupオブジェクトの子として挿入されます(図7を参照)。階層のレベルがそれぞれ異なるため、階層内の位置に応じて、異なるオブジェクトが異なる変換の対象になります。青色の面を見せている立方体と関連するその可視軸だけが、上のリスト内の4つのすべての変換の対象です。
[Replot]ボタンをクリックすると、入力パラメータの変更、変換の再計算、および新しい出力の生成を行うことができます。
入力フィールドの1つに、数値型に変換できないStringデータが含まれている状態で[Replot]ボタンをクリックすると、NumberFormatExceptionが発生してプログラムが異常終了します。たとえば、空白のフィールドがこの状態に該当します。
プログラムのテストは、Windows XPの環境でJava SE 6およびJava 3D 1.5.0を使用して行いました。
操作結果 1
平行移動、次に回転
このプログラムの主な目的の1つは、Java 3Dの変換を操作するツールを提供することです。いくつかの操作を通して、その目的に向かって進んでいきましょう。最初に、回転と平行移動の順番を変えるとどうなるかを確認します。まず平行移動、次に回転の順です。
図7から明らかなように、ユニバースには8個のColorCubeオブジェクトが含まれています。図9の左上のイメージは、右側のGUIの一番上の行にある入力パラメータ値で表される距離と方向で、7個のオブジェクトを平行移動した結果です。この時点で、これらのオブジェクトに回転は適用されていません。

影響を受けるオブジェクト
図7の階層で確認すると、この平行移動変換が、redCubeオブジェクト以外のすべてのオブジェクトに影響することがわかります。つまり、redCubeオブジェクトは原点を中心とした位置のまま変わりません。一方、他のすべてのオブジェクトは、右、上、 およびユーザーに向かって前方に平行移動されます。
回転変換の追加
図9の左下のイメージは、右上のGUIで指定される距離と方向で平行移動された7個のオブジェクトに対して、右下のGUIの2行目のパラメータで指定される角度と軸の回転が適用された結果です。
この回転が行われる前は、7個の各オブジェクトに属する軸は、ユニバースに属する対応する軸に平行でした。しかし、いったんこの回転変換が実行されると、オブジェクトに属する軸は、ユニバースに属する軸に並行でなくなり、大きな立方体から突き出ている短い突起に整列されます(これらの各突起自体が、細長いColorCubeオブジェクトです)。
青色の面からの突起は、大きな立方体に属するz軸の新しい正の方向を表します。紫色の面からの突起は、y軸の新しい正の方向を表します。他の2つの突起は、z軸の新しい正の方向と負の方向を表します。
図9のパラメータを使用する変換行列
図10は、図9の2つのGUIに示されているパラメータを使用する変換行列です。図10の左側の行列は図9の右上のGUIに対応し、図10の右側の行列は図9の右下のGUIに対応します。

個々の変換行列
図10に示した各行列は、個々の変換行列です。各グループの先頭の行列は、他の変換が実行されない場合に適用される既定の変換行列に相当します。グループ内の残りの4つの行列は、ユーザー入力GUIにリストされている変換の1つにそれぞれ対応します。
図10の変換行列の表示の順序は、図9のGUIにリストされている変換の順序を反転させたものです。グループの最後の行列が、GUIの先頭にある最初の変換に対応します。既定の行列のすぐ下にある行列は、GUIの下部にある最後の変換に対応します。
合成変換行列
7個のColorCubeオブジェクトに適用される実際の変換は、グループ内のいくつかの行列の積です。
図10の行列の中で、注目すべき値を太字で示してあります。図10の左側の行列を上から順に見ていくと、最後の行列を除くすべての行列が、先頭にある既定の行列と同じであることがわかります。既定の行列は、「恒等行列」です。2つ以上の恒等行列の積は、やはり恒等行列になります。
図10の左側にある行列グループの一番下の行列によってのみ、行列の積が恒等行列と異なるものになります。実際、最後の行列が恒等行列と異なる唯一の行列であるため、結果の行列は最後の行列と同じになります。
変換値
最後の行列内で太字で示されている3つの値が、変換値tx、ty、およびtz(図6を参照)です。この3つの値は、図9の右上のGUIにおける最初の平行移動の3つのパラメータに一致します。
回転変換の追加
図10の右側の行列グループには、恒等行列とは異なる2つの変換行列が含まれています。1つは、右下の変換行列です。これは、左下の変換行列と同じです。恒等行列とは異なるもう1つの行列は、右側の下から2番目の回転行列です。
この回転行列は、実際には、図6に示されているx、y、zの各軸を中心とする回転を表す、3つの個別の変換行列の積に相当します。もし実際にやってみるならば、目的の角度のサイン値とコサイン値を求め、その値を図6の行列方程式を使用して3つの変換行列に入力し、それらを乗算すると、図10の値が得られます。
