全般的な背景情報 1
このレッスンで扱う変換の種類
このレッスンでは、次の種類の変換を扱います。
- 拡大縮小
- 平行移動
- 回転
必要な背景知識
2Dまたは3Dでの変換(特に回転による変換)を理解するには、三角法をある程度理解している必要があります。大変だとは思いますが、仕方ありません。これに加えて、行列と行列代数の知識があると役立つでしょう。
変換について理解できるようになるべく詳しく説明するつもりですが、必要な背景知識についてまで説明することは、このチュートリアルの範囲を超えています。必要な背景知識については、簡単な説明のみを行います。技術的な背景については、前回のレッスンの「Understanding Transforms in Java 2D」や、「Trigonometry」、「Planar transformations」、「Spatial transformations」、および「A little algebra」という記事を参照することをお勧めします(稿末の「参考資料」を参照)。
Java 3Dの可視オブジェクト
まず、Java 3Dを使用して作成した球体を図1に示します。図1の黄色と白色の球体のレンダリング品質は意図的に低く抑えられているため、ファセット(小面)が目立ちます。
![図1 Java 3Dの可視オブジェクト 図1 Java 3Dの可視オブジェクト](http://cz-cdn.shoeisha.jp/static/images/article/2145/java1552a01.jpg)
メッシュを用いた作成
3Dの可視オブジェクトは、通常、ポリゴン(普通は三角形)を相互接続したメッシュを構成し、そのメッシュをスキンで覆うことによって作成されます。図2に、3Dでレンダリングした球体をスキンで完全に覆った例を示します。
![図2 スキンで覆われた状態の3Dレンダリングされた球体 図2 スキンで覆われた状態の3Dレンダリングされた球体](http://cz-cdn.shoeisha.jp/static/images/article/2145/java1552a02.jpg)
メッシュの表示
図3は3Dでレンダリングした同じ球体ですが、スキンが削除された状態です(図2と図3はAliceプログラム開発環境を使用して作成。稿末の「参考資料」を参照)。
![図3 スキンがない状態の3Dレンダリングされた球体 図3 スキンがない状態の3Dレンダリングされた球体](http://cz-cdn.shoeisha.jp/static/images/article/2145/java1552a03.jpg)
図3は、前述の、相互に接続された三角形のメッシュを示しています。
ワイヤーフレーム描画
図3に示すようなメッシュのレンダリングは、「ワイヤーフレーム」描画ともいいます(図3は、Aliceのワイヤーフレームレンダリングです。ほとんどのワイヤーフレーム描画には、図3のように光源を使用して作成される3Dレンダリングはまず含まれません。多くの場合、ワイヤーフレーム描画は、単純に白色の背景に黒色の線で表示されます)。
ビジュアル属性
オブジェクトのさまざまなビジュアル属性(シェーディング、色など)は、個々の三角形を覆うスキン部分に適用される色、明暗度、およびその他の表示要素によって実現されます。たとえば、図2の場合、右上の三角形を覆うスキンは非常に明るいのに対して、左下の三角形を覆うスキンは非常に暗くなっています。この効果を使用することで、3Dレンダリングと呼ばれる視覚的な錯覚が作り出されます。
品質の制御
多くの場合、メッシュを構成する三角形の数は制御可能です。オブジェクトの3Dレンダリングの品質は、より多くの三角形から成るメッシュを構成することによって、ある程度まで向上できます。
たとえば、図1の黄色と白色の球体は、2つの球体の表面のファセットが認識できるように、意図的にそのレンダリング品質が低く抑えられています。この球体のワイヤーフレーム描画を確認すれば、球体を構成する三角形の数が少ないことがわかります。これに対して図2および図3は、多くの三角形を使用して構成されており、その結果、レンダリング品質が向上しています。図2の球体は、図1の黄色と白色の球体よりも、本当の球体のように見えます。
これらの概念は、球体より複雑なビジュアルオブジェクトにも適用されます。図4は、Aliceのアイススケータオブジェクトの「ソリッド」レンダリングと「ワイヤーフレーム」レンダリングを示しています(3Dプログラミングがどのようなものであるかをとりあえず把握するには、筆者のWebページ「Learn to Program using Alice」(稿末の「参考資料」を参照)にアクセスし、そこに掲載されているチュートリアルレッスンを行ってみることをお勧めします)。
![図4 Aliceアイススケータの2種類のレンダリング 図4 Aliceアイススケータの2種類のレンダリング](http://cz-cdn.shoeisha.jp/static/images/article/2145/java1552a04.jpg)
ご覧のとおり、図4のオブジェクトは、相互に接続された数百個の三角形で構成されています。
点とは
点は、3つの座標値(x,y,z)で定義される3D空間内の位置です。xの値は、「原点」を基準としたときのx軸(図2および図3の赤色の線)に沿った点の位置を定義します。yの値は、y軸(図2および図3の緑色の線)に沿った点の位置を定義します。zの値は、z軸(図2および図3の青色の線)に沿った点の位置を定義します。x、y、zの各軸は、3D空間の「原点」で交差します。図2および図3の球体は、その原点を中心にして配置されています。
図3および図4において、三角形が相互に接続する位置を頂点と呼びます。各頂点の位置は、点とその3つの座標値で指定されます。一般的に言って、3Dオブジェクトに適用される変換は、各頂点を指定する座標値の変更を伴います。
x軸、y軸、z軸
座標軸は、グラフに表示されることもあれば、表示されないこともあります(図2および図3では、意図的に座標軸を表示しました)。しかし、座標軸が表示されていない場合であっても、座標軸は存在するものとみなされます。
x軸は、通常、水平方向の軸で、左から右に向かって正の値を取ります。y軸は、通常、垂直方向の軸で、下から上に向かって正の値を取ります(幸いなことに、Java 2Dの場合とは異なり、Java 3Dのy軸は下から上が正の方向です)。z軸は、通常、背面から前面に向かって、つまり、画面を突き出てユーザーに向かうものと見なされます。Java 3Dでは、ユーザーに向かう方向がzの正の方向です。
原点の位置
Java 3Dでは、原点はユニバース(空間)の中心にあります。ViewingPlatformを操作することによって画面上での原点の表示位置を変更することはできますが、原点は通常、このプログラムでユニバースを表示するために使用されるCanvasオブジェクトの中心にあります。
ベクトルとは
Wikipedia(稿末の「参考資料」を参照)によると、ベクトルにはさまざまな種類があります。「空間ベクトル」は、大きさと方向で定義されるオブジェクトです。これに対して「スカラー」は、大きさのみを持つオブジェクトです。
また、Wikipediaによると、ベクトルという用語は、「行ベクトル」または「列ベクトル」という、1次元の方向行列を表すのにも使用されます。このレッスンでは、ベクトルという用語を、両方の意味(「空間」および「行列」)で使用します。用語がどちらの意味で使用されているかは、説明のコンテキストから明らかです。
変換とは
このレッスンで使用する「変換」という用語は、オブジェクトを定義するすべての点の座標値を、異なる座標値に変換する操作のことを指します。新しい座標値で定義されるオブジェクトは、異なるサイズであったり(拡大縮小)、異なる場所であったり(平行移動)、異なる回転であったり(回転)、いずれかの次元で押しつぶされたようになっていたり、いずれかの軸に対して反転する場合もありますが、多くの場合、元のオブジェクトを表現したものであると認識できます。
アフィン変換とは
このレッスンで使用する変換は、実際にはアフィン変換です。Java 3Dのドキュメントには、次のように記載されています。
アフィン行列では、平行移動、回転、射影、異方性拡大縮小、およびシアーを行うことができます。直線は直線のままであり、平行線は平行のままですが、直線が交差する角度は変化できます。変換をアフィンとして分類するには、4番目の行が[0, 0, 0, 1]であることが必要です。