コンピュータグラフィックス

担当 : 藤本 忠博


OpenGLのプログラミング演習

■ OpenGLの特徴

OpenGLは次の特徴を持つライブラリです. 通常のプログラムとイベント駆動型プログラムの違いは以下の通りです.

通常のプログラム

イベント駆動型プログラム



■ 演習環境について

はじめに,以下のように,自分のホームディレクトリの下に演習用のディレクトリ cg を作成してください.(ディレクトリ名は cg でなくてもよいです.) このディレクトリの下で演習を行ってください.

$ mkdir cg
$ cd cg

■ コンパイル&実行について

ソースコードのファイル名が prog.c の場合には,コマンドライン上で以下のようにしてコンパイル&実行してください.

$ cc prog.c -lglut -lGLU -lGL -o prog
$ ./prog

数値計算のライブラリを使う場合には,オプション -lm を付けてください.

$ cc prog.c -lglut -lGLU -lGL -lm -o prog
$ ./prog

■ プログラミング演習

この演習では,次のサイトを用います. OpenGLを学ぶ初心者にとって非常に分かりやすいサイトです. 床井先生からは了解を得ています. このサイトでは,演習用のプログラムを少しずつ拡張していくことで演習を進めていきます. 実際にプログラムをコンパイル&実行してみて,正しい表示ができるかを確かめてください.使用するエディタとCコンパイラは何でもよいです.

※ サイトに掲載されているプログラムをすべて打ち込むのは大変なので,適宜,サイトのプログラムをエディタにマウスでコピペ(コピー&ペースト)して行ってください.もちろん,すべてを打ち込んでもよいですが...

■ OpenGLにおける座標変換

上記のサイトの「9.1 図形を動かす」で説明がありますが,座標変換についてまとめましたので,参考にしてください.ビューイングパイプラインについては,教科書の2-4節にも書かれています.

ビューイングパイプライン

OpenGLにおける座標変換の書き方

プログラムの例

#include <stdlib.h>
#include <GL/glut.h>

/* 立方体の頂点の3D座標 */
GLdouble vertex[][3] = {
    { -1.0, -1.0, -1.0 },
    {  1.0, -1.0, -1.0 },
    {  1.0,  1.0, -1.0 },
    { -1.0,  1.0, -1.0 },
    { -1.0, -1.0,  1.0 },
    {  1.0, -1.0,  1.0 },
    {  1.0,  1.0,  1.0 },
    { -1.0,  1.0,  1.0 }
};

/* 立方体の面を構成する頂点番号 */
int face[][4] = {
    { 0, 1, 2, 3 },
    { 1, 5, 6, 2 },
    { 5, 4, 7, 6 },
    { 4, 0, 3, 7 },
    { 4, 5, 1, 0 },
    { 3, 2, 6, 7 }
};

/* 立方体の面の色 */
GLdouble color[][3] = {
    { 1.0, 0.0, 0.0 },
    { 0.0, 1.0, 0.0 },
    { 0.0, 0.0, 1.0 },
    { 1.0, 1.0, 0.0 },
    { 1.0, 0.0, 1.0 },
    { 0.0, 1.0, 1.0 }
};

void resize( int w, int h )
{
    /* ビューポート変換 */
    glViewport( 0, 0, w, h );

    /* 変換行列の設定モード → 投影変換 */
    glMatrixMode( GL_PROJECTION );

    /* 投影変換行列の初期化(単位行列にする) */
    glLoadIdentity();

    /* 投影変換(透視投影)の設定 */
    gluPerspective( 30.0, ( (double)w / (double)h ), 1.0, 100.0 );

    /* 変換行列の設定モード → モデルビュー変換
       モデルビュー変換:モデリング変換,視野変換(ビューイング変換) */
    glMatrixMode( GL_MODELVIEW );
}

void display( void )
{
    int i, j;

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    /* モデルビュー変換行列の初期化(単位行列にする)
       モデルビュー変換:モデリング変換,視野変換(ビューイング変換) */
    glLoadIdentity();

    /* 視野変換(ビューイング変換)の設定 */
    gluLookAt( 0.0, 6.0, 10.0,   /* 視点位置 */
               0.0, 0.0, 0.0,    /* 注目位置 */
               0.0, 1.0, 0.0 );  /* 上向きベクトル */

    /* モデリング変換の設定 */
    /* モデルの平行移動 */
    glTranslated( 0.0, 0.0, 0.0 );
    /* モデルの回転 */
    glRotated( 30.0, 0.0, 1.0, 0.0 );
    /* モデルの拡大・縮小 */
    glScaled( 1.0, 1.5, 2.0 );

    /* モデルの描画 */
    glBegin( GL_QUADS );
    for( j = 0; j < 6; j++ ) {
        glColor3dv( color[j] );
        for( i = 0; i < 4; i++ ) {
            glVertex3dv( vertex[face[j][i]] );
        }
    }
    glEnd();

    glFlush();
}

void init( void )
{
    glClearColor( 1.0, 1.0, 1.0, 1.0 );
    glEnable( GL_DEPTH_TEST );
}

int main( int argc, char *argv[] )
{
    glutInitWindowPosition( 100, 100 );
    glutInitWindowSize( 400, 400 );
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH );
    glutCreateWindow( argv[0] );
    glutReshapeFunc( resize );
    glutDisplayFunc( display );
    init();
    glutMainLoop();
    return( 0 );
}

■ 最終課題提出用のディレクトリについて

最終課題提出用のディレクトリは,セキュリティ上の安全のため,授業の時間中に作成してもらうことにします.他の時間には作成できないようにします.

■ 過去の最終課題の作品

過去の最終課題で提出された作品です.参考にしてください.



■ 最終課題

OpenGLプログラムでCG作品を作成する.2Dモデル,3Dモデル,ゲーム,アニメーションなど,何でもよい. 3Dモデルの場合,視点位置を変えたり,3Dモデルを動かしたりして,3Dモデルの全体が見えるようにすること(せっかく3Dモデルを作成しても,後ろ側も含めた全体が見えなければ,適切な評価が難しいので).全体を見せる方法は,マウスやキーボードの操作で実現してもよいし,アニメーションで実現してもよい.

最終課題は授業の時間だけでは終わらないと思うので,授業時間以外の時間も取り組んでください.

■ 評価の観点

■ 提出物

■ 提出方法

事前に作成した最終課題提出用のディレクトリに以下のように提出してください.

授業アンケート(最終日に実施)