イメージシンセシス トップページ

OpenGLの演習

■ 参考ページ

■ OpenGLの特徴

通常のプログラム

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



■ OpenGLにおける座標変換

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

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における座標変換) (Visual Studio 2010 で作成)

■ 実行方法

Unixの場合

Windowsの場合