OpenGL講習 インデックスに戻る

内容

実習2までは2次元上への描画を行っていましたが、今回からはいよいよ3次元空間上に頂点を指定し、ポリゴンを描画します。
まずは三角形ポリゴンを1枚描画します。

Sample03.jpg

ソースダウンロード

http://dl.getdropbox.com/u/235401/OpenGL/Sample03.zip

解説

3Dの初期化

 
int WINAPI WinMain( ... )
{
	...
	glutDisplayFunc( Render );
	glutReshapeFunc( Resize );
	...
}
 

3D初期化の下準備として、コールバック登録を1件追加します。
WinMain関数で初期化を行っていた部分の、glutDisplayFuncの次に新たに1行を付け足します。
ウィンドウサイズ変更のコールバックを登録し、このタイミングで3Dビューポート等の初期化を行うことにします。

 
void Resize( int width, int height )
{
	glViewport( 0, 0, width, height );
 
	glLoadIdentity();
 
	gluPerspective(
		30.0,
		(double) width / height,
		1.0,
		100.0 );
	glTranslated( 0.0, 0.0, -5.0 );
}
 

ウィンドウサイズ変更時に呼ばれる関数内で、3Dビューポート等の初期化を行います。
ここも基本そういうものということで華麗にスルーしてもらえばいいのですが、一応軽く触れておきますね。

 
glViewport( 0, 0, width, height );
 

ここではビューポートを指定しています。
ビューポートとは、ざっくり言ってしまえばクライアント領域のどの部分にレンダリングを行うか、といったものだと思ってください。
ここではクライアント領域全体をビューポートとしています。
Resize関数の引数がクライアント領域のサイズとなっているのですね。
ちなみにここで指定する座標系は、クライアント領域左下が原点になっているので注意してください。

 
glLoadIdentity();
 

行列を初期化しています。
これは説明しだすと長くなるので、スルーの方向で。

 
gluPerspective(
	30.0,
	(double) width / height,
	1.0,
	100.0 );
 

透視投影という手法で投影方法を初期化しています。
第1引数には、縦方向の視野角が30度であるということを指定しています。
続いてビューポートの縦横比を指定します。これにより、横方向の視野角も計算で求まりますね。
第3~第4引数では、レンダリングを行う最短距離と最長距離を指定します。この例では1.0より近いポリゴンや100.0より遠いポリゴンは表示されません。

投影や上の行列の考え方については、詳細を別ページでまとめる予定です。

描画

 
void Render()
{
	glClear( GL_COLOR_BUFFER_BIT );
 
	glBegin( GL_TRIANGLES );
	{
		glColor3ub( 255, 0, 0 );
		glVertex3d( 0, 0, 1 );
		glColor3ub( 0, 0, 255 );
		glVertex3d( -1, 0.9, 0.5 );
		glVertex3d( 1, 0.9, 1 );
	}
	glEnd();
 
	glutSwapBuffers();
}
 

2次元だったときとほとんど差がないように見えますが、頂点指定に使う関数がglVertex3dに変わっています。
まさにこれが3次元。
(X, Y)だった引数が(X, Y, Z)に差し替わっています。


添付ファイル: fileSample03.jpg 1243件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-10-24 (日) 17:14:24 (2523d)