Japanese | English | Korean

Samples

投影法

ここでは投影法について解説します。
MascotCapsuleでは平行投影と透視投影の2種類の投影法が用意されています。

目次






1. 平行投影(Parallel View)

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

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


平行投影



2. 透視投影(Perspective View)

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

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

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


透視投影


3. サンプルコード

以下はサンプルプログラム内で投影法の切り替えを行っている部分です。
ソフトキーを押すことで、投影法を切り替えることができます。

/**
  * commandAction() メソッド
  * ソフトキー押下時処理(描画パラメータ変更)
  */
public void commandAction( Command c, Displayable d ){
String label = c.getLabel();

/* 投影方法変更 */
if( label.equals( commandLabels[0] ) ){
layout.setPerspective( 1024, 10000, 4096 * 30 / 360 );
}else if( label.equals( commandLabels[1] ) ){
layout.setParallelSize(
getWidth() * 4 , getHeight() * 4 );
}
}