ページ

2014年7月21日月曜日

Cent OSでOpenGL 7 - 3Dプログラミング -

いよいよ、OpenGLで3Dプログラミングを開始。


以下サイトを参考
http://seesaawiki.jp/w/mikk_ni3_92/d/%B4%F0%CB%DC%CA%D403

・3D描画の流れ

  1. ビューポートの設定
  2. 視体積設定
  3. 視点の設定
これらの設定をウィンドウズ変更時のイベントで行う。

void glutReshapeFunc(void (*func)( int width, int height))
機能
GLUTのウィンドウの大きさが変ったときや、移動したときに呼び出されるコールバック関数を登録する。
この関数を使用しない場合、funcにNULLを設定した場合は、デフォルトの動作として、glViewport(0, 0, width, height)を呼び出す。
引数
funcウィンドウのサイズが変更されたときに呼び出されるコールバック関数。ウィンドウの幅と高さを表す2つのint型の引数をとる。
戻り値
なし

1. ビューポートの設定

glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
x, y ・・・左隅(左下)の座標
width・・・幅
height・・・高さ


2. 視体積(視野)の設定

どの範囲まで視野に入れるか?

glMatrixMode(GL_PROJECTION)
まずは視体積の設定を有効にする。

次に投影方法の設定
・透視投影
・並行投影


透視投影には「glFrustum」関数と「glPerspective」関数がある。
glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble znear, GLdoble zfar)
「left」、「right」:「左」、「右」の垂直座標を指定
「bottom」、「top」:「下」、「上」の水平座標を指定
「znear」、「zfar」:「手前」、「奥行き」を指定

gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
「fovy」:「y座標」、すなわち「縦方向の視野角」を指定
「sapect」:「視野角」に対する、「比率」で「水平方向の視野角」を決定
「zNear」、「zFar」:「手前」、「奥行き」を指定


並行投影
視点に影響されず、常に正しいサイズで表示される。2次元で画像表示等に使用される。
glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zbear, GLdoble zfar)
「引数」については、「glFrustum()関数」と同じ

3. 視点の設定

視点の位置設定には「gluLookAt」関数を使う
gluLookAt(GLdouble ex,GLdouble ey,GLdouble ez,
     GLdouble cx,GLdouble cy,GLdouble cz,
     GLdouble ux,GLdouble uy,GLdouble uz,)


「(ex,ey,ez)」:「視点の位置」
「(cx,cy,cz)」:「見たいもの位置」
「(ux,uy,uz)」:画像のどこが「上」なのかを指定(ベクトル)

void reshape(int w, int h)
{
  glViewport(0, 0, w, h);

  glMatrixMode(GL_PROJECTION); // モードの切り替え
  glLoadIdentity();
  gluPerspective(45.0, (double)w / (double)h, 0.1, 100.0);

  glMatrixMode(GL_MODELVIEW); // モードを元に戻す
  glLoadIdentity();
  gluLookAt(0.5, 1.5, 2.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

以下サイトのサンプルコードを実行

コンパイルgcc -o sample sample.c -lglut -lGLU -lGL -lm



0 件のコメント:

コメントを投稿