Japanese | English | Korean

Samples

投影法

ここでは投影法について解説します。
MascotCapsuleでは平行投影と透視投影の2種類の投影法が用意されています。
カメラの投影法の設定はGraphics3Dインターフェース内のメソッドを用いて行います。ここではSample7を用いて投影法の設定について解説します。

目次






1. 平行投影(Parallel View)

平行投影は、ワールドにある物体をそのままスクリーン上に投影する投影法です。平行投影ではカメラ座標系における視体積は直方体となります。したがって同じ大きさのものは、物体位置の遠近に関係なく同じ大きさで投影されます。また平行投影の場合、カメラからニアクリップ面の距離は0、ファークリップ面の距離は32767で固定となります。

平行投影を設定するには、Graphics3DクラスのsetParallelView( int width, int height ) メソッドを使います。widthとheightはそれぞれ投影面の幅と高さです。

以下はサンプルコード内の平行投影を設定している部分です。

// Sample07Canvas.java 117行
// Graphics3D オブジェクトの取得
Graphics3D g3 = ( Graphics3D )g;

・・・

// Sample07Canvas.java 128行
// 平行投影の設定
g3.setParallelView( getWidth() / 16, getHeight() / 16 );

getWidthとgetHeightはそれぞれフレームの幅と高さを取得するメソッドです。サンプルでは、それぞれフレームの投影面の幅と高さを16分の1の大きさに設定しています。


平行投影




2. 透視投影(Perspective View)

透視投影はカメラ座標系における視体積を錐台とすることで、ワールドにある物体をカメラから近くにあるものは大きく、遠くにあるものは小さく描画することで遠近感を出す投影法です。

透視投影を設定するにはGraphics3DクラスのsetPerspectiveView( float zNear, float zFar, float angle )メソッドを使います。ここでzNear・zFarはそれぞれカメラからニアクリップ面とファークリップ面までの距離、angleは画角を表します。スクリーン上にはこれら3つの変数から作られる視錐台内にあるもののみが描画されます。画角のかわりにニアクリップ面における投影面の幅と高さを指定することで視体積を設定することもできます。その場合はsetPerspectiveView( float zNear, float zFar, int width, int height )とします。

透視投影のレンダリングの精度はニアクリップ面からファークリップ面までの距離に依存します。この距離を縮めたほうがレンダリング精度は良くなります。また、ニアクリップの値が極端に小さい場合桁落ちによって精度が落ちる場合がありますので、ニアクリップの値は大きめにしておく(1.0以上)ことを推奨します。

以下はサンプルコード内の透視投影を設定している部分です。画角を指定する方法によって透視投影を設定しています。

// Sample07Canvas.java 123行
// 透視投影の設定(画角を指定する方法)
g3.setPerspectiveView( 1.0f, 50.0f, 45.0f );

透視投影