//コンパイル: gcc *.c -lglut -lGLU -lGL -lm
// -----------------------------------------------------------
#include #include #include /*立方体の座標*/ GLdouble vertex[][3] = { { 0.5, 0.5, 0.5 }, { 1.0, 0.5, 0.5 }, { 1.0, 1.0, 0.5 }, { 0.5, 1.0, 0.5 }, { 0.5, 0.5, 1.0 }, { 1.0, 0.5, 1.0 }, { 1.0, 1.0, 1.0 }, { 0.5, 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 normal[][3] = { { 0.0, 0.0,-1.0 }, { 1.0, 0.0, 0.0 }, { 0.0, 0.0, 1.0 }, {-1.0, 0.0, 0.0 }, { 0.0,-1.0, 0.0 }, { 0.0, 1.0, 0.0 } }; /*光源*/ GLfloat light0pos[] = { 0.0, 3.0, 5.0, 1.0 }; GLfloat light1pos[] = { 5.0, 3.0, 0.0, 1.0 }; GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 }; GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 }; GLfloat blue[] = { 0.2, 0.2, 0.8, 1.0 }; /*テクスチャ*/ #define TEXWIDTH 512 /* テクスチャの幅    */ #define TEXHEIGHT 512 /* テクスチャの高さ   */ static GLubyte texture[TEXHEIGHT][TEXWIDTH][4]; void initTexture(void) { FILE *fp; int x, z; /* texture file open */ if((fp=fopen("test.tga", "rb"))==NULL){ fprintf(stderr, "texture file cannot open\n"); return; } fseek(fp, 18, SEEK_SET); for(x=0;x= 360) r = 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); glLoadIdentity(); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); } void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) { /* アニメーション開始 */ glutIdleFunc(idle); } else { /* アニメーション停止 */ glutIdleFunc(0); } break; case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN) { /* コマ送り (1ステップだけ進める) */ glutPostRedisplay(); } break; default: break; } } void keyboard(unsigned char key, int x, int y) { switch (key) { case 'q': case 'Q': case '\033': /* '\033' は ESC の ASCII コード */ exit(0); default: break; } } void init(void) { glClearColor(1.0, 1.0, 1.0, 1.0); initTexture(); /*テクスチャマッピングの読み込みに使う配列*/ /* テクスチャ画像はバイト単位に詰め込まれている */ glPixelStorei(GL_UNPACK_ALIGNMENT, 1); /* テクスチャの割り当て */ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEXWIDTH, TEXHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, texture); /* テクスチャを拡大・縮小する方法の指定 */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glEnable(GL_DEPTH_TEST); //デプスバッフ //カリング glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); //陰影付け glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glLightfv(GL_LIGHT1, GL_DIFFUSE, green); //光源のパラメータを設定 glLightfv(GL_LIGHT1, GL_SPECULAR, green); } int main(int argc, char *argv[]) { glutInitWindowSize(720, 480); glutInit(&argc, argv);//環境を初期化 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);//ディスプレイの表示モード glutCreateWindow(argv[0]);//ウィンドを開く glutDisplayFunc(display);//ウィンド内に描写する glutReshapeFunc(resize); //ウィンドがリサイズされたときの実行関数のポインタ glutMouseFunc(mouse);//マウスでのイベント glutKeyboardFunc(keyboard);//キーボードでのイベント init(); glutMainLoop();//イベント待ち無限ループ return 0; }