English
SGL User's ManualPROGRAMMER'S TUTORIAL
戻る進む
PROGRAMMER'S TUTORIAL

6.カメラ


本章では、カメラの定義とその操作法を解説します。
カメラとは、3D空間内のどこから、どのように空間を見渡すかを定義するもので、 ビューイング変換とも呼ばれます。カメラは、視点・視線・アングル角の3つの要素から成り立っており、 この3つの要素を変化させることで、空間内を自由に投影面に描画することができます。

6-1. カメラの定義と設定

 SGLにおけるカメラの定義と設定には次の2種類が考えられます。

  1. 視点を原点、視線をZ軸に固定し、オブジェクトを移動させ見たい映像を得る
  2. オブジェクト側を固定とし、視点及び視線を移動させて見たい映像を得る

1)を実現するには、空間内に存在するオブジェクト全てにモデリング変換を加える必要があります。
2)を実現するには、ライブラリ関数“slLookAt”を使用してください。

ただし、2)の場合においても、内部的には1)の方法を使用し、見た目カメラが空間内を自由に移動しているように見えるに過ぎません。

より細かいカメラ設定を行いたい場合は(ここでは解説しませんが)、1)の方法を使用するようにしてください。処理速度の観点からも1)の方がより効率よく視点及び視線に変更を加える事ができます。

6-2. “slLookAt”を用いたカメラの設定

 SGLでは、カメラの設定を簡便に行うためにライブラリ関数“slLookAt”をサポートしています。

【void slLookAt ( FIXED *camera , FIXED *target , ANGLE angz ) ;】
 この関数は、3Dグラフィックスにおけるカメラ(どの方向を視野に納めるか)を制御します。 パラメータとして、カメラのXYZ座標値(3次元配列)、視線方向を決定するターゲットのXYZ座標値(3次元配列)、視線方向に対するカメラの回転角度、の3つを保持しています。
関数“slPerspective”及び“slWindow”と共に用いることで、3Dグラフィックスの描画領域を完全に決定することができます。

図6-1 カメラのイメージモデル

 ここで、アングルについての詳細を解説します。アングルとは、簡単に言うと、 視線に対してカメラをどの角度で構えるのかということになります。アングルの値を変えることにより、 同一視線に対する異なった映像を描画することができます。

<図6-2 アングルによる映像の差異>
a)カメラの上方をY軸に合わせた場合 b)カメラの上方をY軸に対して−45度傾けた場合
(Z軸回転で−45度)

注)
 カメラ位置及びターゲット座標、オブジェクトの状態は、a)b)共にまったく同じものとします。

6-3. 実際のカメラの動作

 次のプログラムリストは、カメラのパラメータを変え、3D空間内を移動させた場合 の映像の変化を示すものです。空間内には、各面毎にポリゴン色を変えた立方体を、 カメラのターゲット座標からずらして配置してあります。

<リスト6-1 sample_6_3:カメラの移動
/*----------------------------------------------------------------------*/
/*	Camera Action							*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"

#define		POS_Z		100.0

typedef struct cam{
	FIXED	pos[XYZ];
	FIXED	target[XYZ];
	ANGLE	ang[XYZ];
} CAMERA;

extern PDATA PD_CUBE;

static FIXED cubepos[][3] = {
	POStoFIXED( 20 , 0 , 270) ,
	POStoFIXED(-70 , 0 , 270) ,
	POStoFIXED( 40 , 0 , 350) ,
	POStoFIXED(-60 , 0 , 370)
};

void dispCube(FIXED pos[XYZ])
{
	slPushMatrix();
	{
		slTranslate(pos[X] , pos[Y] , pos[Z]);
		slPutPolygon(&PD_CUBE);
	}
	slPopMatrix();
}

void ss_main(void)
{
	static ANGLE	ang[XYZ];
	static CAMERA	cmbuf;
	static ANGLE	tmp = DEGtoANG(0.0);

	slInitSystem(TV_320x224,NULL,1);
	slPrint("Sample program 6.3" , slLocate(9,2));

	cmbuf.ang[X] = cmbuf.ang[Y] = cmbuf.ang[Z] = DEGtoANG(0.0);
	cmbuf.target[X] = cmbuf.target[Y] = toFIXED(0.0);
	cmbuf.target[Z] = toFIXED(320.0);
	cmbuf.pos[X] = toFIXED(  0.0);
	cmbuf.pos[Y] = toFIXED(-20.0);
	cmbuf.pos[Z] = toFIXED(  0.0);

	while(-1){
		slUnitMatrix(CURRENT);
		slLookAt(cmbuf.pos , cmbuf.target , cmbuf.ang[Z]);
		tmp += DEGtoANG(2.0);
		cmbuf.pos[X] = POS_Z * slCos(tmp);
		cmbuf.pos[Z] = POS_Z * slSin(tmp);

		dispCube(cubepos[0]);
		dispCube(cubepos[1]);
		dispCube(cubepos[2]);
		dispCube(cubepos[3]);

		slSynch();
	}
}

フロー6-1 sample_6_3:カメラの移動フローチャート

付記 本章に登場したSGLライブラリ関数

 本章では、次表の関数を解説しました。

表6-1 本章に登場したSGLライブラリ関数
 関数型 
 関数名 
 パラメータ 
      機    能      
voidslLookAt FIXED *camera,*target,ANGLE angz視線マトリクスをカレントマトリクスに掛ける


戻る進む
SGL User's ManualPROGRAMMER'S TUTORIAL
Copyright SEGA ENTERPRISES, LTD., 1997