M3G では平行投影と透視投影の2種類の投影法が用意されています。 カメラの投影法の設定は Camera クラスのメソッドを用いて行います。ここではその設定方法について解説します。
1. 平行投影 ( Parallel View )
平行投影は、ワールドにある物体をそのままスクリーン上に投影する投影法です。平行投影ではカメラ座標系における視体積は直方体となります。したがって同じ大きさのものは、物体位置の遠近に関係なく同じ大きさで投影されます。
平行投影を設定するには、 Camera クラスのsetParallel ( float fovy, float aspectRatio, float near, float far ) メソッドを使います。ここでメソッド内の引数 fovy はカメラ座標系における視体積の高さ、 aspectRatio はビューポートのアスペクト比(横対縦の比)、 near はカメラからニアクリップ面までの距離、 far はカメラからファークリップ面までの距離をそれぞれ表しています。
以下はサンプルコード内の平行投影を設定している部分です。
* camProject [ 1 ] = 1.0
* camProject [ 2 ] = 1.3256 …
* camProject [ 3 ] = 60.244 …
*
*/
/* カメラ */
private Camera camera = null;
( 中略 )
/* World オブジェクトから Camera オブジェクトを取得 */
camera = ( Camera ) myWorld.find ( 18 );
camera.getProjection ( camProject );
( 中略 )
camera.setParallel ( getHeight() / 20.f, camProject [ 1 ] , camProject [ 2 ] , camProject [ 3 ] );
getHeight() メソッドはフレームの高さを取得するメソッドです。サンプルではカメラ座標系における視体積の高さを、フレームの20分の1に設定しています。

平行投影
2. 透視投影 ( Perspective View )
透視投影はカメラ座標系における視体積を錐台とすることで、ワールドにある物体をカメラから近くにあるものは大きく、遠くにあるものは小さく描画することで遠近感を出す投影法です。
透視投影を設定するには Camera クラスのsetPerspective ( float fovy, float aspectRatio, float near, float far ) メソッドを使います。ここで、 fovy は画角を、 aspectRatio は平行投影同様ビューポートのアスペクト比(横縦比)を、 near はカメラからニアクリップ面までの距離、 far はカメラからファークリップ面までの距離をそれぞれ表しています。スクリーン上にはこれら4つの変数から作られる視錐台内にあるもののみが描画されます。
透視投影のレンダリングの精度はニアクリップ面からファークリップ面までの距離に依存します。この距離を縮めたほうがレンダリングの精度は良くなります。また、ニアクリップの値が極端に小さい場合は桁落ちによって精度が落ちる場合がありますので、ニアクリップの値は大きめにしておく ( 1.0以上 ) ことを推奨します。
以下はサンプルコード内の透視投影を設定している部分です。
* camProject [ 0 ] = 45.0
*
*/
camera.setPerspective ( camProject [ 0 ] , camProject [ 1 ] , camProject [ 2 ] , camProject [ 3 ] );

透視投影

